| 
					 
							
													 
							
						 
						
 
 | 
 | 
 
2017/3/13(Mon) 17:38:32|NO.78517 
 ツールチップの作成をしています。 
 今回、タイミングやマウスの位置などによって表示させる内容をその都度 
変更死体と思い、以下のサイトを参考にし、LPSTR_TEXTCALLBACKを使って 
みることにしました。こうすれば、ツールチップを表示するたびに*notifyの中で 
文字列を指定できるかと思っています。
 
 しかし、この方法を使ったサンプルをどうしても見つけられず、 
自分でいくらやっても*notifyに飛んでくれません。 
どこが間違っているのか、お分かりの方がいらっしゃいましたら、ご教授ください。
  
 参考サイト: http://wisdom.sakura.ne.jp/system/winapi/common/common10.html
 
#uselib "user32"
	#func GetClientRect "GetClientRect" int, int
	oncmd gosub *notify,$0000004E
	button "テスト",*dummy
	winobj "tooltips_class32", "",,
	hTooltips = objinfo (stat, 2)
	dim RECT, 4
	GetClientRect hButton, varptr (RECT)
	TOOLINFO = 40, $10 , hButton, 0, 0, 0, RECT.2, RECT.3, 0,$FFFFFFFF	//LPSTR_TEXTCALLBACK
	sendmsg hTooltips, $404, , varptr (toolinfo)
*dummy
stop
*notify
	dupptr NMHDR, lparam, 12 //NMHDR構造体取得
	if NMHDR.0=hTooltips or NMHDR.0=hButton{//対象オブジェクトの判定
		dialog "反応しました。"
	}
	return
 
 
 |   
  
 
 | 
 | 
 
2017/3/14(Tue) 06:45:21|NO.78522 
少し見ただけなので違っていたらすみませんが、 
hButton 変数にボタンのウィンドウハンドルが 
入ってないようですが、それじゃないでしょうか 
 
 |   
  
| 
 | 
 
2017/3/14(Tue) 09:20:23|NO.78524 
>osakanaさん 
確かにその通りでhButtonにボタンのハンドルを入れないといかんのはそうなのですが…。 
 
実際のところはそこまで易しい問題じゃないです。WM_NOTIFYがメインウィンドウに来ないので。 
つまるところ、ボタンをサブクラス化する作業になるわけですが、これはやるとわかるけどもまぁめんどくさいです。 
 
ツールチップの表示タイミングに文字列を選定し表示するよりも、 
状況の変化でツールチップの文字列を変更し、表示要求されれば設定済みのを表示…のが楽かと思います。 
(TTM_UPDATETIPTEXTっていうイベントがあるらしい) 
 
 |   
  
| 
 | 
 
2017/3/14(Tue) 14:49:21|NO.78526 
>>osakana 様 
 
 単純ミス失礼しました。 
 ソースをコピペする際に落としてしまったようです。 ただ、掘木様のおっしゃる通り、これを修正しても治らないのです。 
 
 
 
>>掘木様 
 
 サブクラス化が必要との事、ご指摘ありがとうございます。 
これをキーワードにして検索したところ、何となくわかってきました。 
 HSP向けのサブクラス化モジュールというのもあるらしいのですが、リンク切れのようです・・・。 
これがあれば、以前にここに投稿させて頂いて解決しなかった「windows Aero導入以降、chkboxとcmbboxの背景色が変更できない問題」 
も解決するかもしれないのですが・・・。(根拠ないのですが) 
 独力でサブクラス化モジュールをかけるだけの実力は私にはありません。 
どなたか今もDLできる先をご存知ないでしょうか。 
 
 
 また、「状況の変化でツールチップの文字列を変更し、 
表示要求されれば設定済みのを表示…のが楽かと思います。」 
とのご指摘を受けて、改めて処理の流れを考えてみました。 
 
 0.ツールチップコントロールを作っておく 
 1.ボタンを設置するが、このボタンはダミー 
  (gosubジャンプしてすぐにreturn) 
 2.設置したボタン上にマウスが来たらツールチップ表示 
  (マウス位置によって内容変更) 
 3.マウスイベントをツールチップコントロールに手動で送信することで、 
  ボタンの上をマウスが動いたらツールチップの位置と内容を変更 
 
という事がしたかったのです。 
 
 
 課題としては、 
・oncmdでmousemove($200)を捕まえる事は出来ても、 
 その後どんなメッセージをツールチップコントロールに送信すればよいのか 
