Головна сторінка
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.61 MB
Час: 0.029 c
4-86213
Nick-From
2002-11-09 21:38
2002.12.26
Такий ось питання


14-86078
Igor_thief
2002-11-10 21:33
2002.12.26
перевершувати


1-85975
AFrolov
2002-12-15 10:12
2002.12.26
Як дізнатися GUID об'єкта який лежить наприклад в .exe?


1-86017
Фсщкгі
2002-12-16 14:16
2002.12.26
дерево :)


1-86007
dolmat
2002-12-16 10:14
2002.12.26
Що зробити з залізом?





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