Раздражение символов стиля XP в ActionBars - PullRequest
3 голосов
/ 14 мая 2011

Я не хотел бы задавать слишком много вопросов относительно внешнего вида компонентов, но в наши дни появление в приложениях кажется столь же важным.

В любом случае, пожалуйста, смотрите следующие изображения:

enter image description here

Оба используют TActionManager и TActionMainMenuBar для создания моего главного меню. Меню слева от изображения использует стиль платформы по умолчанию, меню справа использует стиль XP, определенный моим TActionManager.

Обратите внимание, что при выделении левого меню глиф остается тем же, что и идеально.

Теперь посмотрите на меню в стиле XP справа, глиф рисует тень, слегка всплывает, и вы можете видеть, что прозрачность делает глиф немного странным.

Я хочу включить стиль XP для моего пользовательского интерфейса, но способ рисования глифов мне не нравится. Я также хочу изменить свой TToolbar на TActionToolBar и применить тот же стиль XP, но это также отразит глифы.

Как сделать меню стиля XP, определенное в TActionManager, не отображать глифы, как это?

Спасибо.

EDIT

Теперь это результат применения некоторых методов из ответов ниже:

enter image description here

Craig.

Ответы [ 2 ]

6 голосов
/ 15 мая 2011

Вот пример кода, который переопределяет XP STYLE, создавая производный класс, который вы можете настроить по своему усмотрению. Первым шагом здесь является замена собственного производного класса элемента меню и изменение его кода DrawGlyph, как сказал вам Дэвид. Я подумал, что вы могли бы использовать пример кода.

Это всего лишь небольшая демонстрация. Он не рисует рамку вокруг отмеченных элементов с глифами, поэтому этот пользовательский стиль не совместим с проверенными элементами, если у них нет глифов. Вам нужно будет выяснить, как вы хотите рисовать элементы проверенного глифа (где я написал DrawGlyphFrame было бы хорошим местом для добавления чего-либо, чтобы нарисовать прямоугольник проверенного состояния вокруг глифа, если установлено свойство Action.Checked).

unit MyActionControlStyle;

// Using this unit: Add it to your project. In your project set your
// style at runtime, add the unit to your uses clause and then set the style
// in that form's formcreate event:
//   ActionManager1.Style := MyActionControlStyle.MyStyle;

interface

uses Forms,
     Types,
     Controls,
     XPActnCtrls,
     XPStyleActnCtrls,
     ActnMan,
     ActnList,
     ActnMenus,
     ActnCtrls;

type

 TMyStyleMenuItem = class(TXPStyleMenuItem)
  protected
      procedure DrawGlyph(const Location: TPoint); override;

//      procedure DrawGlyphFrame(const Location:TPoint);

 end;
 TMyStyleMenuButton = class(TXPStyleMenuButton)
 end;

 TMyStyleActionBars = class(TXPStyleActionBars)
   // override the stuff that I want different than XP Style:
    function GetControlClass(ActionBar: TCustomActionBar;
      AnItem: TActionClientItem): TCustomActionControlClass; override;

 end;

var
 MyStyle:TMyStyleActionBars;

implementation


uses ToolWin, Classes, Windows, Graphics, GraphUtil, ImgList;
{ TMyStyleActionBars }

function TMyStyleActionBars.GetControlClass(ActionBar: TCustomActionBar;
  AnItem: TActionClientItem): TCustomActionControlClass;
begin
 if ActionBar is TCustomActionPopupMenu then
    Result := TMyStyleMenuItem
  else
  if ActionBar is TCustomActionMainMenuBar then
    Result := TMyStyleMenuButton
  else
    Result := inherited GetControlClass(ActionBar,AnItem);

end;

{ TMyStyleMenuItem }

procedure TMyStyleMenuItem.DrawGlyph(const Location: TPoint);
var
  ImageList: TCustomImageList;
  DrawEnabled: Boolean;
begin
//  DrawGlyphFrame(Location);
  if not HasGlyph and IsChecked then
  begin
    Canvas.Pen.Color := ActionBar.ColorMap.FontColor;
    DrawCheck(Canvas, Point((TextBounds.Left - 5) div 2, Height div 2), 2);
  end;

  if not HasGlyph then exit;
  if Assigned(Action) then
    ImageList := ActionClient.Action.ActionList.Images
  else
    ImageList := ActionClient.OwningCollection.ActionManager.Images;
  if not Assigned(ImageList) then exit;
  DrawEnabled := Enabled and (ActionClient.ImageIndex <> -1) or
    (csDesigning in ComponentState);
  ImageList.Draw(Canvas, Location.X, Location.Y, ActionClient.ImageIndex,
    dsTransparent, itImage, DrawEnabled);

end;

initialization
  MyStyle := TMyStyleActionBars.Create;
  RegisterActnBarStyle(MyStyle);
finalization
  UnregisterActnBarStyle(MyStyle);
  MyStyle.Free;
end.
1 голос
/ 15 мая 2011

Это сделано специально в коде VCL.Соответствующий код - TXPStyleMenuItem.DrawGlyph() в XPActnCtrls.pas.

Самый простой способ изменить поведение - зарегистрировать собственную версию стиля панели действий XP на основе TXPStyleActionBars.Есть много крючков, которые позволят вам переопределить TXPStyleMenuItem.DrawGlyph().

...