Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.01 c
3-28618
vopros
2003-01-23 11:07
2003.02.10
Проблема с хранение jpg в Interbase


1-28693
edell
2003-01-29 22:09
2003.02.10
блокировка клавы


14-29002
Nick_N_A
2003-01-24 06:02
2003.02.10
C++


3-28642
John
2003-01-23 14:24
2003.02.10
Експорт/Импорт и DBGrid


14-29036
kostya2000
2003-01-17 23:08
2003.02.10
Анекдот!!! (Я просто ржал, ИМХО классный анекдот)





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