Q&A

  • TPopupMenu 에서..
아래의 소스는 THintWindow를 이용해서 팝업메뉴에 힌트를 보여주게 하는 소스입니다.
\\\\\\\\\\\\\\\\\\\
힌트 프로퍼티가 없는데 힌트를 보여주고자 한다면..

힌트윈도우를 직접만들어서 보여주면 됩니다.
아래 소스를 참고하세요.

MainMenu의 OwnerDraw 속성을 True로 하시고...
TMenuItem의 OnDrawItem, OnMeasureItem 이벤트를 아래와 같이
작성해주시면 됩니다.

OwnerDraw를 이용하기 때문에 Hotkey, ShortCut, Image 등도 직접
그려주셔하는 수고스러움이 있네요.

동적으로 만든 힌트이기 때문에 없애주는 부분도 직접해주셔야 되구요
이부분은 Timer를 이용했습니다.

var
Form1: TForm1;
h : THintWindow;

implementation

{$R *.DFM}

procedure TForm1.New1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
var
r : TRect;
str : String;
len : Integer;
Pt : TPoint;
begin
str := TMenuItem( Sender ).Caption;
if Selected then
begin
   with ACanvas do
   begin
     Brush.Style := bsSolid;
     TextOut( ARect.Left+3, ARect.Top+3, TMenuItem( Sender ).Caption );
   end;

   if Assigned( h ) then
   begin
     h.Free;
     h := nil;
     Timer_Hint.Enabled := False;
   end;
   h := THintWindow.Create( nil );
   GetCursorPos( Pt );
   with h.Canvas do
   begin
     len := TextWidth( str );
     h.Color       := clWindow;
     Pen.Style   := psSolid;
     Pen.Color   := clWindowText;
     Brush.Style := bsClear;
     Font.Color  := clNavy;
   end;
   r := Rect( Pt.X, Pt.Y, Pt.X + Len+30, Pt.Y + 20 );
   h.ActivateHint( r, str );
   Timer_Hint.Enabled := True;
end
else
   with ACanvas do
   begin
     TextOut( ARect.Left+3, ARect.Top+3, TMenuItem( Sender ).Caption );
   end;
end;

procedure TForm1.Timer_HintTimer(Sender: TObject);
begin
if Assigned( h ) then
begin
   h.Free;
   h := nil;
   TTimer( Sender ).Enabled := False;
end;
end;

procedure TForm1.New1MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Width, Height: Integer);
begin
Width := 200;
Height := 20;
end;

\\\\\\\\\\\\\\\\\\\

위의 소스를 TPopupMenu에 사용해보니 힌트는 나옵니다.

궁금한것은 OwnerDraw 프로퍼티즈를 True 로 변경하니까

힌트는 나타나는데 메뉴의 크기가 작게나옵니다.

비교
● OwnerDraw 가 True 일때
  - 메뉴명과 단축키가 겹침/힌트 나타남


● OwnerDraw 가 False 일때
  - 메뉴명과 단축키 정상 / 힌트 나타나지 않음


위의 표를 보게되면 False 일때는 힌트가 나오질 않고 메뉴길이는 정상적으로 나옵니다.

OwnerDraw 가 True인 상태에서 메뉴길이를 정상적으로 보여줄 수는 없나요??

초절정 고수님들의 답변 부탁드립니다.

그럼 항상 즐코하시고 건강하시길.......
0  COMMENTS