Help!!!! проблема с меню делаю всё как в книге А неработает

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
leex88
Сообщения: 3
Зарегистрирован: 27 ноя 2007, 20:12

Добрый день

написал код :
#include "windows.h"

#define CM_FILE_OPEN 1001
#define CM_FILE_SAVE 1002
#define CM_FILE_QUIT 1003
#define CM_EDIT_FIND 2001
#define CM_EDIT_REPLC 2002

//обьявления функций
BOOL RegClass(WNDPROC,LPCTSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

//описание глобальных переменных
HINSTANCE hlnst;
char szClassName[]="WindowAppClass";
char MBName[]="message";

//описание глобальной функции
int WINAPI WinMain (HINSTANCE hlnstance,
HINSTANCE hPrevlnstance,
LPSTR lpszCmdLine,int nCmdShow)
{
MSG msg;
HWND hwnd;
hlnst=hlnstance;

if (!RegClass(WndProc,szClassName,COLOR_WINDOW)) return FALSE;
hwnd=CreateWindow(szClassName,
"WINDOW LEEX",//имя окна
WS_OVERLAPPEDWINDOW|WS_VISIBLE,//стиль окна
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
hlnstance,
NULL );
if(!hwnd) return false;
//ShowWindow(hwnd,SW_SHOWMAXIMIZED);
//UpdateWindow(hwnd);

//MessageBox(hwnd,"!!!!!!!!",MBName,MB_OK);

while (GetMessage(&msg,0,0,0))
{
TranslateMessage(&msg);
//DrawMenuBar(hwnd);
DispatchMessage(&msg);
}
return msg.wParam;
};
//описание функции регистрации классов
BOOL RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground)
{
WNDCLASS wc;
wc.style=0;///CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=wc.cbWndExtra=0;
wc.lpfnWndProc=Proc;
wc.hInstance=hlnst;
wc.hIcon=LoadIcon(NULL,IDI_ERROR/*IDI_APPLICATION*/);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(brBackground+1);//COLOR_WINDOW+1);
wc.lpszMenuName=NULL;//(LPCTSTR)NULL;
wc.lpszClassName=szName;
return (RegisterClass(&wc)!=0);
};
//функция создания кнопок меню
BOOL CreateMenuitem(HMENU hMenu,char *str,UINT uins,
UINT uCom,HMENU hSubMenu, BOOL flag,UINT fType)
{
MENUITEMINFO mii;
mii.cbSize=sizeof(MENUITEMINFO); //размер структуры
mii.fMask=MIIM_STATE|MIIM_SUBMENU|MIIM_ID; //со значениями каких полей надо работать
mii.fType=fType; //тип элемента
mii.fState=MFS_ENABLED; //состояние элимента меню
mii.dwTypeData="2212121212"/*str*/; //строка
mii.cch=sizeof(str); //длина строки
mii.wID=uCom; //индификатор команды
mii.hSubMenu=hSubMenu; //дискриптор временного меню
return(InsertMenuItem(hMenu,uins,flag,&mii));
};


//описание функции окон
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,
WPARAM wParam,LPARAM lParam)
{
static HMENU hMainMenu,hFileMenu,hEditMenu;
switch(msg)
{case WM_DESTROY:{
PostQuitMessage(0);
return 0;
};
case WM_CREATE :{
hMainMenu=CreateMenu();
hFileMenu=CreatePopupMenu();
int i=0;
CreateMenuitem(hFileMenu,"&Открыть",i++,
CM_FILE_OPEN,NULL,FALSE,MFT_STRING);
CreateMenuitem(hFileMenu,"&Сохранить",i++,
CM_FILE_SAVE,NULL,FALSE,MFT_STRING);
CreateMenuitem(hFileMenu,NULL,i++,
0,NULL,FALSE,MFT_SEPARATOR);
CreateMenuitem(hFileMenu,"&Выход",i++,
CM_FILE_QUIT,NULL,FALSE,MFT_STRING);

hEditMenu=CreatePopupMenu();
i=0;

CreateMenuitem(hEditMenu,"&Найти",i++,
CM_EDIT_FIND,NULL,FALSE,MFT_STRING);
CreateMenuitem(hEditMenu,"&Заменить",i++,
CM_EDIT_REPLC,NULL,FALSE,MFT_STRING);
i=0;
CreateMenuitem(hMainMenu,"&Файлы",i++,0,hFileMenu,
FALSE,MFT_STRING);
CreateMenuitem(hMainMenu,"&Правка",i++,0,hEditMenu,
FALSE,MFT_STRING);
CreateMenuitem(hMainMenu,"&Выход",i++,
CM_FILE_QUIT,NULL,FALSE,MFT_STRING);


//MessageBox(hwnd,"!!!!!!!!",MBName,MB_OK);
SetMenu(hwnd,hMainMenu);
DrawMenuBar(hwnd);
return(0);


};
case WM_COMMAND :{

};
};
return DefWindowProc(hwnd,msg,wParam,lParam);
};


по идеи должно было появиться окно с меню на котором кнопки окно появляется меню тоже но кнопок нету!!!!!!! подскажите в чем проблема!!
:confused: :confused: :confused:
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Вижу сходу:

Код: Выделить всё

mii.cch=sizeof(str); //длина строки
Должно быть:

Код: Выделить всё

mii.cch=strlen(mii.dwTypeData); //длина строки
Дело в том, что sizefo(str) - это не длина строки, а размер указателя, а он всегда один и тот же - 4 байта.

А можно нескромный вопрос? Меню в ресурсах чем плохо? Зачем его динамически создавать?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
leex88
Сообщения: 3
Зарегистрирован: 27 ноя 2007, 20:12

чтобы разобраться получше...
leex88
Сообщения: 3
Зарегистрирован: 27 ноя 2007, 20:12

исправил но все равно не работает!!((
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ну тогда дебагер в руки - и вперёд. Ставь бреакпоинт на case WM_CREATE и по шагам смотри что происходит.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить