喫茶XRAYトップページ

[スレッド全体
]

[8044] PupupMenuのメニューを画像にしてクリッカブルマップ返信 削除
2014/10/1 (水) 19:30:27 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 番目の項目をクリックするところてす.
最後の図が,クリックした結果です.
ボタンは動作とは関係ありません.


[8055] ネタ元 スーパーサイヤ人?返信 削除
2014/10/3 (金) 18:17:35 Mr.XRAY
> ポップアップメニュー(TPopupMenu) の Item を文字列ではなく,
> 画像にする例です.


大体まとまったので.ネタ元の紹介です.
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201410/14100001.txt

テスト用のプロジェクトのソースがダウンロードできるようですが,
クリックしたら変な画面なのでやめました (^^;
Okiitan なんてのが付いてくるかも知れないので(笑)
どなたか勇気のある方がやってみて,大丈夫だったら挑戦してみます.

それにしても「超高校生級の初心者」ですか,
「スーパー高校生級」だけど初心者ですか?
昔,「スーパーサイヤ人」というのが登場するアニメがありましたが...
「スーパーマン」とかね....


[8057] Re:ネタ元 スーパーサイヤ人?返信 削除
2014/10/3 (金) 18:35:06 igy
▼ Mr.XRAYさん
> それにしても「超高校生級の初心者」ですか,

超高校級とは - はてなキーワード - はてなダイアリー
http://d.hatena.ne.jp/keyword/%C4%B6%B9%E2%B9%BB%B5%E9

他の人から言われるのは、わかりますが、自分で名乗るのは・・・


[8058] Re2:ネタ元 スーパーサイヤ人?返信 削除
2014/10/3 (金) 18:43:39 Mr.XRAY
▼ igyさん

> 超高校級とは - はてなキーワード - はてなダイアリー
> http://d.hatena.ne.jp/keyword/%C4%B6%B9%E2%B9%BB%B5%E9


ハハハッ.Delphi を使う人にもすごい人がいるんですね(半可通)


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82