Текущий архив: 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.49 MB
Время: 0.006 c