Головна сторінка
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;
було
Size : LongInt;
починати
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.62 MB
Час: 0.041 c
6-86066
k-sergey
2002-10-30 11:38
2002.12.26
Як відрубати немає в потім включити його ...


3-85875
daimon
2002-12-08 18:11
2002.12.26
тонкий клієнт


3-85872
antoniz
2002-12-04 09:38
2002.12.26
Підкажіть по переиндексации в Paradox.


1-85885
Кокандокало
2002-12-16 19:44
2002.12.26
Великий обсяг даних в TTreeView і проблеми з їх перемальовуванням


1-85931
Влад
2002-12-17 14:36
2002.12.26
Як ???





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська