HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0313
Fubuki毎回表示内容を指定するツールチップの作成11解決


Fubuki

リンク

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



この記事に返信する


osakana

リンク

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っていうイベントがあるらしい)



Fubuki

リンク

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を使ってツールチップの表示開始を自作してもいいのよ。



osakana

リンク

2017/3/14(Tue) 23:01:38|NO.78535

> 掘木 さん
> 確かに...そうなのですが…。実際のところはそこまで易しい問題じゃないです
> Fubuki さん
> 単純ミス失礼しました。ただ、掘木様のおっしゃる通り、これを修正しても治らないのです。

やっぱり間違ってましたか。
ある種論点を明確にする意味で呼び水的に書き込んだのですが、
ちょっとばかし適当に過ぎたかもしれません。失礼しました。



jsAster

リンク

2017/3/15(Wed) 15:44:18|NO.78539

死体・・・・。



eol

リンク

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



osakana

リンク

2017/3/16(Thu) 10:16:16|NO.78550

他にも良い参考サイトがあるかもしれませんが
個人的には、
Fubuki さんの示された参考サイトに加え
www.interq.or.jp/chubu/r6/masm32/tute/tute027_Jp.html
このページ(の前半の説明部分だけ)も読んでおくと
理解しやすいのかなと思いました。
ともあれ解決に向かった様で良かったです。



Fubuki

リンク

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



Fubuki

リンク

2017/3/18(Sat) 14:45:48|NO.78580

 昨日投稿した上記スクリプトの通り、マウスの移動を追従し、リアルタイムに内容が変更できるツールチップという目的を無事達成することができました。


 上記は本件達成のサンプルですのでボタンの透明化や裏側の描画などは省いていますが、
例えば音楽再生ソフトで「移動先時間/全体時間」を表示するなど、様々な応用に役立つと思います。
 (ツールチップを画像にすれば、移動先のプレビュー付きサイドバーも作れるかもしれません。)

 また、ダミーのボタンを一つ通す事で、ウィンドウサイズ変更時にボタンのサイズさえ変更すればTOOLTIPTEXT構造体を再度作って変更の処理をしたり、クリック先判定の部分をサイズによって可変にしておく必要がなくなるという利点があります。
(後でボタンのサイズを取得して、%の計算をするモジュールを作ります。)


>掘木 様

 説明不足ですみませんでした。上記の通りウィンドウサイズによってボタンサイズが変更になる前提があったため、bgscrでなくツールチップにこだわっていました。同じ理由で、RECTを区切って大量のツールチップを用意するのも大変でした。


>eol 様
>coldtime 様
 スクリプト、大変助かりました。これを頂かなければ、自力では*notifyの中身は書けなかったです。また、TOOLINFO構造体も勉強できました。


>osakana 様

 ご紹介いただいたサイトを見て、TTF_IDISHWNDの指定時はRECTの値が意味を持たない事など勉強になりました。
 このサイト、他の個所も読んで勉強します。


 皆様、ありがとうございました。



WinAPI32好き

リンク

2017/3/30(Thu) 00:37:46|NO.78717

解決していますが
昔に作ったWindows専用ツールチップモジュールです
https://www.axfc.net/u/3791931



ONION software Copyright 1997-2023(c) All rights reserved.