{{notification.text}}

MirGames

DimonSoft
10.08.08 13:58
0
С помощью Интернета вытрудил вот такой код:

Код

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'е.

Использование диалогов из ресурсов - это, можно сказать, "условие задачи".
Отредактировано: 10.08.08 14:00
#1
mov, просто mov
10.08.08 16:51
0
Обязательно диалоги ?
#2
DimonSoft
10.08.08 23:25
0
Цитата(MegaI2 @ 10.08.2008 - 11:51) [snapback]84095[/snapback]

Обязательно диалоги ?

Такое маленькое условие задачи. Т.е. для данной конкретной задачи - обязательно.
#3
mov, просто mov
10.08.08 23:32
0
ну а чем тебе данный код не нравиться ?)) отловка WM_NULL не жрет дофига ресурсов ;)
#4
DimonSoft
10.08.08 23:37
0
Цитата(MegaI2 @ 10.08.2008 - 18:32) [snapback]84124[/snapback]

ну а чем тебе данный код не нравиться ?)) отловка WM_NULL не жрет дофига ресурсов ;)

Вот этим WM_NULL'ём и не нравится. Потому что этот WM_NULL - это такой костыль, который я вставил, чтобы временно добиться хоть чуть-чуть работающего кода. Определил отладчиком, что происходит в цикле после закрытия окна, и подкорректировал. Не есть good :(
#5
mov, просто mov
10.08.08 23:45
0
хм а в dlgproc ставить и возвращать 0 не пробовал ?
Отредактировано: 10.08.08 23:46
#6
DimonSoft
11.08.08 00:26
0
В общем и целом пока решил вот так:

Код

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);
  ExitProcess(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);
          SendMessage(MainHandle,WM_CLOSE,0,0);
        end; //IDCANCEL
      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 not(IsDialogMessage(MainHandle,Msg)) then
      begin
        TranslateMessage(Msg); DispatchMessage(Msg);
      end
    end
    else
      OnIdle;
end.


Прошу конструктивно покритиковать в плане разных утечек (если они есть).
Отредактировано: 11.08.08 00:28
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}