Форум: "WinAPI";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
ВнизРазмещение окон двух копий приложения сверху вниз и т.д Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c