Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.21;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.007 c
15-1217507399
ekto
2008-07-31 16:29
2008.09.21
Подскажите профайлер для D7. Басплатный.


2-1218446900
REX2008
2008-08-11 13:28
2008.09.21
Подключение звукового файла


2-1218531259
mandalay
2008-08-12 12:54
2008.09.21
Как из фрейма обратится к форме на которой лежит этот фрейм?


15-1217006131
Stan
2008-07-25 21:15
2008.09.21
Киноактер Пуговкин умер


2-1218116675
9899100
2008-08-07 17:44
2008.09.21
Загрузка DLL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский