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

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.038 c
1-1121338623
BANick
2005-07-14 14:57
2005.07.31
обясните как переопределить interface (IBindStatusCallback)


3-1118302398
Lenik
2005-06-09 11:33
2005.07.31
Как из программы на делфи запустить встроенную процедуру SQL серв


1-1120763531
Kastusik
2005-07-07 23:12
2005.07.31
Перерисовка в TListView


4-1117876588
Random(256)
2005-06-04 13:16
2005.07.31
Как установить соединение без компонентов...


1-1121353931
Леха
2005-07-14 19:12
2005.07.31
Размер файлов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский