Кнопки у системному меню
Мені потрібно деактивувати усі кнопки в системному меню. Наступний код деактивує лише кнопку "Закрити". Чому? І як деактивувати решту кнопок?
procedure TMainForm.FormCreate(Sender: TObject); var hMenu: THandle; begin hMenu := GetSystemMenu(Handle, False); EnableMenuItem(hMenu, SC_MINIMIZE, MF_GRAYED); EnableMenuItem(hMenu, SC_MAXIMIZE, MF_GRAYED); EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED); end;
> І як деактивувати решту кнопок? >у форми є властивість BorderIcons
Ні, BorderIcons не підходить. Наприклад, за допомогою BorderIcons не можна налаштувати меню так, що буде видно лише одну кнопку "Закрити" в затемненому стані (MF_GRAYED).
> що буде видно тільки одну кнопку "Закрити" в затемненому > стані (MF_GRAYED).навіщо потрібна кнопка, яка все одно не працює?
> код деактивує лише кнопку "Закрити". Чому? І як > деактивувати інші кнопки? http://groups.google.com/group/borland.public.delphi.winapi/msg/186a95701207b5b4
> http://groups.google.com/group/borland.public.delphi.winapi/msg/186a95701207b5b4 >Незрозуміло, що за штучні "обмеження системи" саме для кнопок згорнути та розгорнути вікно. А для закрити, здавалося б важливішої кнопки – обмежень немає. На мою думку, це баг явний.
> Незрозуміло, що за штучні "обмеження системи" саме > для кнопок згорнути та розгорнути вікно. А для закриття, здавалося > важливішої кнопки - обмежень немає. На мою думку, це > баг явний. Обмеження, IMHO, стосуються не тільки згаданих кнопок, тільки про це мало відомо, бо не документовано. У дельфі в таких випадках просто видаляютьнепотрібні пункти.
> Як Borland-вівці примудрилися це зробити, адже Delphi – > красива обгортка WinAPI? Якщо вибрати один biMaximize, то буде аналогічно. Справа не в борланді, вони роблять одне і теж (Forms.pas): procedure TCustomForm.WMNC );
Мабуть, MS вважає, що якщо ці можливості не потрібні, то їм немає місця в системному меню.
> Нічого не зрозумів. Чи можна докладніше? Ну, ось чого я зараз незрозумілого сказав?
procedure TForm1.CreateParams(var Params: TCreateParams); // override; begin inherited; Params.Style := Params.Style and not WS_MINIMIZEBOX and not WS_MAXIMIZEBOX; end;
Тобто системне меню конфігурується при створенні вікна функціями CreateWindow, CreateWindowEx. А потім на ньому хоч кілок чеші, EnableMenuItem зможе змінити стан лише SC_CLOSE. Я правильно зрозумів? :)
> Тобто системне меню конфігурується під час створення вікна функціями > CreateWindow, CreateWindowEx. А потім на ньому хоч кілок чеші Застосування може виконувати його власний контроль або заохочення відповідно до WM_INITMENU message that is sent before any menu is displayed.
Насправді, в обробнику WM_INITMENU можна засерити максі/мінімізацію, але стан кнопок вже не зміниться.