![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MDI окна
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]хем... проще на статусбар :)