test 님이 쓰신 글 :
: 안녕하세요.
: 개발초보자입니다.
: TMainmenu 라는 컴포넌트의 색상을 변경할 수 있는 방법이 있는지 궁금합니다...
:
:
:
MainMenu의 Owner Draw를 True로 설정하면 개별 MenuItem에 대해서 색상 및 폰트를 변경할 수 있습니다.
해당 MenuItem이 onDrawItem 또는 OnMenuItemAdvancedDrawItem Event에 Procedure를 연결해서 사용됩니다.
1. onDrawItem 적용 Procedure Sample
procedure TForm4.A1DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
LeftPos: Integer;
TopPos: Integer;
TextLength: Integer;
Text: string;
begin
Text := (Sender as TMenuItem).Caption;
ACanvas.Brush.Color := clGray;
ACanvas.FillRect(ARect);
ACanvas.Font.Color := clWhite;
ACanvas.Font.Style := [fsBold];
// Draw right in the middle of the menu
TopPos := ARect.Top +
(ARect.Bottom - ARect.Top - ACanvas.TextHeight('W')) div 2;
TextLength := Length(Text);
if TextLength > (ARect.Right - ARect.Left) then
LeftPos := ARect.Left + 3
else
LeftPos := ARect.Left + (ARect.Right - ARect.Left -
ACanvas.TextWidth(Text)) div 2;
ACanvas.TextOut(LeftPos, TopPos, Text);
end;
2.OnMenuItemAdvancedDrawItem Procedure 적용 Sample
[TMainmenu Component 정보]
object MainMenu1: TMainMenu
OwnerDraw = True
Left = 53
Top = 24
object muest11: TMenuItem
Caption = 'Test1'
OnAdvancedDrawItem = TestMenuItemAdvancedDrawItem
object A1: TMenuItem
Caption = 'A'
OnAdvancedDrawItem = TestMenuItemAdvancedDrawItem
end
object B2: TMenuItem
Caption = 'B'
OnAdvancedDrawItem = TestMenuItemAdvancedDrawItem
end
end
object est21: TMenuItem
Caption = 'Test2'
OnAdvancedDrawItem = TestMenuItemAdvancedDrawItem
object B1: TMenuItem
Caption = 'B'
OnAdvancedDrawItem = TestMenuItemAdvancedDrawItem
end
object D1: TMenuItem
Caption = 'D'
OnAdvancedDrawItem = TestMenuItemAdvancedDrawItem
end
end
end
[Code 정보]
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus;
type
TMyMenuItem = class(TMenuItem);
TForm4 = class(TForm)
MainMenu1: TMainMenu;
muest11: TMenuItem;
est21: TMenuItem;
A1: TMenuItem;
B1: TMenuItem;
B2: TMenuItem;
D1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure TestMenuItemAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect;
State: TOwnerDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
// Delphi uses the standard Windows colors. If you want to change these you'll
// have to set OwnerDraw to True and use the following OnAdvancedDrawItem event
// for all menu items:
procedure TForm4.TestMenuItemAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect;
State: TOwnerDrawState);
var
TopLevel: Boolean;
Win98Plus: Boolean;
OldAdvancedDrawItem: TAdvancedMenuDrawItemEvent;
begin
with ACanvas do
begin
Win98Plus := (Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0));
TopLevel := TMenuItem(Sender).GetParentComponent is TMainMenu;
if (odSelected in State) and (not TopLevel or (TopLevel and not Win98Plus)) then
begin
Brush.Color := clRed;
Font.Color := clWhite;
end
else if Win98Plus and (odInactive in State) then
begin
Brush.Color := clGreen;
Font.Color := clSilver;
end
else
begin
Brush.Color := clGreen;
Font.Color := clWhite;
end;
OldAdvancedDrawItem := TMenuItem(Sender).OnAdvancedDrawItem;
try
TMenuItem(Sender).OnAdvancedDrawItem := nil;
TMyMenuItem(Sender).AdvancedDrawItem(ACanvas, ARect, State, TopLevel);
finally
TMenuItem(Sender).OnAdvancedDrawItem := OldAdvancedDrawItem;
end;
end;
end;
end.
|