ポップアップメニュー(TPopupMenu) の Item を文字列ではなく,
画像にする例です.
以下では,Item_0 という項目名に複数の画像を表示します.
ウェブページの「クリッカブルマップ」のような機能を実装しています.
オーナ描画で TPopupMenu の Canvas にビットマップを描画します.
クリックの位置は,マウスカーソルの座標で検出します.
動作確認は,Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.
http://mrxray.on.coocan.jp/Delphi/zip/PopupMenu_ImageItem.zip
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus, ImgList;
type
TForm1 = class(TForm)
Button1: TButton;
PopupMenu1: TPopupMenu;
Item_0: TMenuItem;
Item_1: TMenuItem;
Item_2: TMenuItem;
Item_3: TMenuItem;
N1: TMenuItem;
ImageList1: TImageList;
procedure Item_0AdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; State: TOwnerDrawState);
procedure Item_0MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width,
Height: Integer);
procedure Item_0Click(Sender: TObject);
private
{ Private 宣言 }
RectImage : array [0..3] of TRect;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//-----------------------------------------------------------------------------
// PopupMenu1のItem_0項目のOnAdvancedDrawItemイベント処理
// ImageListに格納してあるビットマップ画像を表示
//
// PopupMenu1のOwnerDrawプロパティをTrueにしておく
//-----------------------------------------------------------------------------
procedure TForm1.Item_0AdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; State: TOwnerDrawState);
var
aBitmap : TBitmap;
ItemWidth : Integer;
ItemHeigh : Integer;
aLeft : Integer;
aPos : TPoint;
infMargin : Integer;
i : Integer;
begin
ItemWidth := ImageList1.Width + 5;
ItemHeigh := ImageList1.Height + 10;
aPos := PopupMenu1.PopupPoint;
aBitmap := TBitmap.Create;
try
infMargin := -5;
InflateRect(ARect, infMargin, infMargin);
aLeft := ARect.Left + 5;
aPos.X := aPos.X + 5 - infMargin;
for i := 0 to Length(RectImage) - 1 do begin
RectImage[i] := Rect(aPos.X, aPos.Y, aPos.X + ItemWidth, aPos.Y + ItemHeigh);
aBitmap.Assign(nil);
ImageList1.GetBitmap(i, aBitmap);
ACanvas.Draw(aLeft, ARect.Top, aBitmap);
aLeft := aLeft + ItemWidth;
aPos.X := aPos.X + ItemWidth;
end;
finally
aBitmap.Free;
end;
end;
//-----------------------------------------------------------------------------
// PopupMenu1のItem_0項目のOnMeasureItemイベント処理
// 項目の幅と高さを設定
//-----------------------------------------------------------------------------
procedure TForm1.Item_0MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width,
Height: Integer);
begin
Height := ImageList1.Height + 10;
Width := (ImageList1.Width + 5) * Length(RectImage);
end;
//-----------------------------------------------------------------------------
// PopupMenu1のItem_0項目のOnClickイベント処理
// クリックした画像を,マウスクカーソルの位置から判定する
//-----------------------------------------------------------------------------
procedure TForm1.Item_0Click(Sender: TObject);
var
aPos : TPoint;
i : Integer;
begin
GetCursorPos(aPos);
for i := 0 to Length(RectImage) - 1 do begin
if PtInRect(RectImage[i], aPos) then begin
ShowMessage(IntToStr(i + 1) + ' 番目の画像クリック');
break;
end;
end;
end;
最初の図は,設計時の画面です.
次の図はポップアップメニューを表示して 2 番目の項目をクリックするところてす.
最後の図が,クリックした結果です.
ボタンは動作とは関係ありません.
|