Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.10;
Скачать: CL | DM;

Вниз

Размещение окон двух копий приложения сверху вниз и т.д   Найти похожие ветки 

 
bobo ©   (2002-12-23 13:58) [0]

Привет, мастера !

Хочется расположить окна двух копий своего приложения каскадом, или сверху вниз или слева направо (при нажатии последовательно Ctrl на Taskbar и вызове стандартного popup меню по правой кнопке мыши) - как это возможно для проводника и многих других приложений. Как организовать анализ этой ситуации внутри приложения ? Какое сообщение посылается при выборе опций popup меню "каскадом", "слева направо", "сверху вних" ?

Заранее спасибо за ответ.


 
Игорь Шевченко ©   (2002-12-23 14:15) [1]

А для каких приложений это возможно ? Сколько не тыкал по таскбару - не нашел. Проводник - это своего рода MDI-приложение, там и есть сообщения WM_MDICASCADE, WM_MDITILE и т.д.


 
Игорь Шевченко ©   (2002-12-23 14:40) [2]

Прошу прощения, не на том месте taskbar"а тыкал :-)
Сообщения окнам посылаются стандартные: WM_MOVE, MW_SIZE


 
bobo ©   (2002-12-23 18:06) [3]

Что-то не сростается. Кто знает ?


 
Слесарь Матерящийся ©   (2002-12-23 19:02) [4]

Я бы сделел файл, один для всех экземпляров проги, в который писал бы положение последнего окошка. Следующий экземпляр при открытии его читает и соотв. позиционируется, затем снова пишет в файл позицию и т.д.
Можно обычный файл, можно mapped. Или реестр, но это геморрой...


 
Anatoly Podgoretsky ©   (2002-12-24 07:42) [5]

Зачем Виндоус основан на сообщениях, вот пусть эти приложения и обмениваются зарегистрироваными сообщениями и договариваются кто где разместится и какого будет размера.


 
bobo ©   (2002-12-26 12:03) [6]

Дело в том, что для приложений, сделанных на MS Visual Basic и C++ эта возможность работает по умолчанию (тот же Total Commander позволяет такое проделывать). Вот я и подумал, что может в Delphi есть какие-то скрытые свойства или методы, позволяющие организовать эту операцию автоматом.


 
bobo ©   (2002-12-26 12:34) [7]

Господа, я напал на след. Вот тестовый код:

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. Приложение не минимизируется при нажатии на соответствующую кнопку.

Подумаем вместе ?


 
Игорь Шевченко ©   (2002-12-26 12:49) [8]


> procedure TForm1.FormCreate(Sender: TObject);
> begin
> CreateParams(p);
> end;


Убрать :-)


 
bobo ©   (2002-12-26 12:54) [9]

Тот же эффект достигается и в этом варианте:

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.


 
bobo ©   (2002-12-26 12:56) [10]

Насчет убрать - это точно. Сам допер.


 
bobo ©   (2002-12-26 17:22) [11]

Работающий вариант

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.

Спасибо не говорю. Помощи не дождался.
Всем привет



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

Текущий архив: 2003.02.10;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
14-29001
Supreme
2003-01-23 23:59
2003.02.10
Фильмосоздание


1-28907
KoHe4Ho }|{e 6ot
2003-01-30 19:01
2003.02.10
Apach+Delphi


4-29164
BlackSun
2002-12-29 00:34
2003.02.10
Обращение к винту


1-28840
Гость Андрей
2003-02-02 20:45
2003.02.10
DLL и командная строка


1-28738
weRUs
2003-01-30 03:14
2003.02.10
2 in 1: Память, дата(время)