XP STYLEをオーバーライドして、必要に応じて微調整できる派生クラスを作成するサンプルコードを次に示します。ここでの最初のステップは、Davidが言ったように、独自の派生メニュー項目クラスを置き換え、そのDrawGlyphコードを変更することです。サンプルコードを使用できると思いました。
これは簡単なデモです。グリフのあるチェックされたアイテムの周りにボックスを描画しないため、このカスタムスタイルは、グリフがない場合を除いて、チェックされたアイテムと互換性がありません。チェックされたグリフアイテムをどのように描画するかを理解する必要があります(Action.Checkedプロパティが設定されている場合、DrawGlyphFrameを記述した場所は、グリフの周りにチェック状態の長方形を描画するための何かを追加するのに適しています)。
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.