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

Вниз

Вопрос по MDI-приложению   Найти похожие ветки 

 
Strumpf ©   (2002-12-14 14:07) [0]

Можно ли принудить windows восстановить системные кнопки максимизированного дочернего окна?


 
Strumpf ©   (2002-12-14 17:38) [1]

Аууу, Мастера!


 
Strumpf ©   (2002-12-15 13:36) [2]

????


 
Alx2 ©   (2002-12-15 13:49) [3]

Попробуй на MDIForm (на главную) кинуть непустое MainMenu


 
Alx2 ©   (2002-12-15 13:50) [4]

Или даже пустое :)


 
Strumpf ©   (2002-12-15 16:47) [5]

>Alx2 © (15.12.02 13:49)
Честно говоря, ни х... не понял...


 
Alx2 ©   (2002-12-15 17:02) [6]

>Strumpf © (15.12.02 16:47)
На вкладке "стандартные" есть компонент MainMenu. Его кинь на родителя. Тогда системные кнопки дочернего будут доступными


 
Strumpf ©   (2002-12-15 17:28) [7]

> Alx2 © (15.12.02 17:02)

Спасибо! Знаю... Но проблема - не в этом. Проблема,собственно, в http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1039813772&n=0 . Т.е. при уже имеющемся главном меню (но не TMainMenu,а TElMainMenu!!!) при некоторых условиях исчезают системные кнопки максимизированного дочернего окна (ну, те, что справа от всех пунктов главного меню TElMainMenu), а также иконка дочернего окна (она - слева!). Тут хоть весь обкидайся TMainMenu ничего не сделаешь! Внимание, ВОПРОС: какие функции API "отвечают" за отрисовку этих самых системных кнопок и иконки и КАК их применить, чтобы заново отрисовалось главное меню (но только не DrawMenuBar - не сработает!)?


 
Strumpf ©   (2002-12-16 09:01) [8]

Одно из двух - либо вопрос слишклм сложный, либо сформулирован непонятно... Попробую исправить второе.
Есть главное MDI-окно (fsMDIform). На нём - два компонента: меню TElMainMenu и кнопка TButton, нажатие на которой только переводит в видимый/невидимый режим один из самых верхних пунктов меню TElMainMenu. Есть также ОДНО дочернее окно (fsMDIChild, как создано - значения НЕ ИМЕЕТ), у которого нет абсолютно ничего (пустое окно). Далее. Максимизируем дочернее окно - в полосе меню TElMainMenu появляются: в левой части - иконка дочернего окна, а в правой - три системные кнопки, управляющие дочерним окном. Теперь нажимаем на кнопку TButton - один из верхних пунктов TElMainMenu переводится в невидимый режим. НО. Одновременно с этим исчезают иконка и системные кнопки дочернего окна и им (этим окном) уже управлять практически невозможно. Теперь, надеюсь, стало значительно понятнее, о чём речь?
Положение можно исправить, например, так. Перед тем, как спрятать пункт меню, переводим дочернее окно в нормальное состояние (wsNormal), прячем пункт меню, переводим окно назад в wxMaximized. А чтобы ничего не мелькало - блокируем функцией LockWindowUpdate(Handle). Но это - слишком коряво. Может быть у кого найдётся решение поэлегантнее?


 
Игорь Шевченко ©   (2002-12-16 12:30) [9]


unit AbstractMDIChildForm;
{$IFDEF VER100}
{$DEFINE DELPHI3&4}
{$ENDIF}

{$IFDEF VER120}
{$DEFINE DELPHI3&4}
{$ENDIF}

{$IFDEF VER140}
{$DEFINE DELPHI3&4}
{$ENDIF}

interface

uses
Messages, Classes, Windows, Controls, Forms;

type
TfAbstractMDIChild = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
function FormHelp(Command: Word; Data: Integer;
var CallHelp: Boolean): Boolean;
private
procedure WMMDIActivate(var Msg: TWMMDIActivate); message WM_MDIACTIVATE;
public
constructor Create (AOwner : TComponent); override;
constructor CreateModal (AOwner : TComponent); virtual;
end;

implementation

{$R *.DFM}

constructor TfAbstractMDIChild.Create(AOwner: TComponent);
begin
inherited;
FormStyle := fsMDIChild;
end;

constructor TfAbstractMDIChild.CreateModal(AOwner: TComponent);
begin
inherited Create(AOwner);
Position := poMainFormCenter;
end;

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

procedure TfAbstractMDIChild.FormCreate(Sender: TObject);
begin
PixelsPerInch := Screen.PixelsPerInch;
end;

