Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[16081] Re:TMainmenu 컴포넌트의 배경색 등.. 색깔을 컨트롤할수 있는 방법이 있을까요?
수원성 [] 1247 읽음    2020-02-04 11:46
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.

+ -

관련 글 리스트
16080 TMainmenu 컴포넌트의 배경색 등.. 색깔을 컨트롤할수 있는 방법이 있을까요? test 884 2020/01/31
16081     Re:TMainmenu 컴포넌트의 배경색 등.. 색깔을 컨트롤할수 있는 방법이 있을까요? 수원성 1247 2020/02/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.