Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/20: Рейтинг темы: голосов - 20, средняя оценка - 4.80
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
1

Создание меню

11.12.2008, 12:06. Показов 4099. Ответов 4
Метки нет (Все метки)

Подскажите пожалуйста, как создать меню а то в книге бестолково написано 2 час мучаюсь не могу создать ((
Имеется код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void OnPaint(HWND);
void OnDestroy(HWND);
 
int WINAPI WinMain(HINSTANCE hi, HINSTANCE, LPSTR, int)
{
    MSG msg;
    WNDCLASS wc;
    char classn[] = "MyClass";
    memset(&wc,0,sizeof(wc));
    wc.hInstance = hi;
    wc.lpszClassName = classn;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.lpfnWndProc = WndProc;
    wc.hbrBackground = GetStockBrush( LTGRAY_BRUSH );
    [COLOR="Red"]wc.lpszMenuName = "My";[/COLOR]
    RegisterClass(&wc);
 
    HWND hwnd = CreateWindow(classn,"3a4et",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hi,NULL);
    ShowWindow(hwnd, SW_SHOWNORMAL);
 
    while( GetMessage(&msg, NULL, 0,0) )
        DispatchMessage(&msg);
 
    return 0;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM w, LPARAM l)
{
    switch(msg)
    {
        HANDLE_MSG(hwnd, WM_PAINT, OnPaint ); 
        HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy); 
        default: return DefWindowProc(hwnd,msg,w,l);
    }
}
 
void OnDestroy(HWND)
{
    PostQuitMessage(0);
}
 
void OnPaint(HWND hwnd)
{
    PAINTSTRUCT ps;
    RECT r;
    HDC hdc = BeginPaint(hwnd, &ps);
    GetClientRect(hwnd,&r);
    FillRect(hdc, &r, CreateSolidBrush(RGB(128,0,0)));
    //Rectangle(hdc,0,0,300,220);
    EndPaint(hwnd,&ps);
}
Далее выбираю Insert -> Resource(Ctr+R) в списке выбираю Меню - New
Жму сохранить проект оно мне предлогет сохранить Script1 Сохраняю его + оно создает еще 1 файл в итоге имеется
Script1.rc
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
 
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
 
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
 
/////////////////////////////////////////////////////////////////////////////
// Russian resources
 
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //_WIN32
 
/////////////////////////////////////////////////////////////////////////////
//
// Menus
//
 
My MENU DISCARDABLE 
BEGIN
    POPUP "File"
    BEGIN
        MENUITEM "Exit",                        ID_FILE_EXIT
    END
    POPUP "View2"
    BEGIN
        MENUITEM "Cut",                         ID_VIEW2_CUT
    END
END
 
 
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
 
1 TEXTINCLUDE DISCARDABLE 
BEGIN
    "resource.h\0"
END
 
2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END
 
3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "\r\n"
    "\0"
END
 
#endif    // APSTUDIO_INVOKED
 
#endif    // Russian resources
/////////////////////////////////////////////////////////////////////////////
 
 
 
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
 
 
/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED
и
resource.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Script1.rc
//
#define My                       101
#define ID_FILE_EXIT                    40001
#define ID_VIEW2_CUT                    40002
 
// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40003
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif
Теперь возвращаясь к самой программе дописываем Имя меню в ВНДКЛАСС и по идее должно отображать?! По крайней мере в книге так написано. Но почему-то у меня ничего не отображает?! Может я что не так делаю? Или можно сделать по легче? Подскажите пожалуйста.
Кстати можно ли создать файл .rc вручную из текстовика а потом в пустой файл записать только структуру меню без всего остального?
C++
1
2
3
4
5
6
7
8
9
10
11
My MENU DISCARDABLE 
BEGIN
    POPUP "File"
    BEGIN
        MENUITEM "Exit",                        ID_FILE_EXIT
    END
    POPUP "View2"
    BEGIN
        MENUITEM "Cut",                         ID_VIEW2_CUT
    END
END
--------------------------------------------------
Вот еще пробовал Project - Add To Project - New - Resource Script - New.
Появляется новая иконка в Docking View жму на новый скрипт добавляю сново новое меню дальше делаю как в 1 раз и как всегда ничего не выводит((((
Чот за бред?

Добавлено через 15 часов 10 минут 7 секунд
Замечательно... Ели нарыл в нэте и все же меню заработало!
C++
1
wc.lpszMenuName = (LPCSTR)MyMenu;
Объясните почему тогда в книге написано что можно писать и имя меню в кавычках и что оно само найдет это имя и установит нужный адрес? В книги же так в кавычках и написано имя. Что за...
??
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2008, 12:06
Ответы с готовыми решениями:

Создание меню
каким образом можно вручную создать меню на пустом диалоговом окне в Visual C++? программирую в...

Создание меню
Я вот дошол до создания меню и возникли несколько вопросов:Как создать плавающее меню методом...

создание меню
подскажите пожалуйста кусок программы чтобы происходил вывод меню на экран типа: 1.Добавить объект...

Создание меню
Простейшая программа,создающая меню,одним из элементов меню должен быть рисунок,но при добавлении...

4
21 / 20 / 6
Регистрация: 03.12.2008
Сообщений: 85
11.12.2008, 20:22 2
Код
wc.lpszMenuName = "My";
тут компилятор должен ругаться на несоответствие типов. я с такой бедой столкнулся при переходе с VС++ 6.0 на 2008. Действительно, и имя меню и окна и чего угодно раньше можно было писать в кавычках, но теперь вот нельзя... Насколько я понял, дело в переходе всего и вся на юникод, а символ в юникоде и в ASCII занимают разный объем памяти.

а lpszMenuName имеет тип LPCTSTR, который определяется как
Код
An LPCWSTR if UNICODE is defined, an LPCSTR otherwise. 

This type is declared in WinNT.h as follows:


#ifdef UNICODE
 typedef LPCWSTR LPCTSTR; 
#else
 typedef LPCSTR LPCTSTR;
#endif
(с)MSDN
то бишь раньше он был просто char, а сейчас wchar_t.. как-то так)
з.ы.
а вот такая штука
Код
wc.lpszMenuName = L"My";
вроде как работает.

Добавлено через 1 минуту 4 секунды
забыл спросить... Визуал Студия у вас какая?)
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
12.12.2008, 01:39  [ТС] 3
Хоть кто-то отозвался, спасибо) А то я думал эту книгу уже халтурщики писали))
У меня 6 студия. И кстати этот код
Код
wc.lpszMenuName = L"My";
Вызывает бурные овации
--------------------Configuration: eight - Win32 Debug--------------------
Compiling...
eight.cpp
D:\Visual Studio\VSC++\MyProjects\eight\eight.cpp(21) : error C2440: '=' : cannot convert from 'unsigned short [7]' to 'const char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

