Вот пример кода, который переопределяет 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.