Форум: "Начинающим";
Текущий архив: 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