名前 題名 ▼ Mr.XRAYさん > ポップアップメニュー(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 番目の項目をクリックするところてす. > 最後の図が,クリックした結果です. > ボタンは動作とは関係ありません. GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link