![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Размещение окон двух копий приложения сверху вниз и т.д [D5, Win95/98, WinME, NT4, Win2k, WinXP]
bobo © (2002-12-23 13:58:00)Привет, мастера !
Хочется расположить окна двух копий своего приложения каскадом, или сверху вниз или слева направо (при нажатии последовательно Ctrl на Taskbar и вызове стандартного popup меню по правой кнопке мыши) - как это возможно для проводника и многих других приложений. Как организовать анализ этой ситуации внутри приложения ? Какое сообщение посылается при выборе опций popup меню "каскадом", "слева направо", "сверху вних" ?
Заранее спасибо за ответ.
bobo (2002-12-26 17:22:00) [1]Работающий вариант
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure CreateParams(var Params: TCreateParams); override;
procedure AppMinimize(Sender: TObject);
procedure AppActivate(Sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.AppActivate(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.AppMinimize(Sender: TObject);
begin
Application.Restore;
Form1.WindowState := wsMinimized;
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent := GetDesktopWindow;
Application.OnMinimize := AppMinimize;
Application.OnActivate := AppActivate;
end;
end.
Спасибо не говорю. Помощи не дождался.
Всем привет
bobo (2002-12-26 12:56:00) [2]Насчет убрать - это точно. Сам допер.
bobo (2002-12-26 12:54:00) [3]Тот же эффект достигается и в этом варианте:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
h: HWND;
begin
Form1.ParentWindow := GetDesktopWindow;
end;
end.
Игорь Шевченко (2002-12-26 12:49:00) [4]
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> CreateParams(p);
> end;
Убрать :-)
bobo (2002-12-26 12:34:00) [5]Господа, я напал на след. Вот тестовый код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure CreateParams(var Params: TCreateParams); override;
public
{ Public declarations }
end;
var
Form1: TForm1;
p: TCreateParams;
implementation
{$R *.DFM}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent := GetDesktopWindow;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateParams(p);
end;
end.
В результате, когда запускаю две копии приложения и кликаю при нажатой Ctrl по заголовкам "Form1" и затем по правой кнопке мыши выбираю "Слева направо", все работает как надо.
Недостатки:
1. После того, как объявляю Desktop parent"ом, на панели задач появляется одновременно и заголовок приложения и формы
2. Приложение не минимизируется при нажатии на соответствующую кнопку.
Подумаем вместе ?
bobo (2002-12-26 12:03:00) [6]Дело в том, что для приложений, сделанных на MS Visual Basic и C++ эта возможность работает по умолчанию (тот же Total Commander позволяет такое проделывать). Вот я и подумал, что может в Delphi есть какие-то скрытые свойства или методы, позволяющие организовать эту операцию автоматом.
Anatoly Podgoretsky (2002-12-24 07:42:00) [7]Зачем Виндоус основан на сообщениях, вот пусть эти приложения и обмениваются зарегистрироваными сообщениями и договариваются кто где разместится и какого будет размера.
Слесарь Матерящийся (2002-12-23 19:02:00) [8]Я бы сделел файл, один для всех экземпляров проги, в который писал бы положение последнего окошка. Следующий экземпляр при открытии его читает и соотв. позиционируется, затем снова пишет в файл позицию и т.д.
Можно обычный файл, можно mapped. Или реестр, но это геморрой...
bobo (2002-12-23 18:06:00) [9]Что-то не сростается. Кто знает ?
Игорь Шевченко (2002-12-23 14:40:00) [10]Прошу прощения, не на том месте taskbar"а тыкал :-)
Сообщения окнам посылаются стандартные: WM_MOVE, MW_SIZE
Игорь Шевченко (2002-12-23 14:15:00) [11]А для каких приложений это возможно ? Сколько не тыкал по таскбару - не нашел. Проводник - это своего рода MDI-приложение, там и есть сообщения WM_MDICASCADE, WM_MDITILE и т.д.