Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.21;
Скачать: CL | DM;

Вниз

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

 
ProgRAMmer Dimonych ©   (2008-08-08 13:07) [0]

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


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

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


 
ProgRAMmer Dimonych ©   (2008-08-08 13:33) [2]

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

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


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


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


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


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

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


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

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

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

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

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


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

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


 
ProgRAMmer Dimonych ©   (2008-08-09 12:10) [7]

> Григорьев Антон ©   (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, вроде как, можно петельку заполучить каким-то образом, но мои скромные попытки вместо успеха увенчались зависанием приложения. :(


 
Leonid Troyanovsky ©   (2008-08-09 13:26) [8]

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


 
ProgRAMmer Dimonych ©   (2008-08-09 14:18) [9]

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

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


 
ProgRAMmer Dimonych ©   (2008-08-09 16:07) [10]

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

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 22:00) [11]

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



Страницы: 1 вся ветка

Текущий архив: 2008.09.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
2-1218563419
Mozgan
2008-08-12 21:50
2008.09.21
Разработка инсталлятора


15-1217657301
ggg
2008-08-02 10:08
2008.09.21
Исходники преферанса


15-1217595436
stas
2008-08-01 16:57
2008.09.21
Вопрос знатокам C#


3-1206013469
Евгений Р.
2008-03-20 14:44
2008.09.21
Удаленные записи в DBF


2-1218377845
mefodiy
2008-08-10 18:17
2008.09.21
Количество записей в отфильтрованной ADOQuery