procedure TfAbstractMDIChild.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_ESCAPE) then
if (FormStyle = fsMDIChild) then
Close()
else
ModalResult := mrCancel
else if (Key = VK_F10) and (Shift = []) and Assigned(PopupMenu)then begin
PopupMenu.Popup(ClientOrigin.X+2,ClientOrigin.Y+2);
Key:=0;
end;
end;

procedure TfAbstractMDIChild.WMMDIActivate(var Msg: TWMMDIActivate);
var
Style: Longint;
begin
if (Msg.ActiveWnd = Handle) and (biSystemMenu in BorderIcons) then begin
Style := GetWindowLong(Handle, GWL_STYLE);
if (Style and WS_MAXIMIZE <> 0) and (Style and WS_SYSMENU = 0) then
{$IFDEF DELPHI3&4}
SetWindowLong(Handle, GWL_STYLE, Style or WS_SYSMENU);
{$ELSE}
SendMessage(Handle, WM_SIZE, SIZE_RESTORED, 0);
{$ENDIF}
end;
inherited;
end;

function TfAbstractMDIChild.FormHelp(Command: Word; Data: Integer;
var CallHelp: Boolean): Boolean;
begin
CallHelp := (Command = HELP_QUIT) OR (HelpContext = 0);
if CallHelp then
Result := true
else
Result := WinHelp(WindowHandle,PChar(Application.HelpFile),HELP_CONTEXT,HelpContext);
end;

end.

Ключевой метод - WMMDIActivate


 
Strumpf ©   (2002-12-16 16:30) [10]

> Игорь Шевченко © (16.12.02 12:30)

Увы, функция SetWindowLong(Handle, GWL_STYLE, Style or WS_SYSMENU) не спасает положения...


 
Игорь Шевченко ©   (2002-12-16 17:21) [11]

Strumpf © (16.12.02 16:30)

Пардон, невнимательно прочитал вопрос. Про TElMainMenu сказать ничего не могу.


 
Strumpf ©   (2002-12-16 17:30) [12]

> Игорь Шевченко © (16.12.02 17:21)

Да, когда-то были проблемы аналогичного рода со стандартным компонентом. Borland с ними справился, но, видимо, коряво, потому что при наследованиях этот глюк вылезает...


 
Толик ©   (2002-12-16 20:03) [13]

Это не что иное, как один из багов производства Борланда. Появился он ещё в пятых Делфях и лечится правкой исходников класса TCustomForm. Там совсем немного работы, завтра я посмотрю, что там надо править и выложу этот код. Решение этой проблемы было найдено в своё время где-то на просторах сети, так что можно поискать самостоятельно.


 
Strumpf ©   (2002-12-16 20:48) [14]

> Толик © (16.12.02 20:03)

Конечно же я искал везде. Но пока не нашел. Буду продолжать поиск и дальше, пока не найду решения сам или с помощью кого-либо или чего-либо. Это точно! Я буду Вам весьма признателен, если сможете мне чем-либо помочь...


 
Ученик ©   (2002-12-16 21:25) [15]

Это не поможет ?

procedure UpdateMDIMenu;
var
Size : LongInt;
begin
if (Application.MainForm <> NIL) then
with Application.MainForm do
if (ActiveMDIChild <> NIL) then
with ActiveMDIChild do
if WindowState = wsMaximized then begin
Size := ClientWidth + (Longint(ClientHeight) shl 16);
SendMessage(Handle, WM_SIZE, SIZE_RESTORED, Size);
SendMessage(Handle, WM_SIZE, SIZE_MAXIMIZED, Size);
end;
end;


 
Strumpf ©   (2002-12-16 23:31) [16]

> Ученик © (16.12.02 21:25)

Да, пожалуй, это много лучше чем у Strumpf © (16.12.02 09:01) (хотя идея - та же). Спасибо! Правда, не совсем понятны хитрые манипуляции с переменной Size. Всё работает и при нулевом её значении... Единственный недостаток предложенного способа - небольшое мерцание системных кнопок дочернего окна. Не теряю надежды на обещанное Толик © (16.12.02 20:03).



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

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

Наверх




Память: 0.51 MB
Время: 0.011 c
3-85783
Андрусь
2002-12-03 20:37
2002.12.26
как оптимально обработать разделенный запрос


1-85981
iNew
2002-12-11 09:09
2002.12.26
Такой процедурой вывожу данные из COM порта в Мемо


3-85795
Wic42
2002-12-06 00:07
2002.12.26
Delphi6-DBF


1-85885
Кокандокало
2002-12-16 19:44
2002.12.26
Большой объем данных в TTreeView и проблемы с их перерисовкой


1-85936
17.12.2002
2002-12-17 15:54
2002.12.26
HTML