eight.exe - 1 error(s), 0 warning(s)
0
21 / 20 / 6
Регистрация: 03.12.2008
Сообщений: 85
12.12.2008, 03:34 4
Шестая? тогда то что я писал выше можно не читать...
у меня где-то была рабочая прога с менюшкой на 6ой С++, сейчас глянем как там что)

Добавлено через 11 минут 20 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//cpp файл, тут инклюды и прочая
char lpszTitleName[]="Бла бла бла";
 
CMainWin::CMainWin(){
    Create(0, lpszTitleName,
        WS_OVERLAPPEDWINDOW, 
        rectDefault, NULL, MAKEINTRESOURCE(IDR_MAINFRAME));
    LoadAccelTable("MyAccel");
///...
    InitCommonControls();
}
 
BOOL CApp::InitInstance() {
    m_pMainWnd=new CMainWin;
    m_pMainWnd->ShowWindow(m_nCmdShow);
    return TRUE;
}
 
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)
    ON_COMMAND(ID_SAVECUT, OnSaveCut)
    ON_COMMAND(ID_FILE_OPEN, OnOpen)
    ON_COMMAND(ID_FILE_EXIT, OnExit)
    ON_COMMAND(ID_ADD, OnAdd)
    ON_COMMAND(ID_NEW, OnNew)
    ON_COMMAND(ID_START, OnStart)
    ON_WM_LBUTTONDOWN()
    ON_WM_MOUSEMOVE()
    ON_WM_LBUTTONUP()
    ON_WM_RBUTTONDOWN()
    ON_WM_CREATE()
    ON_WM_SIZE()
    ON_WM_PAINT()