・0.の時点で表示までの待ち時間を0に設定しておく必要がある。 
 
の2点の方が大きそうです。(先にこれらを質問しておくべきでした。) 
 
 確かに、LPSTR_TEXTCALLBACKにこだわらなくてもよいのかなと思います。 
 (3.のついでにTTM_UPDATETIPTEXTを送信すればよいので) 
 
 上記2点の課題について、ご存知の方がいらっしゃいましたら、ぜひご教授ください。 
 また、MSDNでツールチップ全体の説明などもないものなんでしょうか・・・。 
 
 長文失礼しました。 
 
 |   
  
| 
 | 
 
2017/3/14(Tue) 19:09:41|NO.78531 
読む限りでは、ダミーのボタンの設置理由が全く分からないので、何といえばいいのか。 
コイツが必要なのか不要なのかでアプローチが全く違ってくるんですが。 
 
1.bgsrcを子ウィンドウ化してメインウィンドウに張ればサブクラス化なぞ不要です。 
  子ウィンドウ側にWM_NOTIFYが来るので。 
2.そもそもコントロール(ボタン)を作らずにメインウィンドウにツールチップをはっつければ、 
  WM_NOTIFYを受け取れます。これもサブクラス化なんてしなくていい。 
 
で、ボタンが必要なケースを考える訳ですが、 
イ.矩形レベルで内容が変わるなら、rectを区切って複数ツールチップを作ればどうだ。 
ロ.ツールチップはボタンの挙動を説明するもの。何もしないボタンに何の説明が要るの? 
  また、押す位置によってボタンの挙動は変わらないと(普通のユーザーの感覚では)思うけども、 
  それをしなければいけない理由はなんでしょね。 
ハ.ボタンを模したものを自作する手はないのか。 
 
※oncmdでボタン上のWM_MOUSEMOVEを捕まえることはできません。 
 そのメッセージはボタンに行くだけで、メインウィンドウには来ません。 
 
別にWM_MOUSEHOVERを使ってツールチップの表示開始を自作してもいいのよ。 
 
 |   
  
| 
 | 
 
2017/3/14(Tue) 23:01:38|NO.78535 
> 掘木 さん 
>  確かに...そうなのですが…。実際のところはそこまで易しい問題じゃないです 
> Fubuki さん 
>  単純ミス失礼しました。ただ、掘木様のおっしゃる通り、これを修正しても治らないのです。 
 
やっぱり間違ってましたか。 
ある種論点を明確にする意味で呼び水的に書き込んだのですが、 
ちょっとばかし適当に過ぎたかもしれません。失礼しました。 
 
 |   
  
| 
 | 
 
2017/3/15(Wed) 15:44:18|NO.78539 
死体・・・・。 
 
 |   
  
| 
 | 
 
2017/3/16(Thu) 05:06:43|NO.78546 
別にサブクラス化とかいらないです 
 
#define WM_NOTIFY	$0000004E
#define TTS_ALWAYSTIP	$00000001
#define TTF_SUBCLASS	$00000010
#define LPSTR_TEXTCALLBACK	$FFFFFFFF
#define TTM_ADDTOOL	$00000404
#define TTN_GETDISPINFO	$FFFFFDF8
#define TTF_IDISHWND	$00000001
#uselib "user32"
	#func GetClientRect "GetClientRect" int, int
	
oncmd gosub *notify,WM_NOTIFY
	objsize 200,200
	button "テスト",*dummy
	hButton = objinfo (stat, 2)
	
	winobj "tooltips_class32", "",0,TTS_ALWAYSTIP 
	hTooltips = objinfo (stat, 2)
	dim RECT, 4
	GetClientRect hButton, varptr (RECT)
	TOOLINFO = 40, TTF_SUBCLASS|TTF_IDISHWND , hwnd, hButton, 0, 0,rect.2,rect.3, 0,LPSTR_TEXTCALLBACK
	sendmsg hTooltips,  TTM_ADDTOOL ,0, varptr(toolinfo)
*dummy
stop
*notify
	dupptr NMHDR, lparam, 12 //NMHDR構造体取得
	if NMHDR.0=hTooltips &  NMHDR.2=TTN_GETDISPINFO{//対象オブジェクトの判定
		dupptr NMTTDISPINFO , lparam, 108 
		dupptr szText , lparam+16, 80,2
		szText="mouse(screen座標)="+ginfo_mx+","+ginfo_my
	}
	return
 
 
 |   
  
| 
 | 
 
