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

Вниз

Как свернуть/развернуть все MDI-окна в моём приложении?   Найти похожие ветки 

 
Volf_555   (2006-02-14 22:33) [0]

В одной из лабораторок есть задание по сабжу.
Искал нужную процедуру... так и не нашёл.
Может вы подскажете? :)

Искал нужные события по следующему образцу:

procedure TfrMain.CloseAll1Click(Sender: TObject);
var i: integer;
begin
 for i:= 0 to MdiChildCount - 1 do
   MDIChildren[i].Close;
end;


Вместо Close по идее должны быть события Maximize и Mininize, но их нет...


 
Игорь Шевченко ©   (2006-02-14 23:48) [1]

Лабораторки обычно делаются самостоятельно или после консультаций с преподавателем. Или ты с ним через форум общаешься ?

Кстати, достаточно развернуть одно окно.


 
Volf_555   (2006-02-15 00:38) [2]


> Лабораторки обычно делаются самостоятельно или после консультаций
> с преподавателем. Или ты с ним через форум общаешься ?

Нет :-) Просто консультаций практически нет и через форум можно получить ответ намного быстрее


> Кстати, достаточно развернуть одно окно.

Как тогда развернуть одно MDI-окно? (события Maximize нет)


 
Игорь Шевченко ©   (2006-02-15 11:28) [3]


> Просто консультаций практически нет и через форум можно
> получить ответ намного быстрее


Видишь ли, отвечающим участникам форума лабы делать не надо. Нет у них такой потребности.


> Как тогда развернуть одно MDI-окно?


Изучить сообщения WM_SYSCOMMAND и WM_MDIMAXIMIZE


 
Volf_555   (2006-02-15 14:58) [4]


> Игорь Шевченко
> Изучить сообщения WM_SYSCOMMAND и WM_MDIMAXIMIZE

Написал следующий код:

procedure TfMDI.N1Click(Sender: TObject);
var
i: integer;
begin
for i:= 0 to MdiChildCount - 1 do
begin
 SendMessage(MDIChildren[i].Handle,WM_MDIMAXIMIZE,0,0);
//  ShowMessage(MdiChildren[i].Caption);
end;
end;

В результате ничего не происходит, хотя ShowMessage... показывает заголовки всех MDI-окон. Что может быть не так?


 
begin...end ©   (2006-02-15 15:14) [5]

> Volf_555   (15.02.06 14:58) [4]

> SendMessage(MDIChildren[i].Handle,WM_MDIMAXIMIZE,0,0)

Не туда шлёте.

An application sends the WM_MDIMAXIMIZE message to a multiple document interface (MDI) client window to maximize an MDI child window.

WM_MDIMAXIMIZE  
wParam = (WPARAM) (HWND) hwndMax; // handle of child to maximize
lParam = 0;                       // not used; must be zero


SendMessage(ClientHandle, WM_MDIMAXIMIZE, ..., 0)


 
Игорь Шевченко ©   (2006-02-15 15:17) [6]

Volf_555   (15.02.06 14:58) [4]

Я вроде написал "изучить". Или русский язык здесь не в почете ?

ЗЫ: Я свои лабы давным-давно сделал и сдал, без форума. Это намек такой.


 
Volf_555   (2006-02-15 17:59) [7]


> begin...end ©   (15.02.06 15:14) [5]
> > Volf_555   (15.02.06 14:58) [4]
>
> > SendMessage(MDIChildren[i].Handle,WM_MDIMAXIMIZE,0,0)
>
> Не туда шлёте.
>
> An application sends the WM_MDIMAXIMIZE message to a multiple
> document interface (MDI) client window to maximize an MDI
> child window.
>
> WM_MDIMAXIMIZE  
> wParam = (WPARAM) (HWND) hwndMax; // handle of child to
> maximize
> lParam = 0;                       // not used; must be zero
>
> SendMessage(ClientHandle, WM_MDIMAXIMIZE, ..., 0)


Пробывал и  ClientHandle, и MDIChildren[i].ClientHandle - бесполезно


 
begin...end ©   (2006-02-15 18:17) [8]

> Volf_555   (15.02.06 17:59) [7]

Код можно увидеть?

Кроме того, после [4] мне непонятно, действительно ли нужно тут непосредственно работать на API (вначале я думал, что нужно, потому что вопрос задан именно в этой конференции), или подойдёт и свойство WindowState.


 
Volf_555   (2006-02-15 20:30) [9]

Вот коддинг:

Doc.dpr:

program Doc;

uses
 Forms,
 uDoc in "uDoc.pas" {fDoc},
 uMDI in "uMDI.pas" {fMDI};

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TfMDI, fMDI);
 Application.Run;
end.


uDoc.pas:
unit uDoc;

interface

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

