Vcl Style Utils - избавиться от значка формы по умолчанию

Я уже публиковал это как проблему с RRUZ's Vcl Style Utils. библиотека на GitHub. Тем не менее, я подумал, что могу получить некоторую помощь и здесь.

Я использую стили VCL для создания пользовательского интерфейса Windows 10, в частности, используя стиль «Windows 10 Dark». Я также использую VCL Style Utils, чтобы иметь возможность добавлять кнопки в неклиентскую область в строке заголовка. Я пытаюсь полностью игнорировать значок формы и его функции по умолчанию в пользу кнопки «Назад», как это делают большинство новых приложений для Windows 10.

Я пытаюсь разместить кнопку в дальнем верхнем левом углу формы, используя компонент TNCControls в Vcl.Styles.NC. Однако, когда я размещаю кнопку над значком формы, кнопку нельзя щелкнуть в области значка. Хотя я могу перекрывать значок, щелчок в этой конкретной области строки заголовка всегда открывает системное меню формы вместо нажатия кнопки, которую я разместил там.

Я не хочу, чтобы это меню появлялось при нажатии на него:

Формировать системное меню

Как я сейчас создаю эту кнопку:

procedure TfrmTestMain.SetupTitleBar;
var
  B: TNCButton;
begin
  FNCControls:= TNCControls.Create(Self);
  B:= FNCControls.ButtonsList.Add;
  B.Style := TNCButton.TNCButtonStyle.nsTranparent;
  B.BoundsRect := Rect(0, 0, 45, 32);
  B.UseFontAwesome:= True;
  B.Caption := '';
  B.ImageAlignment:= TImageAlignment.iaCenter;
  B.ImageStyle:= TNCButton.TNCImageStyle.isNormal;
  B.ImageIndex:= fa_chevron_left;
end;

Что я пробовал до сих пор:

  1. Иконка формы заменена полностью пустым файлом .ico.

  2. Меняю стиль формы на bsSizeToolWin, но строка заголовка становится слишком маленькой, и я теряю кнопки сворачивания/разворачивания.

  3. Изменение стиля формы на bsDialog, но я получаю тот же эффект, что и № 2 выше, а также не могу изменить размер формы.

  4. Убедитесь, что стиль кнопки — nsPushButton, и хотя он закрывает значок формы, щелчок по области по-прежнему щелкает значок, который, в свою очередь, показывает системное меню по умолчанию.

  5. После все в этой теме, но вывод таков, что Windows заставляет вас иметь этот значок.

  6. Удалено biSystemMenu из свойства BorderIcons формы, но это также удаляет кнопки по умолчанию в правом верхнем углу формы, что вынуждает меня размещать там свои собственные системные кнопки.

Как полностью исключить значок формы и его функции по умолчанию в пользу кнопки «Назад» в стиле Windows 10?


person Jerry Dodge    schedule 03.09.2016    source источник
comment
Я не знаю стилей, но обычно вы должны иметь возможность отключить системное меню в BorderIcons и, таким образом, избавиться от значка, системного меню и кнопок подписи.   -  person Sertac Akyuz    schedule 04.09.2016
comment
Я думал, что отключение biSystemMenu в BorderIcons будет работать, но по какой-то причине в Берлине также удаляются кнопки свертывания, развертывания и закрытия. Не уверен, когда это сломалось.   -  person Ken White    schedule 04.09.2016
comment
@Ken, это стандартное поведение API, для кнопок с заголовками требуется ws_sysmenu.   -  person Sertac Akyuz    schedule 04.09.2016
comment
... потеря кнопок заголовка не должна быть проблемой в этом случае, окно в любом случае стилизовано - Джерри может вместо этого использовать эти NCButtons.   -  person Sertac Akyuz    schedule 04.09.2016
comment
@SertacAkyuz: Это было давно, но я не помнил, чтобы это было так.   -  person Ken White    schedule 04.09.2016


Ответы (1)


Компонент TNCControls включает в себя ShowSystemMenu имущество. Если вы установите значение false, системное меню не будет отображаться.

Попробуй это

uses
 Vcl.Styles.Utils.Graphics;

procedure TfrmTestMain.FormCreate(Sender: TObject);
begin
 SetupTitleBar;
end;

procedure TfrmTestMain.NCClick(Sender: TObject);
begin
  ShowMessage('Hello');
end;

procedure TfrmTestMain.SetupTitleBar;
var
  B: TNCButton;
begin
  FNCControls:= TNCControls.Create(Self);
  FNCControls.ShowSystemMenu := False; //Disable the system menu.

  B := FNCControls.ButtonsList.Add;
  B.Style := TNCButton.TNCButtonStyle.nsTranparent;
  B.BoundsRect := Rect(0, 0, 45, 32);
  B.UseFontAwesome:= True;
  B.Caption := '';
  B.ImageAlignment:= TImageAlignment.iaCenter;
  B.ImageStyle:= TNCButton.TNCImageStyle.isNormal;
  B.ImageIndex:= fa_chevron_left;
  B.OnClick := NCClick;
end;
person RRUZ    schedule 05.09.2016
comment
Почему TNCControls добавляет достаточно большой промежуток между значком формы и заголовком? Я подумал, что на случай, если мы захотим выровнять кнопки в правой части экрана, рядом с кнопками сворачивания, восстановления и закрытия.... - person Alexandre M; 06.11.2020