Изменить системное меню
Многие, наверное, уже задумывались над тем, как же внести изменения в системное меню. На примере вы видите, что кнопка закрытия окна неактивна. К тому же команда "Закрыть" вообще отсутствует в системном меню. Системное меню вызывается по щелчку на иконке окна или Alt+Space.
Если вы напишите следующий код на создание окна (событие OnCreate), то сможете сами в этом убедиться.
procedure TForm1.FormCreate(Sender: TObject);
var
hMenuHandle: HMENU;
begin
hMenuHandle := GetSystemMenu(Handle, false);
if hMenuHandle <> 0 then
DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);
end;
|
Объявляем переменную типа HMENU. Получаем дескриптор своего системного меню и помещаем его в переменную:
Получить дескриптор позволяет функция GetSystemMenu(). Ей в качестве параметра указываем ключевое слово Handle - оно указывает, что будет получен дескриптор нашего системного меню. Второй параметр, равный false, означает, что возвращаемое функцией значение будет не нулевое, а равное дескриптору меню окна.
Функция DeleteMenu позволяет удалить пункт меню. Сначала ей указываем дескриптор меню - hMenuHandle, затем (SC_CLOSE) значение, идентифицирующее пункт меню, которое может принимать следующие значания:
- sc_close
- "Закрыть",
- sc_move
- "Переместить",
- sc_size
- "Размер",
- sc_minimize
- "Свернуть",
- sc_maximize
- "Развернуть"
Последний параметр (MF_BYCOMMAND) означает, что предыдущий параметр дает идентификатор пункта меню. Если бы предыдущий параметр указывал на положение пункта меню, отсчитываемое от нуля, тогда бы мы написали MF_BYPOSITION.
Вот теперь вы можете смело менять наличие и активность того или иного пункта системного меню! Плюс к тому, если вы заботитесь о наличии и активности кнопок на заголовочной полосе, соответствующих пунктам меню, то можете поэкспериментировать со свойствами окна BorderStyle & BorderIcons.
|