![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GUI на WinAPI
Marser © (2005-05-25 17:30:00)При создании элементарного окна с кнопкой возникла следующая проблема - обработка нажатия левой кнопки мыши на кнопке происходит, однако визуально кнопка на это не реагирует.
Вот код:
program apipro;
uses
Windows, Messages;
var
MWND:TWndClassEx;
mwin,mbut:HWND;
Mesg:TMsg;
l:Pointer;
function MWinProc(wnd:HWND;Msg:Integer;wParam:wParam;lParam:lParam):HResult;stdcall;
begin
case msg of
wm_destroy:Begin
postquitmessage(0); exit;
Result:=0;
End
else
result:=DefWindowProc(wnd,msg,wparam,lparam);
end
end;
function MButProc(wnd:HWND;Msg:Integer;wParam:wParam;lParam:lParam):HResult;stdcall;
begin
result:=0;
case msg of
WM_LBUTTONDOWN:messagebox(0,'Меня нажали','My button',mb_iconexclamation);
else
Result:=CallWindowProc(l,wnd,msg,wparam,lparam);
end;
end;
procedure createmainwin;
begin
mwnd.cbSize:=sizeof(TWndClassEx);
mwnd.style:=CS_HREDRAW or CS_VREDRAW;
mwnd.lpfnWndProc:=@MWinProc;
mwnd.cbClsExtra:=0;
mwnd.cbWndExtra:=0;
mwnd.hInstance:=HInstance;
mwnd.hIcon:=LoadIcon(0,idi_application);
mwnd.hCursor:=LoadCursor(0,IDC_ARROW);
mwnd.hbrBackground:=COLOR_BTNFACE+1;
mwnd.lpszMenuName:=nil;
mwnd.lpszClassName:='WinMin : Main';
mwnd.hIconSm:=0;
RegisterClassEx(mwnd);
mwin:=CreateWindowEx(0,'WinMin : Main','MyWin',WS_OVERLAPPEDWINDOW or WS_BORDER or WS_CAPTION,100,60,
200,200,0,0,Hinstance,nil);
ShowWindow(mwin,CmdShow);
end;
procedure createbutton;
begin
mbut:=createwindow('BUTTON','My Button',WS_CHILDWINDOW or BS_PUSHBUTTON,10,10,80,20,
mwin,0,Hinstance,nil);
ShowWindow(mbut,CmdShow);
l:=pointer(GetWindowLong(mbut,gwl_wndproc));
SetWindowLong(mbut,gwl_wndproc,integer(@MButProc))
end;
begin
createmainwin;
createbutton;
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
end.
Вариант
function MButProc(wnd:HWND;Msg:Integer;wParam:wParam;lParam:lParam):HResult;stdcall;
begin
if msg=WM_LBUTTONDOWN then
messagebox(0,'Меня нажали','My button',mb_iconexclamation);
Result:=CallWindowProc(l,wnd,msg,wparam,lparam);
end;
end;
То бишь, полностью стандартная обработка вместе с нестандартной, приводит к непонятному мне зацикливанию.
Одним из вариантов решения был предложен Игорем Осовьяком - дополнительная отсылка собственного сообщения в postmessage с многоступенчатой обработкой, в принципе неплох. Но мне кажется, что всё несколько проще.
Polevi (2005-05-25 17:38:00) [21]BM_CLICK, BM_CLICKED