Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/23: Рейтинг темы: голосов - 23, средняя оценка - 4.74
5 / 5 / 1
Регистрация: 23.11.2009
Сообщений: 608
1

Меню без использования ресурсов

06.10.2010, 14:42. Показов 4442. Ответов 10
Метки нет (Все метки)

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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <windows.h>
#include <commctrl.h>
 
const IDM_Enable_Disable = 0;
const IDM_Exit = 1;
const IDM_About = 2;
const IDP_File = 3;
const IDP_Help = 4;
 
char* pMessages[]
{
      "Enable or disable exit",
      "Exit from the program",
      "About this program",
      "File operations",
      "Help operations",
      "Menu example",
      "System menu"
};
 
/* Îáüÿâëåíèå Windows procedure  */
LRESULT CALLBACK MenuDemoWndProc (HWND, UINT, UINT, LONG);
 
HWND hStatusWindow;
UINT wld;
HMENU hMenu, hFileMenu, hHelpMenu;
HINSTANCE hInst;
 
int APIENTRY WinMain (HINSTANCE hInstance, //Õýíäë ýêçåìïëÿðà ïðîãðàììû
                    HINSTANCE hPrevInstance, //Æýíäë ïðåäûäóùåãî ýêçåìïëÿðà ïðîãðàììû
                    LPSTR lpszCmdParam,
                    int nCmdShow) //Âèä îêíà
 