END_MESSAGE_MAP()
 
static UINT Indicators[]={
    ID_SEPARATOR,
    ID_INDICATOR_XY,
    ID_INDICATOR_RGB
};
afx_msg int CMainWin::OnCreate(LPCREATESTRUCT lpCreate){
///...
    m_maxX=GetSystemMetrics(SM_CXSCREEN);
    m_maxY=GetSystemMetrics(SM_CYSCREEN);
    if(CFrameWnd::OnCreate(lpCreate)==-1)
        return -1;
    if(!m_Status.Create(this)){
        TRACE0("Failed to create status bar\n");
        return -1;;
    }
    if(!m_Status.SetIndicators(Indicators, 
        sizeof(Indicators)/sizeof(UINT))){
        TRACE0("Failed to set indicators\n");
        return -1;
    }
    if(!m_ToolBar.Create(this))
    {
        TRACE0("Failed to create Toolbar\n");
        return -1;;
    }
    if(!m_ToolBar.LoadToolBar(IDR_TOOLBAR))
    {
        TRACE0("Failed to set Resource\n");
        return -1;
    }
    m_ToolBar.SetBarStyle(m_ToolBar.GetBarStyle()
        |CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);
    return 0;
 
}
 
afx_msg void CMainWin::OnPaint() {
    CPaintDC dc(this);
    dc.BitBlt(0, 31, m_maxX, m_maxY, &m_memDC, 0, 0, SRCCOPY);
}
 
CApp App;
 
//файл rc
IDR_MAINFRAME MENU DISCARDABLE 
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "&Open\tCtrl+O",               ID_FILE_OPEN
        MENUITEM "&Save\tCtrl+S",               ID_SAVECUT
        MENUITEM "&New\tCtrl+N",                ID_NEW
        MENUITEM SEPARATOR
        MENUITEM "E&xit\tCtrl+X",               ID_FILE_EXIT
    END
    POPUP "Tools"
    BEGIN
        MENUITEM "A&dd\tCtrl+d",                ID_ADD
        MENUITEM "S&tart\tCtrl+t",              ID_START
    END
END
 
//файл h
class CMainWin : public CFrameWnd {
    private:
        CStatusBar m_Status;
        CToolBar m_ToolBar;
        int m_maxX, m_maxY;
        CBitmap m_memBitmap;
        CDC m_memDC;
    public:
        CMainWin();
        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
        afx_msg void OnPaint();
        DECLARE_MESSAGE_MAP()
};
 
class CApp: public CWinApp {
    public:
        BOOL InitInstance();
};
Добавлено через 12 минут 42 секунды
всякие #define, include, обработчики сообщений и прочие не суть важные вещи повыкидывал.
create в конструкторе, как я понимаю относится к классу Cwnd..

эта беда написана на С++ 6.0 1998 года, с тех пор много чего поменялось, сейчас как раз занят тем, что пытаюсь понять, что же именно)
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
12.12.2008, 17:40  [ТС] 5
Ну для начала это MFC)) И как я понимаю разница есть. Так что будет считать, что я ничего не понял т.к. до МФЦ еще не добрался) Ясно только, что МФЦ на С++ классах держится. А вот с меню тут туговато.
Ну без разницы, ответ найдет. Буду дальше учить.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2008, 17:40

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Создание основного меню
Создание основного меню (что располагается ниже заголовка окна). Работаю в среде VS2008....

Создание контекстного меню в MFC
Есть список (лист бокс) в нем несколько строк, так вот я хотел чтобы по клику правой кнопкой,...

Создание меню без использования ресурсного файла
Создаю меню при помощи функций CreateMenu(),CreatePopupMenu(). Добавлял пункты меню функцией ...

Установка галочки в пункте меню при выборе данного пункта меню
Есть меню,надо,чтобы при нажатии на пункт меню напротив этого пункта ставилась галочка. Знаю про...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.