windows apiでクリックできる画像の作り方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
namari
記事: 111
登録日時: 7年前

windows apiでクリックできる画像の作り方

#1

投稿記事 by namari » 5年前

自作しているゲームのマップチップ配置ツクールを制作するためにwindows apiに手を出しました。
そこで、ある座標をクリックした後、分割マップチップ画像をクリックして、その座標にマップチップを配置するという一般的な作業を行おうと思っています。
ここで、ある画像をクリックしたことを認識することが必要です。

画像を配置すること(WM_PAINTで読み込んだ画像を描画する)、ボタンを配置すること(WM_CREATEでウィンドウを作り、WM_COMMANDで処理する)はできますが、
クリックできる画像の作り方が分かりません。

環境はVisual C++で、新規Win32アプリケーションからスタートして作っています。標準windows apiです。
ご指導いただけるとありがたいです。

アバター
みけCAT
記事: 6285
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: windows apiでクリックできる画像の作り方

#2

投稿記事 by みけCAT » 5年前

ウィンドウがクリックされると、WM_LBUTTONDOWNメッセージが飛んできます。
WM_LBUTTONDOWN message (Windows)
これはボタンが押されたタイミングで送信されます。ボタン風の動作にするためには、ボタンが離されたタイミングで送信されるWM_LBUTTONUPの方が自然かもしれません。
WM_LBUTTONUP message (Windows)
画像がクリックされたかを判定するには、クリックされた座標が画像を描画した部分であるかをチェックしてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: windows apiでクリックできる画像の作り方

#3

投稿記事 by YuO » 5年前

・ボタンを利用する場合
BS_IMAGEスタイルをつけたボタンに対して,BM_SETIMAGEを投げることで,イメージのみのボタンを作成することができます。

・自力でハンドリングする場合
ウィンドウ自身でWM_LBUTTONUPを検出し,その位置情報 (LPARAMから取得) で「クリックされた」ことを判定します。

アバター
namari
記事: 111
登録日時: 7年前

Re: windows apiでクリックできる画像の作り方

#4

投稿記事 by namari » 5年前

>みけCATさん
>YuOさん

迅速な回答ありがとうございます。
個人的に描画しないボタンを作って、同じサイズの画像を貼り付けるような動作を考えていましたが、明らかにこちらの方がやりやすいですね。
100以上の座標数があることを考えると、大量のボタンウィンドウの生成が大変そうなので、WM_LBUTTONUPの方法がベストでしょうね。

しかし、マウスカーソルの座標取得方法が分かりません。
GetCursorPosでスクリーン座標(画面左上が0,0)を取得できるのは検索してわかりましたが、
クライアント座標(フォーム左上が0,0)の取得の仕方が分かりません…。
vb.netなら講座が見つかるのですが…。

アバター
namari
記事: 111
登録日時: 7年前

Re: windows apiでクリックできる画像の作り方

#5

投稿記事 by namari » 5年前

すみません!もっと探したらありました。
GetCursorPosで取得した後、ScreenToClientでクライアント座標に変換すればいいだけですね。
ご回答有難うございました。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: windows apiでクリックできる画像の作り方

#6

投稿記事 by YuO » 5年前

namari さんが書きました:しかし、マウスカーソルの座標取得方法が分かりません。
GetCursorPosでスクリーン座標(画面左上が0,0)を取得できるのは検索してわかりましたが、
クライアント座標(フォーム左上が0,0)の取得の仕方が分かりません…。
私の投稿を読みましたでしょうか。
そして,みけCATさんおよび私の投稿にある,MSDNのリンク先も読みましたでしょうか。

GetCursorPosは,呼び出した時点でのカーソルの座標を返します。
負荷がかかった状態では,クリックした位置とは異なる座標が得られてしまいます。
このため,クリックした位置は,WM_LBUTTON(DOWN|UP)のlParamから取得する必要があります。

MSDNのRemarksにあるように,GET_X_LPARAMGET_Y_LPARAMというマクロを使って,値を取得するのがよいでしょう。
オフトピック
私もLOWORDHIWORDマクロを使っていましたし,ネット上のサンプルにもLOWORD/HIWORDで取得する例がありそうですが,MSDNにあるとおり,使わない方がよいでしょう。
マルチモニタが一般化して,負の座標もあり得る状況なわけですし。

閉鎖

“C言語何でも質問掲示板” へ戻る