Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MDI окна


Страницы:   1 2

Sergey_b ©   (2006-09-28 11:31:00) 

Здравствуйте все.
Как свернуть дочернее окно на StatusBar?
Заранее благодарен.


Игорь Шевченко   (2006-09-28 14:27:00) [1]

Ketmar ©   (28.09.06 12:42) [24]


> это понятно. я предлагал при сворачивании создавать новое
> окно, недочернее. ну и грохать потом. или нечно вроде этого.
>  %-)


Криво, но пытается работать:

unit Child;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
 TForm2 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   FHSWindow: HWND;
   procedure WMSysCommand(var Message: TWmSysCommand); message WM_SYSCOMMAND;
 end;

var
 Form2: TForm2;

implementation

{$R *.DFM}

const
 AClassName = 'HSFake';
var
 wc: WNDCLASSEXA;

function FakeWindowWndProc (Wnd: HWND; Message: UINT; wParam: WPARAM;
 lParam: LPARAM): LRESULT; stdcall;
var
 FormInstance: TForm2;
begin
 case Message of
 WM_NCCREATE:
   begin
     FormInstance := TForm2(
       PCreateStruct(LParam)^.lpCreateParams);
     SetWindowLongA(Wnd, 0, Integer(FormInstance));
   end;
 WM_SYSCOMMAND:
   begin
     Result := 0;
     FormInstance := TForm2(GetWindowLong(Wnd, 0));
     case wParam and $FFF0 of
     SC_RESTORE:
       begin
         ShowWindow(Wnd, SW_HIDE);
         ShowWindow(FormInstance.Handle, SW_SHOW);
         Exit;
       end;
     SC_MAXIMIZE:
       Exit;
     SC_CLOSE:
       begin
         ShowWindow(Wnd, SW_HIDE);
         FormInstance.Close;
         Exit;
       end;
     end;
   end;
 end;
 Result := DefWindowProcA(Wnd, Message, wParam, lParam);
end;

{ TForm2 }

procedure TForm2.WMSysCommand(var Message: TWmSysCommand);
begin
 if (FHSWindow <> 0) and ((Message.CmdType and $FFF0) = SC_MINIMIZE) then begin
   ShowWindow(Handle, SW_HIDE);
   ShowWindow(FHSWindow, SW_SHOWMINNOACTIVE);
 end else
   inherited;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
 if FHSWindow <> 0 then begin
   DestroyWindow(FHSWindow);
   FHSWindow := 0;
 end;
 FHSWindow := CreateWindowExA(0, AClassName, nil,
   WS_OVERLAPPEDWINDOW, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
   Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), HWND_DESKTOP, 0,
   HInstance, Self);
 Win32Check(FHSWindow <> 0);
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
 if FHSWindow <> 0 then
   DestroyWindow(FHSWindow);
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;

initialization
 FillChar (wc, SizeOf(wc), 0);
 wc.cbSize := SizeOf(wc);
 wc.lpszClassName := AClassName;
 wc.cbWndExtra := 4;
 wc.hInstance := HInstance;
 wc.lpfnWndProc := @FakeWindowWndProc;
 wc.hCursor := LoadCursor (0, IDC_ARROW);
 wc.hbrBackground := HBRUSH(GetStockObject(WHITE_BRUSH));
 RegisterClassExA (wc);
finalization
 UnregisterClassA(AClassName, HInstance);
end.


unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Menus;

type
 TForm1 = class(TForm)
   MainMenu1: TMainMenu;
   File1: TMenuItem;
   New1: TMenuItem;
   procedure New1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation
uses
 Child;

{$R *.DFM}

procedure TForm1.New1Click(Sender: TObject);
begin
 with TForm2.Create(Application) do
   Show;
end;

end.


Sergey_b   (2006-09-28 14:10:00) [2]

Огромное-е спасибо за содержательные ответы


clickmaker   (2006-09-28 12:57:00) [3]

можно взять Spy++ и проверить


Palladin   (2006-09-28 12:55:00) [4]

предполагаю, да и гдето в инете натыкался по этому поводу... статья или FAQ-ли про окна access'а и word'а...


saxon   (2006-09-28 12:46:00) [5]


> Palladin ©   (28.09.06 12:45) [25]

предполагаете или знаете?


Palladin   (2006-09-28 12:45:00) [6]


> saxon   (28.09.06 12:42) [23]

в access вместе с дочерним окном создается еще одно, как предложил Ketmar, которое с WS_EX_APPWINDOW


Ketmar   (2006-09-28 12:42:00) [7]

>[22] Игорь Шевченко(c) 28-Sep-2006, 12:19
>Дочерние окна на панель задач не сворачиваются в
>принципе.
это понятно. я предлагал при сворачивании создавать новое окно, недочернее. ну и грохать потом. или нечно вроде этого. %-)


saxon   (2006-09-28 12:42:00) [8]


> Игорь Шевченко ©   (28.09.06 12:19) [22]

хм .. а у access, как уже говорил

> Palladin ©   (28.09.06 12:14) [21]

что за окна такие?
или там как то хитро с "обыкновенными" работают, может знаете как?


Игорь Шевченко   (2006-09-28 12:19:00) [9]

Дочерние окна на панель задач не сворачиваются в принципе.


Palladin   (2006-09-28 12:14:00) [10]


> хотя Word так и работает

не... вру... все таки access...


Palladin   (2006-09-28 12:11:00) [11]


> Ketmar ©   (28.09.06 11:56) [15]

а... невнимательно прочитал... все равно коряво :) хотя Word так и работает... все таки проще на статусбар :)


clickmaker   (2006-09-28 12:09:00) [12]


> Где про это можно почитать?

Delphi Help


Sergey_b   (2006-09-28 12:02:00) [13]

Что это?
А есть форум для новорожденных?
Где про это можно почитать?

>
>
> procedure TForm1.CreateParams(var Params: TCreateParams);
>  // должна быть объявлена как override;
> begin
>   inherited CreateParams(Params);
>
>   Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
> end;


Palladin   (2006-09-28 11:58:00) [14]


> Ketmar ©   (28.09.06 11:56) [15]
> clickmaker ©   (28.09.06 11:56) [16]


аа... не работает при fsMDIChild... только что для прикола попытался... внутрь даже влазить нехочу... лентяво...


clickmaker   (2006-09-28 11:56:00) [15]


> [9] Sergey_b   (28.09.06 11:50)


procedure TForm1.CreateParams(var Params: TCreateParams); // должна быть объявлена как override;
begin
  inherited CreateParams(Params);

  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;


Ketmar   (2006-09-28 11:56:00) [16]

>[11] Palladin(c) 28-Sep-2006, 11:53
>хем... проще на статусбар :)
однофигственно. ну подумаешь -- вместо отрисовки статусбара создать окошко со стилем WS_EX_APPWINDOW. ну и обрабатывать его сообщения. что там геморрой, что там. %-)


zdm   (2006-09-28 11:56:00) [17]

[1]


zdm   (2006-09-28 11:55:00) [18]

:)


Sergey_b   (2006-09-28 11:55:00) [19]


> хем... проще на статусбар :)

Как???


Palladin   (2006-09-28 11:53:00) [20]

хем... проще на статусбар :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо