Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

GUI на WinAPI


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо