Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.26;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.038 c
1-85999
Alpine
2002-12-16 12:50
2002.12.26
Как запретить своему приложению не запускаться больше одного раза


3-85853
Tankist
2002-12-07 13:24
2002.12.26
DELETE


14-86183
makt_liCh
2002-12-07 14:21
2002.12.26
Скоро олимпиада


1-85967
PVOzerski
2002-12-15 11:37
2002.12.26
Нужен совет по алгоритму


6-86064
Алексей Кононов
2002-10-31 09:27
2002.12.26
Как проверить корректность E-mail на Delphi





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