2017/3/16(Thu) 10:16:16|NO.78550 
他にも良い参考サイトがあるかもしれませんが 
個人的には、 
Fubuki さんの示された参考サイトに加え 
www.interq.or.jp/chubu/r6/masm32/tute/tute027_Jp.html 
このページ(の前半の説明部分だけ)も読んでおくと 
理解しやすいのかなと思いました。 
ともあれ解決に向かった様で良かったです。 
 
 |   
  
| 
 | 
 
2017/3/17(Fri) 22:21:24|NO.78573 
#define WM_NOTIFY	$0000004E 
#define TTS_ALWAYSTIP	$00000001 
#define TTF_SUBCLASS	$00000010 
#define LPSTR_TEXTCALLBACK	$FFFFFFFF 
#define TTM_ADDTOOL	$00000404 
#define TTN_GETDISPINFO	$FFFFFDF8 
#define TTF_IDISHWND	$00000001 
#define TTM_UPDATE	$0000041D 
#define ctype getwakusize ((ginfo(6) - ginfo(4) - ginfo(12)) / 2) 
#define ctype getcaptionsize (ginfo(7) - ginfo(5) - ginfo(13) - getwakusize()*2) 
#define ctype mouse_X (ginfo_mx-ginfo_wx1-getwakusize())			//画面全体-左上座標-ウィンドウ枠 
#define	ctype mouse_Y (ginfo_my-ginfo_wy1-getcaptionsize()-getwakusize())	//画面全体-左上座標-タイトル-ウィンドウ枠 
 
oncmd gosub *notify,WM_NOTIFY 
 
	btnX=400 
	objsize btnX,20 
	pos 10,10 
	button "",*main 
	hButton = objinfo (stat, 2) 
	 
	winobj "tooltips_class32", "",0,TTS_ALWAYSTIP  
	hTooltips = objinfo (stat, 2) 
	TOOLINFO = 40,TTF_SUBCLASS|TTF_IDISHWND,hwnd,hButton,0,0,0,0,0,LPSTR_TEXTCALLBACK 
	sendmsg hTooltips,TTM_ADDTOOL,0,varptr(toolinfo) 
 
*main 
	sendmsg hTooltips,TTM_UPDATE,0,0 
	wait 1 
	goto *main 
 
*notify 
	dupptr NMHDR, lparam, 12 //NMHDR構造体取得 
	if NMHDR.0=hTooltips &  NMHDR.2=TTN_GETDISPINFO{//対象オブジェクトの判定 
		dupptr NMTTDISPINFO , lparam, 108  
		dupptr szText , lparam+16, 80,2 
 
		percent=int(double((mouse_X()-10))/btnX*100) 
		szText=""+percent+"%" 
 
	} 
	return 
 
 
  |    |   
  
| 
 | 
 
2017/3/18(Sat) 14:45:48|NO.78580 
 昨日投稿した上記スクリプトの通り、マウスの移動を追従し、リアルタイムに内容が変更できるツールチップという目的を無事達成することができました。 
 
 
 上記は本件達成のサンプルですのでボタンの透明化や裏側の描画などは省いていますが、 
例えば音楽再生ソフトで「移動先時間/全体時間」を表示するなど、様々な応用に役立つと思います。 
 (ツールチップを画像にすれば、移動先のプレビュー付きサイドバーも作れるかもしれません。) 
 
 また、ダミーのボタンを一つ通す事で、ウィンドウサイズ変更時にボタンのサイズさえ変更すればTOOLTIPTEXT構造体を再度作って変更の処理をしたり、クリック先判定の部分をサイズによって可変にしておく必要がなくなるという利点があります。 
(後でボタンのサイズを取得して、%の計算をするモジュールを作ります。) 
 
 
>掘木 様 
 
 説明不足ですみませんでした。上記の通りウィンドウサイズによってボタンサイズが変更になる前提があったため、bgscrでなくツールチップにこだわっていました。同じ理由で、RECTを区切って大量のツールチップを用意するのも大変でした。 
 
 
>eol 様 
>coldtime 様 
 スクリプト、大変助かりました。これを頂かなければ、自力では*notifyの中身は書けなかったです。また、TOOLINFO構造体も勉強できました。 
 
 
>osakana 様 
 
 ご紹介いただいたサイトを見て、TTF_IDISHWNDの指定時はRECTの値が意味を持たない事など勉強になりました。 
 このサイト、他の個所も読んで勉強します。 
 
 
 皆様、ありがとうございました。 
 
 |   
  
  
					 |