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

Вниз

Модальные окна   Найти похожие ветки 

 
Strech   (2005-06-02 09:09) [0]

Приветствую!
помогите отобразить окно созданное функцией CreateWindow() модально.


 
Digitman ©   (2005-06-02 09:24) [1]

посмотри как это делает сам Борланд в методе TCustomForm.ShowModal (модуль Forms)


 
Strech   (2005-06-02 09:32) [2]

а я ничего там не понял


 
Digitman ©   (2005-06-02 09:38) [3]


> Strech   (02.06.05 09:32) [2]


как это "не понял" ?

так не бывает - тут понял, а тут не понял)

что не понял-то ? конкретно ?


 
3-PO   (2005-06-02 18:29) [4]


> Strech   (02.06.05 09:32) [2]

А ты уверен что поймешь если тебе тут кто-то объяснит?


 
alpet ©   (2005-06-02 18:36) [5]

Отличий от не модального вывода нет, просто обработка сообщений окна идет локально в функции ShowModal, и управление из функции возвращается, когда окно пользователь закрывает.


 
Abessalom   (2005-06-02 20:52) [6]

Во-первых, совсем необязательно создавать окна именно при помощи CreateWindow - также подойдет и DialogBox*** - создать шаблон в памяти, создать элементы управления и показать + дополнительно есть возможность визуального редактирования окна диалога на стадии разработки, например в программе ResourceWorkShop или BC++5, и проч. Рекомендую.
Во вторых - можно опереться на свои реализации, привожу примитивный но дорабатываемый пример. Мне разумеется неизвестно, ни как хранятся дескрипторы в вашем приложении, ни как создаются окна, поэтому я сделал все по наитию. Разумеется есть варианты. Тот же метод TCustomForm.ShowModal - построение списка отключаемых окон, и далее по тексту...

unit wasmWindow;

interface uses Windows, SysUtils, Classes, Messages;

type

 TWindow = class
 private
   FHandle: THandle;
   FIsModal: Boolean;
   FIsUnderModal: Boolean;
 public
   procedure WndProc(var Message: TMessage); virtual;
   constructor Create(Parent: THandle); virtual;
   function Show: Boolean; virtual;
   function ShowModal: Boolean; virtual;
   destructor Destroy; override;
 end;

var
 QueueMessage: TMsg;
 MainWindow: THandle = 0;
 WindowList: TList;

procedure ProcessMessages;
function CreateWindow(Parent: THandle): TWindow;

implementation

function CreateWindow(Parent: THandle): TWindow;
begin
 Result := TWindow.Create(Parent);
 Result.Show;
end;

procedure ProcessMessages;
begin
 while GetMessage(QueueMessage, 0, 0, 0) do begin
   TranslateMessage(QueueMessage);
   DispatchMessage(QueueMessage);
 end;
end;

{ TWindow }

constructor TWindow.Create(Parent: THandle);
var
 WCE, WCE_: TWndClassEx;
begin
 FillChar(WCE, SizeOf(WCE), 0);
 with WCE do begin
   cbSize := SizeOf(WCE);
   style := CS_VREDRAW or CS_HREDRAW or CS_DBLCLKS;
   lpfnWndProc := @DefWindowProc;
   lpszClassName := PChar(string(ClassName));
   hbrBackground := GetStockObject(WHITE_BRUSH);
   hIcon := LoadIcon(SysInit.HInstance, IDI_APPLICATION);
   hCursor := LoadCursor(SysInit.HInstance, IDC_ARROW);
 end;
 if not GetClassInfoEx(HInstance, WCE.lpszClassName, WCE_) then begin
   if (RegisterClassEx(WCE) = 0) then
     RaiseLastOSError;
 end;
 FHandle := CreateWindowEx(0, WCE.lpszClassName, WCE.lpszClassName,
   WS_POPUPWINDOW or WS_CAPTION or WS_THICKFRAME,
   CW_USEDEFAULT, CW_USEDEFAULT, 600, 400, Parent, 0, 0, nil);
 if FHandle = 0 then
   RaiseLastOSError;
 SetWindowLong(FHandle, GWL_WNDPROC, Integer(MakeObjectInstance(WndProc)));
 if MainWindow = 0 then MainWindow := FHandle;
 WindowList.Add(Self);
end;

destructor TWindow.Destroy;
var
 I: Integer;
begin
 if FIsModal then begin
   FIsModal := False;
   // не поддерживает наложение модальных окон, если
   // закрываем одно, то прочие бывшие модальными
   // становятся немодальными как все
   for I := 0 to WindowList.Count - 1 do
     TWindow(WindowList[I]).FIsUnderModal := False;
 end;
 SetWindowLong(FHandle, GWL_WNDPROC, Integer(@DefWindowProc));
 WindowList.Remove(Self);
 DestroyWindow(FHandle);
 if MainWindow = FHandle then PostQuitMessage(0);
 inherited;
end;

function TWindow.Show: Boolean;
begin
 Result := ShowWindow(FHandle, SW_SHOWNORMAL);
end;

function TWindow.ShowModal: Boolean;
var
 I: Integer;
 W: TWindow;
begin
 Result := ShowWindow(FHandle, SW_SHOWNORMAL);
 FIsModal := True;
 for I := 0 to WindowList.Count - 1 do begin
   W := TWindow(WindowList[I]);
   if W <> Self then
     W.FIsUnderModal := True;
 end;
end;

procedure TWindow.WndProc(var Message: TMessage);

 procedure Flash;
 var
   pfwi: FLASHWINFO;
   I: Integer;
 begin
   pfwi.cbSize := SizeOf(pfwi);

   for I := WindowList.Count - 1 downto 0 do
     with TWindow(WindowList[I]) do
       if FIsModal then begin
         pfwi.hwnd := FHandle;
         Break;
       end;

   pfwi.dwFlags := FLASHW_CAPTION or FLASHW_TIMER;
   pfwi.dwTimeout := 100;
   pfwi.uCount := 3;
   FlashWindowEx(pfwi);
   MessageBeep(0)
 end;

 procedure Default;
 begin
   with Message do
     Result := DefWindowProc(FHandle, Msg, wParam, lParam)
 end;

begin
 with Message do
   case Msg of
     WM_CLOSE, WM_DESTROY, WM_QUIT: Free;
     WM_LBUTTONDBLCLK: CreateWindow(MainWindow).ShowModal;
     WM_MOUSEACTIVATE:
       if FIsUnderModal then begin
         Result := MA_NOACTIVATEANDEAT;
         Flash;
       end
       else
         Default;
   else
     Default
   end;
end;

initialization

 WindowList := TList.Create;

finalization

 WindowList.Free;

end.



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

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

Наверх




Память: 0.49 MB
Время: 0.065 c
14-1120981119
Kvartirant777
2005-07-10 11:38
2005.07.31
Едем в Крым?! :)


1-1121090924
webpauk
2005-07-11 18:08
2005.07.31
Глюки с закрытием приложения


6-1113911224
Dysan
2005-04-19 15:47
2005.07.31
как послать http запрос и как получит ответ?


1-1121087371
webpauk
2005-07-11 17:09
2005.07.31
Удаление компонента изнутри


4-1117652496
Ralf
2005-06-01 23:01
2005.07.31
Dislpay Frequency