-
Мне нужно деактивировать все кнопки в системном меню. Следующий код деактивирует только кнопку "Закрыть". Почему? И как деактивировать остальные кнопки? 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).
зачем нужна кнопка, которая все равно не работает?
-
-
-
> DVM © (27.08.08 10:55) [5]
> Непонятно, что за искусственные "ограничения системы" именно > для кнопок свернуть и развернуть окно. А для закрыть, казалось > бы более важной кнопки - ограничений нет. По-моему, это > баг явный.
Ограничения, IMHO, касаются не только упомянутых кнопок, только про это мало известно, бо не документировано. В дельфи в таких случаях просто удаляют ненужные пункты.
-- Regards, LVT.
-
> Leonid Troyanovsky © (27.08.08 09:40) [4]
Спасибо. Статью прочитал. Но, возникает еще один вопрос. Если в свойстве формы BorderIcons отключить biMinimize, а остальные флажки установить включенными, то при запуске приложения кнопка свернуть будет неактивной в затмненном состоянии. Для biMaximize аналогичная ситуация. Как Borland-овцы умудрились это сделать, ведь Delphi - красивая обертка WinAPI?
-
> Deltas © (27.08.08 16:04) [7]
> Как Borland-овцы умудрились это сделать, ведь Delphi - > красивая обертка WinAPI?
Если выбрать один biMaximize, то будет аналогично. Дело не в борланде, они делают одно и тоже (Forms.pas): procedure TCustomForm.WMNCCreate(var Message: TWMNCCreate);
Видимо, MS считает, что если эти возможности не нужны, то им нет места в системном меню.
-- Regards, LVT.
-
> Leonid Troyanovsky © (27.08.08 16:18) [8]
Ничего не понял. Можно подробнее? Я настриваю BorderIcons = [biSystemMenu, biMaximize]. При запуске программы, вижу, что кнопка "Свернуть" отображается затемненной, а все остальные - активными. Т.е., значит есть возможость отключить только кнопку "Свернуть". Модуль Forms.pas я смотрел, даже запускал прорамму по шагам со включнным флажком компилятора 'Use Debug DCUs'. Пока не понимаю, почему там отключается кнопка "Свернуть", а в моей процедуре (см. вопрос обсуждения) нет?
-
> Deltas © (27.08.08 16:33) [9] > Ничего не понял. Можно подробнее?
Ну, вот чего я сейчас непонятного сказал?
procedure TForm1.CreateParams(var Params: TCreateParams); // override; begin inherited; Params.Style := Params.Style and not WS_MINIMIZEBOX and not WS_MAXIMIZEBOX; end;
-- Regards, LVT.
-
Т.е., системное меню конфигурируется при создании окна функциями CreateWindow, CreateWindowEx. А потом на нем хоть кол чеши, EnableMenuItem сможет изменить состояние только SC_CLOSE. Я правильно понял? :)
-
> Deltas © (27.08.08 18:40) [11]
> Т.е., системное меню конфигурируется при создании окна функциями > CreateWindow, CreateWindowEx. А потом на нем хоть кол чеши
The application can perform its own checking or graying by responding to the WM_INITMENU message that is sent before any menu is displayed.
Дейс-но, в обработчике WM_INITMENU можно засерить макси/мини мизацию, но состояние кнопок уже не изменится.
-- Regards, LVT.
|