クリック判定について教えてもらいたいのですが・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
虎丸

クリック判定について教えてもらいたいのですが・・・

#1

投稿記事 by 虎丸 » 12年前

コード:

			hFont = CreateFont(13,0,0,0,FALSE,FALSE,TRUE,FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH | FF_ROMAN,NULL);
			SetTextColor(hdc, RGB(0,0,255));
			SelectObject(hdc,hFont);
			str = "http://www.yahoo.co.jp";
			TextOut(hdc,30,90,(LPCSTR)str,strlen(str));

			str = "http://www.google.co.jp";
			TextOut(hdc,30,110,(LPCSTR)str,strlen(str));

			str = "http://http://msdn.microsoft.com/ja-JP/";
			TextOut(hdc,30,130,(LPCSTR)str,strlen(str));
WM_PAINTでダイアログに青色で下線付きのURLを描画しました。
このURLをクリックするとShellExecuteが実行されるようにしたいのですが、どうやってこのURLの場所でクリックしたかを判定するのかがわかりません。
リソースでマクロを使ってダイアログを作成した場合は
LTEXT "URL", IDC_URL , , ,,
と書いてやればWM_COMMANDでIDC_URLを見ればわかると思うのですが、今回はTextOutで描画させることにしました。
どう判定すればいいですか?

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

Re: クリック判定について教えてもらいたいのですが・・・

#2

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

GetTextExtentPoint32関数で文字列を描画するときの幅と高さがわかるので、
WM_LBUTTONUPメッセージが来た時に、マウスカーソルの位置がテキストを描画した矩形の中に入っているかを判定すればいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

虎丸

Re: クリック判定について教えてもらいたいのですが・・・

#3

投稿記事 by 虎丸 » 12年前

みけCAT さんが書きました:GetTextExtentPoint32関数で文字列を描画するときの幅と高さがわかるので、
WM_LBUTTONUPメッセージが来た時に、マウスカーソルの位置がテキストを描画した矩形の中に入っているかを判定すればいいと思います。
なるほど。。。

コード:

			str = "http://www.yahoo.co.jp";
			TextOut(hdc,30,90,(LPCSTR)str,strlen(str));
			GetTextExtentPoint32(hdc,str,strlen(str),&url1);

			str = "http://www.google.co.jp";
			TextOut(hdc,30,110,(LPCSTR)str,strlen(str));
			GetTextExtentPoint32(hdc,str,strlen(str),&url2);

			str = "https://www.fachttp://http://msdn.microsoft.com/ja-JP/";
			TextOut(hdc,30,130,(LPCSTR)str,strlen(str));
			GetTextExtentPoint32(hdc,str,strlen(str),&url3);

			sprintf(str,"URL1 => x:%d y:%d",url1.cx,url1.cy);

			sprintf(str,"URL2 => x:%d y:%d",url2.cx,url2.cy);

			sprintf(str,"URL3 => x:%d y:%d",url3.cx,url3.cy);

このようにしたのですが、
URL1のクリック判定の場合ですと
(マウスx位置 >= 30 && マウスx位置 <= url1.cx+30) && (マウスy位置 >= 90 && マウスy位置 <= url1.cy+90)
という判定でいいのでしょうか?

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

Re: クリック判定について教えてもらいたいのですが・・・

#4

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

大丈夫だと思います。実験(テスト)してみてください。
WM_LBUTTONUPの処理の時にurl1に適切な値が入っているように注意してください。(staticをつけて宣言するなど)

条件文は、こっちの方がわかりやすいと思います。(個人の感想です)
(30 <= マウスx位置 && マウスx位置 <= 30+url1.cx) && (90 <= マウスy位置 && マウスy位置 <= 90+url1.cy)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

虎丸

Re: クリック判定について教えてもらいたいのですが・・・

#5

投稿記事 by 虎丸 » 12年前

みけCAT さんが書きました:大丈夫だと思います。実験(テスト)してみてください。
WM_LBUTTONUPの処理の時にurl1に適切な値が入っているように注意してください。(staticをつけて宣言するなど)

条件文は、こっちの方がわかりやすいと思います。(個人の感想です)
(30 <= マウスx位置 && マウスx位置 <= 30+url1.cx) && (90 <= マウスy位置 && マウスy位置 <= 90+url1.cy)
ありがとうございました。
マウスがクリックされた座標の取得方法を知らなかったので、しばらく実装できませんでしたが、
無事にLOWORD(lp)とHIWORD(lp)で取得することができました。
(30 <= マウスx位置 && マウスx位置 <= 30+url1.cx) && (90 <= マウスy位置 && マウスy位置 <= 90+url1.cy)
こちらのやり方で書かせていただきました。

解決です。

閉鎖

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