Конференция "WinAPI" » Кнопки в системном меню [D5, WinXP]
 
  • Deltas © (26.08.08 20:34) [0]
    Мне нужно деактивировать все кнопки в системном меню. Следующий код деактивирует только кнопку "Закрыть". Почему? И как деактивировать остальные кнопки?

    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;

  • DVM © (26.08.08 20:59) [1]

    > И как деактивировать остальные кнопки?
    >

    у формы есть свойство BorderIcons
  • Deltas © (26.08.08 21:06) [2]
    Нет, BorderIcons не подходит. Например, с помощью BorderIcons нельзя настроить меню так, что будет видна только одна кнопка "Закрыть" в затемненном состоянии (MF_GRAYED).
  • DVM © (26.08.08 21:16) [3]

    > что будет видна только одна кнопка "Закрыть" в затемненном
    > состоянии (MF_GRAYED).

    зачем нужна кнопка, которая все равно не работает?
  • Leonid Troyanovsky © (27.08.08 09:40) [4]

    > Deltas ©   (26.08.08 20:34)  

    > код деактивирует только кнопку "Закрыть". Почему? И как
    > деактивировать остальные кнопки?

    http://groups.google.com/group/borland.public.delphi.winapi/msg/186a95701207b5b4

    --
    Regards, LVT.
  • DVM © (27.08.08 10:55) [5]

    > http://groups.google.com/group/borland.public.delphi.winapi/msg/186a95701207b5b4
    >

    Непонятно, что за искусственные "ограничения системы" именно для кнопок свернуть и развернуть окно. А для закрыть, казалось бы более важной кнопки - ограничений нет. По-моему, это баг явный.
  • Leonid Troyanovsky © (27.08.08 13:33) [6]

    > DVM ©   (27.08.08 10:55) [5]

    > Непонятно, что за искусственные "ограничения системы" именно
    > для кнопок свернуть и развернуть окно. А для закрыть, казалось
    > бы более важной кнопки - ограничений нет. По-моему, это
    > баг явный.

    Ограничения, IMHO, касаются не только упомянутых кнопок,
    только про это мало известно, бо не документировано.
    В дельфи в таких случаях просто удаляют ненужные пункты.

    --
    Regards, LVT.
  • Deltas © (27.08.08 16:04) [7]

    > Leonid Troyanovsky ©   (27.08.08 09:40) [4]

    Спасибо. Статью прочитал.
    Но, возникает еще один вопрос. Если в свойстве формы BorderIcons отключить biMinimize, а остальные флажки установить включенными, то при запуске приложения кнопка свернуть будет неактивной в затмненном состоянии. Для biMaximize аналогичная ситуация. Как Borland-овцы умудрились это сделать, ведь Delphi - красивая обертка WinAPI?
  • Leonid Troyanovsky © (27.08.08 16:18) [8]

    > Deltas ©   (27.08.08 16:04) [7]

    >  Как Borland-овцы умудрились это сделать, ведь Delphi -
    > красивая обертка WinAPI?

    Если выбрать один biMaximize, то будет аналогично.
    Дело не в борланде, они делают одно и тоже (Forms.pas):
    procedure TCustomForm.WMNCCreate(var Message: TWMNCCreate);

    Видимо, MS считает, что если эти возможности не нужны,
    то им нет места в системном меню.

    --
    Regards, LVT.
  • Deltas © (27.08.08 16:33) [9]

    > Leonid Troyanovsky ©   (27.08.08 16:18) [8]

    Ничего не понял. Можно подробнее?
    Я настриваю BorderIcons = [biSystemMenu, biMaximize]. При запуске программы, вижу, что кнопка "Свернуть" отображается затемненной, а все остальные - активными. Т.е., значит есть возможость отключить только кнопку "Свернуть". Модуль Forms.pas я смотрел, даже запускал прорамму по шагам со включнным флажком компилятора 'Use Debug DCUs'. Пока не понимаю, почему там отключается кнопка "Свернуть", а в моей процедуре (см. вопрос обсуждения) нет?
  • Leonid Troyanovsky © (27.08.08 18:09) [10]

    > 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.
  • Deltas © (27.08.08 18:40) [11]
    Т.е., системное меню конфигурируется при создании окна функциями CreateWindow, CreateWindowEx. А потом на нем хоть кол чеши, EnableMenuItem сможет изменить состояние только SC_CLOSE. Я правильно понял? :)
  • Leonid Troyanovsky © (28.08.08 11:15) [12]

    > 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.
 
Конференция "WinAPI" » Кнопки в системном меню [D5, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0.001]