{
    HWND hWnd;               /* This is the handle for our window */
    MSG Msg;            /* Here messages to the application are saved */
    WNDCLASS WndClass;        /* Data structure for the windowclass */
    
    hInst = hInstance;
 
    /* The Window structure */
    WndClass.style = CS_HREDRAW | CS_VREDRAW;      /* Ïåðåðèñîâêà îêíà ïðè èçìåíåíèè âûñîòû è øèðèíû îêíà */
    WndClass.lpfnWndProc = (WNDPROC) MenuDemoWndProc;      /* This function is called by windows */
    WndClass.cbClsExtra = 0;                      /* No extra bytes after the window class */
    WndClass.cbWndExtra = 0;                      /* structure or the window instance */
    WndClass.hInstance = hInstance;
    WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    WndClass.hCursor = LoadCursor (NULL, IDC_ARROW);
    WndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName = NULL;                 /* No menu */
    WndClass.lpszClassName = "MenuExample";
 
    /* Use default icon and mouse-pointer */
    /* Use Windows's default color as the background of the window */
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClass(&WndClass))
    {
        MessageBox(NULL, "Cannot register class", "Error", MB_OK);
        return 0;
    }
    /* The class is registered, let's create the program*/
    hWnd = CreateWindow (
           "MenuExample",         /* Classname */
           "Programm 2",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           NULL,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
    
    if (!hWnd)
    {
        MessageBox(NULL, "Cannot create window", "Error", MB_OK);
        return 0;
    }
    InitCommonControls();
    hStatusWindow = CreateStatusWindow(WS_CHILD | WS_VISIBLE, "Menu sample", hWnd, wld);
    
    if(!hStatusWindow)
    {
                      MessageBox(NULL, "Cannot create status window", "Error", MB_OK);
                      return 0;
    }
    
    AppendMenu((hFileMenu=CreatePopupMenu()), MF_ENABLED, MF_STRING, IDM_Enable_Disable, "&Enable exit");
    AppendMenu(hFileMenu, MF_GRAYED | MF_STRING, IDM_Exit, "E&xit");
    AppendMenu((hHelpMenu=CreatePopupMenu()), MF_DISABLED, MF_STRING, IDM_About, "&About");
    hMenu = CreateMenu();
    AppendMenu(hMenu, MF_ENABLED | MF_POPUP, (UINT) hFileMenu, "&File");
    AppendMenu(hMenu, MF_ENABLED | MF_POPUP, (UINT) hHelpMenu, "&Help");
    SetMenu(hWnd, hMenu);
    /* Make the window visible on the screen */
    ShowWindow (hWnd, nCmdShow);
    UpdateWindow(hWnd);
    DrawMenuBar(hWnd);
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage(&Msg, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&Msg);
        /* Send message to WindowProcedure */
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
 
LRESULT CALLBACK MenuDemoWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
    RECT Rect;
    static UINT nFlag = MF_ENABLED;
    char* pContent[]
    {
          "Enable exit",
          "Disable exit"
    };
    static UINT nIndex = 0;
    static HBITMAP hBitmap;
    int nDimension;
    
    switch (Message)
    {
           case WM_CREATE:
                nDimension = GetSystemMetrics(SM_CYMENU);
                hBitmap = LoadImage(hInst, "777.bmp", IMAGE_BITMAP,
                nDimension * 2, nDimension, LR_LOADFROMFILE);
                AppendMenu(GetMenu(hWnd), MF_BITMAP, IDM_Bitmap, hBitmap);
                break;
           case WM_COMMAND:
                switch(wParam)
                {
                              case IDM_Enable_Disable:
                                   EnableMenuItem(hFileMenu, IDM_Exit, MF_BYCOMMAND | nFlag);
                                   nFlag = (nFlag==MF_ENABLED)?MF_GRAYED:MF_ENABLED;
                                   nIndex = ( nIndex == 0)?1:0;
                                   ModifyMenu(hFileMenu, IDM_Enable_Disable, MF_BYCOMMAND |
                                   MF_STRING, IDM_Enable_Disable, pContent[nIndex]);
                                   break;
                              case IDM_Exit:
                                   SendMessage(hWnd, WM_CLOSE, NULL, NULL);
                                   break;
                }
           case WM_SIZE:
                SendMessage(hStatusWindow, WM_SIZE, wParam, lParam);
                GetClientRect(hWnd, &Rect);
                return 0;
           case WM_MENUSELECT:
                if ( ((UINT)HIWORD(wParam) == 0xffff) & ((HMENU) lParam ==0))
                {
                     SendMessage(hStatusWindow, SB_SETTEXT, (WPARAM) 0,
                     (LPARAM) pMessages[5]);
                     return 0;
                }
                if ((UINT)HIWORD(wParam) & MF_SYSMENU);
                {
                                     SendMessage(hStatusWindow, SB_SETTEXT, (WPARAM) 0,
                                     (LPARAM) pMessages[6]);
                                     return 0;
                }
                if ((UINT)HIWORD(wParam) & MF_POPUP)
                {
                                         SendMessage(hStatusWindow, SB_SETTEXT, (WPARAM) 0,
                                         (LPARAM) pMessages[3 + LOWORD(wParam)]);
                }
                SendMessage(hStatusWindow, SB_SETTEXT, (WPARAM) 0, (LPARAM)
                pMessages[LOWORD(wParam)]);
                return 0;
           case WM_DESTROY:
                DeleteObject(hBitmap);
                PostQuitMessage (0);
           return 0;
    }
    return DefWindowProc (hWnd, Message, wParam, lParam);
}
Компилятор пишет ошибки:
4 ISO C++ forbids declaration of `IDM_Enable_Disable' with no type
5 ISO C++ forbids declaration of `IDM_Exit' with no type
6 ISO C++ forbids declaration of `IDM_About' with no type
7 ISO C++ forbids declaration of `IDM_Filele' with no type
8 ISO C++ forbids declaration of `IDM_Help' with no type
11 invalid function declaration
3232 C:\Dev-Cpp\include\winuser.h too many arguments to function `BOOL AppendMenuA(HMENU__*, UINT, UINT_PTR, const CHAR*)'
91 at this point in file 94 invalid conversion from `int' to `const CHAR*'
3232 C:\Dev-Cpp\include\winuser.h too many arguments to function `BOOL AppendMenuA(HMENU__*, UINT, UINT_PTR, const CHAR*)'
93 invalid conversion from `int' to `const CHAR*'
3232 C:\Dev-Cpp\include\winuser.h too many arguments to function `BOOL AppendMenuA(HMENU__*, UINT, UINT_PTR, const CHAR*)'
117 expected primary-expression before "char"
117 expected `;' before "char"
131 invalid conversion from `void*' to `HBITMAP__*'
132 `IDM_Bitmap' undeclared (first use this function)
142 `pContent' undeclared (first use this function)
156 `pMessages' undeclared (first use this function)

Добавлено через 4 часа 9 минут
[Build Error] [main.o] Error 1
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2010, 14:42
Ответы с готовыми решениями:

Подключить меню из ресурсов
Проблема в том, что когда я инициализирую окно и добавляю меню из ресурсов то оно добавляется, но...

Меню с использованием ресурсов
Создал ресурс меню. // Generated by ResEdit 1.6.4 // Copyright (C) 2006-2015 //...

Меню из файла ресурсов
Здравствуйте! Не отображается меню из файла ресурсов, подскажите как правильно сделать? #if...

Подключение созданного меню из ресурсов
Добрый день. Хочу подключить к диалоговому окну меню, которое создается в MVS через ресурсы. Я...

10
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 540
06.10.2010, 21:58 2
строки 4-8: укажите тип данных
строка 11 - массив объявлен неверно - скорее всего должно быть const char* pMessages[] = { ...
аналогично - в 117 строке
строки 91-93 - в объявлении 4 параметра, у Вас 5 - скорее всего забыли OR ( | )

и так далее в том же духе... Повнимательнее
1
5 / 5 / 1
Регистрация: 23.11.2009
Сообщений: 608
07.10.2010, 12:20  [ТС] 3
kukuruku310, после замены char* pMessages[] на const char* pMessages[] всё равно пишут:
11 C:\DC\Rumiantsev\main.cpp invalid function declaration
Исправлены ошибки в 1-93 строках.
Исправил ошибки в 4-8 строках добавив int после const.
Вот так написаны первые 8 строк в листинге "Меню без использования ресуров". Книги П. В. Румянцева.
C++
1
2
3
4
5
6
7
8
#include <windows.h>
#include <commctrl.h>
 
const IDM_Enable_Disable = 0;
const IDM_Exit = 1;
const IDM_About = 2;
const IDP_File = 3;
const IDP_Help = 4;
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 540
07.10.2010, 12:32 4
Цитата Сообщение от Alexey R Посмотреть сообщение
после замены char* pMessages[] на const char* pMessages[] всё равно пишут
Вы не увидели главного - знака "равно"
1
5 / 5 / 1
Регистрация: 23.11.2009
Сообщений: 608
07.10.2010, 13:02  [ТС] 5
Осталось исправить следующие строки:
131 invalid conversion from `void*' to `HBITMAP__*'
132 `IDM_Bitmap' undeclared (first use this function)
145 [Warning] passing NULL used for non-pointer converting 3 of `LRESULT SendMessageA(HWND__*, UINT, WPARAM, LPARAM)'
145 [Warning] passing NULL used for non-pointer converting 4 of `LRESULT SendMessageA(HWND__*, UINT, WPARAM, LPARAM)'
C++
1
2
hBitmap = LoadImage(hInst, "777.bmp", IMAGE_BITMAP
nDimension * 2, nDimension, LR_LOADFROMFILE);
C++
1
AppendMenu(GetMenu(hWnd), MF_BITMAP, IDM_Bitmap, hBitmap);
C++
1
SendMessage(hWnd, WM_CLOSE, NULL, NULL);
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 540
08.10.2010, 12:10 6
по поводу 131 и 145 - используйте явное приведение типов (по буржуински: explicit type-cast), так же, как в строках 157-158, 163-164.
А вот по поводу IDM_Bitmap непонятно где она у Вас объявлена и что содержит на момент использования функции. Разбирайтесь. Может забыли добавить заголовок с ресурсами?
0
5 / 5 / 1
Регистрация: 23.11.2009
Сообщений: 608
08.10.2010, 13:32  [ТС] 7
kukuruku310, Почтиайте книгу П.В.Румянцев - Азбука программирования в Win32 API том 1.pdf
страницы 80 - 85.
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 540
08.10.2010, 16:16 8
Цитата Сообщение от Alexey R Посмотреть сообщение
kukuruku310, Почтиайте книгу П.В.Румянцев - Азбука программирования в Win32 API том 1.pdf
страницы 80 - 85
нахрена козе баян?
0
5 / 5 / 1
Регистрация: 23.11.2009
Сообщений: 608
08.10.2010, 18:58  [ТС] 9
kukuruku310, Хорошо, тогда какую литературу посоветуете для разработки приложений в Win32 API? Среда - Dev C++.
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 540
08.10.2010, 19:21 10
Я не понял вопроса - то ли Вы мне советуете прочитать Румянцева, то ли еще что... Если это вопрос по поводу литературы, так ничего дельного не посоветую. Сам никогда не читал ничего подобного, если не считать Рихтера, но его книжку "Эфективная разработка...", кажется как-то так называется, только с большой натяжкой можно отнести к обучению программирования Win GUI. А так, сколько отрывков из разных GUI-подобных книжек видел - все одно по одному. Так что лучшая книжка - MSDN. Хотя и ошибаться, разумеется, могу. К тому же я в GUI начинал въезжать в Delphi, может поэтому...

А ведь соврал! Была когда-то книжка как раз по GUI. Но вот как оно называется и кто автор (но точно, что буржуй) - хоть убей... Помню только что зеленая и в двух книгах.
0
Q8
2 / 2 / 0
Регистрация: 16.10.2010
Сообщений: 7
19.10.2010, 22:42 11
Цитата Сообщение от Alexey R Посмотреть сообщение
Осталось исправить следующие строки:
131 invalid conversion from `void*' to `HBITMAP__*'
132 `IDM_Bitmap' undeclared (first use this function)
145 [Warning] passing NULL used for non-pointer converting 3 of `LRESULT SendMessageA(HWND__*, UINT, WPARAM, LPARAM)'
145 [Warning] passing NULL used for non-pointer converting 4 of `LRESULT SendMessageA(HWND__*, UINT, WPARAM, LPARAM)'
C++
1
2
hBitmap = LoadImage(hInst, "777.bmp", IMAGE_BITMAP
nDimension * 2, nDimension, LR_LOADFROMFILE);
C++
1
AppendMenu(GetMenu(hWnd), MF_BITMAP, IDM_Bitmap, hBitmap);
C++
1
SendMessage(hWnd, WM_CLOSE, NULL, NULL);
hBitmap = (HBITMAP)LoadImage (NULL, "name.bmp", IMAGE_BITMAP, nDimension*2, nDimension, LR_LOADFROMFILE);
AppendMenu (GetMenu(hWnd), MF_BITMAP, IDM_Bitmap, (char*)hBitmap);

В этой книге много опечаток в листинге.
Ещё там пропущена строка const IDM_Bitmap = 5;

Добавлено через 22 минуты
Да и ваще здесь куча недразумений. Например, он предлагает нам вызывать функцию добавления меню AppendMenu (GetMenu(hWnd), MF_BITMAP, IDM_Bitmap, (char*)hBitmap); в уже созданное меню с хэндлом hMenu. Но этого меню ещё нету, оно не создано. После создания окна сразу же мы переходим в функцию окна на событие WM_CREATE и токо потом мы продолжаем выполнение программы со строк создания нашего основного меню вобщем правильно работающий код будет выглядеть так:
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <windows.h>
#include <commctrl.h>
 
 
const IDM_Enable_Disable = 0;
const IDM_Exit = 1;
const IDM_About = 2;
const IDP_File = 3;
const IDP_Help = 4;
const IDM_Bitmap = 5;
 
char *pMessages[] = 
{
"Enable or disable exit",
"Exit from the program",
"About this programm",
"File operations",
"Help Operations",
"Menu example",
"System menu"
};
 
 
LRESULT CALLBACK MenuDemoWndProc(HWND, UINT,UINT,LONG);
 
HWND hStatusWindow;
UINT wid;
HMENU hMenu, hFileMenu, hHelpMenu;
HINSTANCE hInst;
 
int WINAPI WinMain(HINSTANCE hInstance, 
                                   HINSTANCE hPrevInstance, 
                                   LPSTR lpszCmdParam, 
                                   int nCmdShow)
{
HWND hWnd;
WNDCLASS WndClass;
MSG Msg;
 
 
        hInst = hInstance;
        
        
        WndClass.style=CS_HREDRAW|CS_VREDRAW;
        WndClass.lpfnWndProc=MenuDemoWndProc;
        WndClass.cbClsExtra=0;
        WndClass.cbWndExtra=0;
        WndClass.hInstance=hInstance;
        WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
        WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
        WndClass.hbrBackground=(HBRUSH)GetStockObject(COLOR_WINDOW+1);
        WndClass.lpszMenuName=NULL;
        WndClass.lpszClassName="menu";
 
        if(!RegisterClass(&WndClass))
        {
                MessageBox(NULL,"Íåâîçìîæíî çàðåãèñòðèðîâàòü êëàññ","Îøèáêà",MB_OK);
                return 0;
        }
 
        hWnd=CreateWindow("menu","Ìåíþ",
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                NULL,
                NULL,
                hInstance,
                NULL);
 
        if(!hWnd)
        {
                MessageBox(NULL,"Íåâîçìîæíî ñîçäàòü îêíî","Îøèáêà",MB_OK);
                return 0;
        }
 
        InitCommonControls();
        hStatusWindow = CreateStatusWindow (WS_CHILD|WS_VISIBLE, "Ïðèìåð ðàáîòû ÌÅÍÞ", hWnd, wid);
        if(!hStatusWindow)
        {
                MessageBox(NULL,"Íåâîçìîæíî ñîçäàòü ñòðîêó ñòàòóñà","Îøèáêà",MB_OK);
                return 0;
        }
 
 
 
        ShowWindow(hWnd,nCmdShow);
        UpdateWindow(hWnd);
        DrawMenuBar(hWnd);
 
        while(GetMessage(&Msg,NULL,0,0))
        {
                TranslateMessage(&Msg);
                DispatchMessage(&Msg);
        }
return Msg.wParam;
}
 
 
LRESULT CALLBACK MenuDemoWndProc(HWND hWnd, UINT Message, UINT wParam, LONG iParam)
{
HDC hDC;
PAINTSTRUCT PaintStruct;
RECT Rect;
static UINT nFlag = MF_ENABLED;
char* pContent[] = 
{
    "Enable exit",
    "Disable exit"
};
static UINT nIndex = 0;
HBITMAP hBitmap;
int nDimension;
int err;
char name[] = "name.bmp";
HMENU m;
 
        GetClientRect(hWnd, &Rect);
 
        switch(Message)
        {
        case WM_CREATE:
 
AppendMenu (hFileMenu = CreatePopupMenu(), MF_ENABLED|MF_STRING, IDM_Enable_Disable, "&Enable Exit"); 
AppendMenu (hFileMenu, MF_GRAYED|MF_STRING, IDM_Exit, "E&xit");
 
AppendMenu (hHelpMenu = CreatePopupMenu(), MF_DISABLED|MF_STRING, IDM_About, "&About");
 
hMenu = CreateMenu();
 
AppendMenu (hMenu, MF_ENABLED|MF_POPUP, (UINT) hFileMenu, "&File");
AppendMenu (hMenu, MF_ENABLED|MF_POPUP, (UINT) hHelpMenu, "&Help");
SetMenu (hWnd, hMenu);
 
            nDimension = GetSystemMetrics (SM_CYMENU);
            hBitmap = (HBITMAP)LoadImage (NULL, "name.bmp", IMAGE_BITMAP, nDimension*2, nDimension, LR_LOADFROMFILE);
               if ( !hBitmap )
               {
                MessageBox(NULL, "Ôàéë íå íàéäåí", "Îøèáî÷êà", MB_OK);
                return 0;
               }
 
            
            
            AppendMenu (GetMenu(hWnd), MF_BITMAP, IDM_Bitmap, (char*)hBitmap);
            
            break;
                case WM_PAINT:
                        hDC=BeginPaint(hWnd,&PaintStruct);
                        DrawText(hDC,"Çäðàâñòâóé, Ìèð!",-1,&Rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
                        EndPaint(hWnd,&PaintStruct);
                        return 0;
                case WM_DESTROY:
                        PostQuitMessage(0);
                        return 0;
        }
 
return DefWindowProc(hWnd,Message,wParam,iParam);
}
1
19.10.2010, 22:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2010, 22:42

Разработка ресурсов меню и акселераторов клавиатуры
Создать приложение с двумя меню. Первое меню позволяет изменить размеры прямоугольника; второе —...

Окна без файла ресурсов
Есть частично работающий код программы, создающей окна без использования файла ресурсов, т.е. в...

Как сделать меню для окна в файле ресурсов?
Добрый вечер! Как сделать меню для окна в файле ресурсов? Целый день бьюсь, ничего не выходит...

Как установить/снять галку в меню окна, загруженного из ресурсов
меню загружается при регистрации класса окна: wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru