PDA

Просмотр полной версии : отдельная процедура обработки кнопки, как это сделать



toshas
04.07.2004, 18:10
есть окно, в нем я создаю кнопку, класс которой беру как стандартный, через GetClassInfo,+изменяю lpfnWndProc и название класса, регистрирую мой класс, но ничего не работает что я делаю не так.

спасибо.

....
LONG WINAPI MainButProc(HWND,UINT,WPARAM,LPARAM);
....
WNDCLASS ww;


GetClassInfo(0,"button",&ww);

ww.lpszClassName="my_button";
ww.lpfnWndProc=MainButProc;
RegisterClass(&ww);

hbutton=CreateWindow("my_button","êíîïêà",WS_CHILD|WS_BORDER|WS_VISIBLE,10,10,100,100,hwnd, (HMENU) 1, hInstance,NULL);
ShowWindow(hbutton,nCmdShow);
UpdateWindow(hbutton);
....
LONG WINAPI MainButProc(HWND hwndMain, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg){
case WM_COMMAND:
MessageBox(hwndMain,"êíîïêó íàæàëè","MessageBox",NULL);
break;
default:
return MainWndProc(hwndMain,uMsg,wParam,lParam);
}
return 0;
}

AiK
04.07.2004, 19:12
toshas, а ты уверен, что сообщение WM_COMMAND отправляется контролу, а не его родителю?
Я так думаю, тебе BN_CLICKED ловить надо.

Hawk
05.07.2004, 07:58
Aik совершенно прав, нотификации посылаются паренту контролса. Кроме того стандартную процедуру надо вызывать через CallWindowProc

Eugie
05.07.2004, 18:56
Насчет WM_COMMAND все верно, но главная ошибка - что за MainWndProc вызывается в перегруженной процедуре окна? Обычно при window procedure superclassing необрабатывемые сообщения посылаются в старую процедуру окна. А для этого ее надо было сохранить сразу после вызова GetClassInfo.

Кроме того, для дочерних окон не нужно вызывать ShowWindow и UpdateWindow - родитель обо всем позаботится :) Но это уже мелочи