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

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

OnIdle в приложении на чистом WinAPI


ProgRAMmer Dimonych ©   (2008-08-08 13:07:00) 

Заинтересовался способом создания форм приложения через ресурсы (т.е. через DialogBox или CreateDialog). А как в таком приложении реализовать замену VCL-ному OnIdle'у?


ProgRAMmer Dimonych   (2008-08-09 22:00:00) [1]

P.P.S. Кстати, WM_NULL, похоже, не лучший вариант. Где что можно подправить?


ProgRAMmer Dimonych   (2008-08-09 16:07:00) [2]

Уф-ф, навозился. В общем, если не трудно, посмотрите исходник...

program WAPIDialogs;

uses
 Windows,
 Messages;

var
 MainHandle:HWND;
 Msg:TMsg;

{$R *.res}
{$R Window.res}

procedure OnIdle;
begin
 //Кусок кода, ускипано
end;

procedure DoDeInit(Handle:HWND);
begin
 DestroyWindow(Handle);
 PostQuitMessage(0);
end;

procedure DoInit(Handle:HWND);
begin
 ShowWindow(Handle,SW_MAXIMIZE);
end;

function DlgProc(Handle:HWND; Msg:UINT; WP:WPARAM; LP:LPARAM):BOOL; stdcall;
begin
 Result:=False;
 case Msg of
   WM_INITDIALOG: DoInit(Handle);
   WM_CLOSE: DoDeInit(Handle);
   WM_COMMAND:
     case WP of
       IDCANCEL:
       begin
         ShowWindow(Handle,SW_MINIMIZE); EndDialog(Handle,0);
       end;
     end; //case WP
 end; //case Msg
end; //DlgProc

begin
 MainHandle:=CreateDialog(HInstance,'MAIN',0,@DlgProc);
 if MainHandle<>0 then
   while True do
     if PeekMessage(Msg,MainHandle,0,0,PM_REMOVE) then
     begin
       if Msg.message=WM_NULL then Break;
       if not(IsDialogMessage(MainHandle,Msg)) then
       begin
         TranslateMessage(Msg); DispatchMessage(Msg);
       end
     end
     else
       OnIdle;
end.


Без проверки на WM_NULL приложение успешно прятало окно, но подвисало в опустевшем while'е.

P.S. С RepeatUntil'ом не дружу :)


ProgRAMmer Dimonych   (2008-08-09 14:18:00) [3]

> Leonid Troyanovsky ©   (09.08.08 13:26) [8]
За ссылку спасибо.

Boolean - это в смысле что надо, чтобы Long был?


Leonid Troyanovsky   (2008-08-09 13:26:00) [4]

Удалено модератором
Примечание: Давайте жить культурней :)


ProgRAMmer Dimonych   (2008-08-09 12:10:00) [5]

> Григорьев Антон ©   (09.08.08 09:34) [6]
> Ну у вас же есть петля сообщений? Посмотрите в исходниках
> VCL, как сделано событие OnIdle и сделайте по аналогии.

Пока этой самой петли нет.

program WAPIDialogs;

uses
 Windows,
 Messages;

{$R *.res}
{$R Window.res}

procedure OnTimer(Handle:HWND);
begin
end;

procedure DoDeInit(Handle:HWND);
begin
PostQuitMessage(0);
KillTimer(Handle,1);
end;

procedure DoInit(Handle:HWND);
begin
SetTimer(Handle,1,100,nil);
ShowWindow(Handle,SW_MAXIMIZE);
end;

function DlgProc(Handle:HWND; Msg:UINT; WP:WPARAM; LP:LPARAM):Boolean; stdcall;
begin
Result:=False;
case Msg of
 WM_INITDIALOG: DoInit(Handle);
 WM_CLOSE: DoDeInit(Handle);
 WM_COMMAND:
  case WP of
   IDCANCEL:
    begin
     ShowWindow(Handle,SW_MINIMIZE); EndDialog(Handle,0);
    end;
  end;
 WM_TIMER: OnTimer(Handle);
end;
end;

begin
DialogBox(HInstance,'MAIN',0,@DlgProc);
end.


Как-то приблизительно так выглядит программа (убрал кусок D3D, чтобы не отвлекаться). С CreateDialog, вроде как, можно петельку заполучить каким-то образом, но мои скромные попытки вместо успеха увенчались зависанием приложения. :(


Григорьев Антон   (2008-08-09 09:34:00) [6]

Ну у вас же есть петля сообщений? Посмотрите в исходниках VCL, как сделано событие OnIdle и сделайте по аналогии.


ProgRAMmer Dimonych   (2008-08-09 00:42:00) [7]

> Игорь Шевченко ©   (08.08.08 14:55) [3]

Понял. Сделал.

> Григорьев Антон ©   (08.08.08 15:45) [4]

Я этого не указал, виноват... Главное окно тоже создаётся этим способом. Родительский Handle для него указан равным 0. Поэтому отловить эту мессагу не удастся. :( Без бубна...


Григорьев Антон   (2008-08-08 15:45:00) [8]

Когда API-шный диалог открыт в модальном режиме, он время от времени посылает родительскому окну сообщение WM_ENTERIDLE.


Игорь Шевченко   (2008-08-08 14:55:00) [9]


> А "классические" - это значит, что чаще всего?


Классические - это на WinAPI. Это разработанные в то время, когда еще VCL не было :)


ProgRAMmer Dimonych   (2008-08-08 13:33:00) [10]

> Игорь Шевченко ©   (08.08.08 13:21) [1]

Понятно. А "классические" - это значит, что чаще всего?


Игорь Шевченко   (2008-08-08 13:21:00) [11]

В классических приложениях реализовывают через WM_TIMER


Наверх

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