type
 TfDoc = class(TForm)
   RichEdit1: TRichEdit;
   OpenDialog1: TOpenDialog;
   SaveDialog1: TSaveDialog;
   MainMenu1: TMainMenu;
   mFile: TMenuItem;
   mOpen: TMenuItem;
   mSave: TMenuItem;
   procedure mOpenClick(Sender: TObject);
   procedure mSaveClick(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 fDoc: TfDoc;

implementation

{$R *.dfm}

procedure TfDoc.mOpenClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
richedit1.Clear;
richedit1.Lines.LoadFromFile(opendialog1.FileName);
end;
end;

procedure TfDoc.mSaveClick(Sender: TObject);
begin
if savedialog1.Execute then
richedit1.Lines.SaveToFile(savedialog1.FileName);
end;

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

end.


uMDI.pas:

unit uMDI;

interface

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

type
 TfMDI = class(TForm)
   MainMenu1: TMainMenu;
   mWind: TMenuItem;
   mNew: TMenuItem;
   mCascade: TMenuItem;
   mHor: TMenuItem;
   mVert: TMenuItem;
   mIcons: TMenuItem;
   C1: TMenuItem;
   N1: TMenuItem;
   procedure mNewClick(Sender: TObject);
   procedure mCascadeClick(Sender: TObject);
   procedure mHorClick(Sender: TObject);
   procedure mVertClick(Sender: TObject);
   procedure mIconsClick(Sender: TObject);
   procedure C1Click(Sender: TObject);
   procedure N1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 fMDI: TfMDI;

implementation

{$R *.dfm}

procedure TfMDI.mNewClick(Sender: TObject);
var
NewF:TFDoc;
begin
NewF:=TFDoc.Create(Application);
NewF.Caption:="Окно "+IntToStr(MDIChildCount);
NewF.Show;
end;

procedure TfMDI.mCascadeClick(Sender: TObject);
begin
Cascade;
Tile;
end;

procedure TfMDI.mHorClick(Sender: TObject);
begin
TileMode:=tbHorizontal;
Tile;
end;

procedure TfMDI.mVertClick(Sender: TObject);
begin
TileMode:=tbVertical;
Tile;
end;

procedure TfMDI.mIconsClick(Sender: TObject);
begin
Tile;
end;

procedure TfMDI.C1Click(Sender: TObject);
{var
i: integer;}
begin
{ for i:= 0 to MdiChildCount - 1 do
 MDIChildren[i].;}
end;

procedure TfMDI.N1Click(Sender: TObject);
var
i: integer;
begin
for i:= 0 to MdiChildCount - 1 do
begin
 SendMessage(MdiChildren[i].ClientHandle,WM_MDIMAXIMIZE,0,0);
 //ShowMessage(MdiChildren[i].Caption);
end;
end;

end.


 
begin...end ©   (2006-02-15 20:44) [10]

> Volf_555   (15.02.06 20:30) [9]

> SendMessage(MdiChildren[i].ClientHandle,WM_MDIMAXIMIZE,0,0)

Внимательно посмотрите на [5]. Сообщение нужно посылать MDI-клиентскому окну, и в качестве параметра wParam нужно передавать дескриптор дочернего окна:

SendMessage(ClientHandle, WM_MDIMAXIMIZE, MDIChildren[...].Handle, 0)

Или, если можно обойтись средствами VCL, устанавливайте свойство WindowState у каждого дочернего окна в wsMaximized.


 
Volf_555   (2006-02-15 21:10) [11]

Всем спасибо! Решил проблему так:
SendMessage(ClientHandle,WM_SYSCOMMAND,SC_MINIMIZE,0); //для минимизиции всех MDI-окон
SendMessage(ClientHandle,WM_SYSCOMMAND,SC_MAXIMIZE,0); //для разворачивания всех MDI-окон


 
Anatoly Podgoretsky ©   (2006-02-15 21:11) [12]

Может вместо этой кнопочки procedure TfMDI.N1Click(Sender: TObject);, нажать соответствую кнопочку на окне и код даже писать не надо.


 
Volf_555   (2006-02-15 21:18) [13]


> Anatoly Podgoretsky ©   (15.02.06 21:11) [12]
> Может вместо этой кнопочки procedure TfMDI.N1Click(Sender:
>  TObject);, нажать соответствую кнопочку на окне и код даже
> писать не надо.

Это MDI-приложения - если нажать на кнопку Свернуть одного дочернего окна, то свернётся только это окно, а не все дочерние окна.
Такая же ситуация с Развернуть.


 
fellix   (2006-02-16 13:12) [14]

> Volf_555   (15.02.06 21:18) [13]
> ... свернётся только это окно, а не все дочерние окна ...

Ну так ловить OnResize, проверять WindowState и выполнять нужные действия с остальными окнами.



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

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

Наверх





Память: 0.49 MB
Время: 0.011 c
9-1129465753
!Trinix
2005-10-16 16:29
2006.05.07
Нужны кости


3-1142324067
Ega23
2006-03-14 11:14
2006.05.07
Утилита isql - какие ограничения?


2-1145529617
Байрам
2006-04-20 14:40
2006.05.07
Параллельная прокрутка двух TMemo


15-1144682248
Parus
2006-04-10 19:17
2006.05.07
глюк или не глюк


15-1145131202
Wog
2006-04-16 00:00
2006.05.07
Кнопка произвольной формы





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