自作しているゲームのマップチップ配置ツクールを制作するためにwindows apiに手を出しました。
そこで、ある座標をクリックした後、分割マップチップ画像をクリックして、その座標にマップチップを配置するという一般的な作業を行おうと思っています。
ここで、ある画像をクリックしたことを認識することが必要です。
画像を配置すること(WM_PAINTで読み込んだ画像を描画する)、ボタンを配置すること(WM_CREATEでウィンドウを作り、WM_COMMANDで処理する)はできますが、
クリックできる画像の作り方が分かりません。
環境はVisual C++で、新規Win32アプリケーションからスタートして作っています。標準windows apiです。
ご指導いただけるとありがたいです。
windows apiでクリックできる画像の作り方
Re: windows apiでクリックできる画像の作り方
ウィンドウがクリックされると、WM_LBUTTONDOWNメッセージが飛んできます。
WM_LBUTTONDOWN message (Windows)
これはボタンが押されたタイミングで送信されます。ボタン風の動作にするためには、ボタンが離されたタイミングで送信されるWM_LBUTTONUPの方が自然かもしれません。
WM_LBUTTONUP message (Windows)
画像がクリックされたかを判定するには、クリックされた座標が画像を描画した部分であるかをチェックしてください。
WM_LBUTTONDOWN message (Windows)
これはボタンが押されたタイミングで送信されます。ボタン風の動作にするためには、ボタンが離されたタイミングで送信されるWM_LBUTTONUPの方が自然かもしれません。
WM_LBUTTONUP message (Windows)
画像がクリックされたかを判定するには、クリックされた座標が画像を描画した部分であるかをチェックしてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: windows apiでクリックできる画像の作り方
・ボタンを利用する場合
BS_IMAGEスタイルをつけたボタンに対して,BM_SETIMAGEを投げることで,イメージのみのボタンを作成することができます。
・自力でハンドリングする場合
ウィンドウ自身でWM_LBUTTONUPを検出し,その位置情報 (LPARAMから取得) で「クリックされた」ことを判定します。
BS_IMAGEスタイルをつけたボタンに対して,BM_SETIMAGEを投げることで,イメージのみのボタンを作成することができます。
・自力でハンドリングする場合
ウィンドウ自身でWM_LBUTTONUPを検出し,その位置情報 (LPARAMから取得) で「クリックされた」ことを判定します。
Re: windows apiでクリックできる画像の作り方
>みけCATさん
>YuOさん
迅速な回答ありがとうございます。
個人的に描画しないボタンを作って、同じサイズの画像を貼り付けるような動作を考えていましたが、明らかにこちらの方がやりやすいですね。
100以上の座標数があることを考えると、大量のボタンウィンドウの生成が大変そうなので、WM_LBUTTONUPの方法がベストでしょうね。
しかし、マウスカーソルの座標取得方法が分かりません。
GetCursorPosでスクリーン座標(画面左上が0,0)を取得できるのは検索してわかりましたが、
クライアント座標(フォーム左上が0,0)の取得の仕方が分かりません…。
vb.netなら講座が見つかるのですが…。
>YuOさん
迅速な回答ありがとうございます。
個人的に描画しないボタンを作って、同じサイズの画像を貼り付けるような動作を考えていましたが、明らかにこちらの方がやりやすいですね。
100以上の座標数があることを考えると、大量のボタンウィンドウの生成が大変そうなので、WM_LBUTTONUPの方法がベストでしょうね。
しかし、マウスカーソルの座標取得方法が分かりません。
GetCursorPosでスクリーン座標(画面左上が0,0)を取得できるのは検索してわかりましたが、
クライアント座標(フォーム左上が0,0)の取得の仕方が分かりません…。
vb.netなら講座が見つかるのですが…。
Re: windows apiでクリックできる画像の作り方
すみません!もっと探したらありました。
GetCursorPosで取得した後、ScreenToClientでクライアント座標に変換すればいいだけですね。
ご回答有難うございました。
GetCursorPosで取得した後、ScreenToClientでクライアント座標に変換すればいいだけですね。
ご回答有難うございました。
Re: windows apiでクリックできる画像の作り方
私の投稿を読みましたでしょうか。namari さんが書きました:しかし、マウスカーソルの座標取得方法が分かりません。
GetCursorPosでスクリーン座標(画面左上が0,0)を取得できるのは検索してわかりましたが、
クライアント座標(フォーム左上が0,0)の取得の仕方が分かりません…。
そして,みけCATさんおよび私の投稿にある,MSDNのリンク先も読みましたでしょうか。
GetCursorPosは,呼び出した時点でのカーソルの座標を返します。
負荷がかかった状態では,クリックした位置とは異なる座標が得られてしまいます。
このため,クリックした位置は,WM_LBUTTON(DOWN|UP)のlParamから取得する必要があります。
MSDNのRemarksにあるように,GET_X_LPARAMやGET_Y_LPARAMというマクロを使って,値を取得するのがよいでしょう。