dairygoodsさんへ
お返事ありがとうございます。
> OnToolHitTest()が呼び出されないと言うことでしょうか?
そういうことですね。
> CWnd::PreTranslateMessage()内でその処理をやっていますので、
> これをオーバーライドしてしまうと呼び出されません。
PreTranslateMessage()をオーバーライドしていませんが。
確認するために、下記のようにメッセージ表示を入れました。
int CCheckToolTipView::OnToolHitTest( CPoint point, TOOLINFO* pTI) const
{
::MessageBox( NULL, OnToolHitTest()に入った, 確認メッセージ, 0);
int r = CView::OnToolHitTest( point, pTI);
HWND hwnd = (HWND)pTI->uId;
char name[ 13];
::GetClassName( hwnd, name, sizeof( name));
if ( strcmp( name, ComboBoxEx32) == 0) {
// 拡張コンボの場合、その子ウィンドウに置き換える
pTI->uId = (UINT)::GetWindow( hwnd, GW_CHILD);
}
return r;
}
確認の結果、カーソルがウインドウのクライアント領域に
入るたびにOnToolHitTest()に入ったメッセージが決まって
表示されます。この時、カーソルがビュー上のコントロールに
当たらなくてもそのメッセージが表示されます。
忙しいところすみませんが、宜しくお願いいたします。
>> OnToolHitTest()が呼び出されないと言うことでしょうか?
> そういうことですね。
> 確認の結果、カーソルがウインドウのクライアント領域に
> 入るたびにOnToolHitTest()に入ったメッセージが決まって
> 表示されます。この時、カーソルがビュー上のコントロールに
> 当たらなくてもそのメッセージが表示されます。
つまり、OnToolHitTest()は呼び出されていることになりますが…。
dairygoodsさんへ
お返事ありがとうございます。
> つまり、OnToolHitTest()は呼び出されていることになりますが…。
おっしゃる通りです。
宜しくお願いいたします。
>> OnToolHitTest()が呼び出されないと言うことでしょうか?
> そういうことですね。
>> つまり、OnToolHitTest()は呼び出されていることになりますが…。
> おっしゃる通りです。
お返事が矛盾していてよく分からなくなってしまいました。
OnToolHitTest()が呼び出されないという問題は
解決したということでよろしいですか?
そして、OnToolHitTest()は呼び出されるが、
ツールヒントは出ない。というのが現在の問題点でしょうか?
そうであれば、ヒントを出すには、
元のソースにあった、TTN_NEEDTEXTのハンドラも必要なのですが、
ありますでしょうか?
既にあるのでしたら、拡張コンボ上にカーソルをしばらく置いたとき、
OnToolTipNotify()は呼び出されますか?
dairygoodsさんへ
大変お世話になっております。
先、誤解を招いてしまって申し訳ないです。
1.OnToolHitTest()が呼び出されないという問題に関して
解決しました。
2.TTN_NEEDTEXTのハンドラに関して
下記のようにTTN_NEEDTEXTのハンドラを入れたが、
ComboBoxのヒントは出るが、ComboBoxExのヒントは出ないです。
BEGIN_MESSAGE_MAP(CCheckToolTipView, CFormView)
//{{AFX_MSG_MAP(CCheckToolTipView)
// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除しま
す。
// この位置に生成されるコードを編集しないでください。
//}}AFX_MSG_MAP
// 標準印刷コマンド
...
...
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify)
END_MESSAGE_MAP()
...
...
BOOL CCheckToolTipView::OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT *
pResult )
{
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
UINT nID =pNMHDR->idFrom;
if (pTTT->uFlags & TTF_IDISHWND)
{
// idFrom is actually the HWND of the tool
nID = ::GetDlgCtrlID((HWND)nID);
if(nID)
{
pTTT->lpszText = MAKEINTRESOURCE(nID);
pTTT->hinst = AfxGetResourceHandle();
return(TRUE);
}
}
return(FALSE);
}
さらに、OnToolTipNotify()の最初に
::MessageBox( NULL, OnToolTipNotify()に入った, 確認メッセージ, 0);
を入れてみたが、やはりコンボ上にカーソルを置いたら、確認メッセージが
出たけど、拡張コンボ上にカーソルをしばらく置いても、確認メッセージが
出なかったんです。よって、ハンドラOnToolTipNotifyは拡張コンボを認識
しないではと思いますが。
度々すみませんが、宜しくお願いいたします。
最初に書いたように、この方法はドロップダウンリスト
(コンボに文字列を入力できないタイプ)
でないと、まともに動かないと思いますが、問題ないでしょうか?
それ以外はちょっと原因が思いつかないです。
スタイルはどうなってますか?
>ドロップダウンリストではうまく表示されるようになりました。
>ドロップダウンの場合は、矢印の上でだけ表示されます…。
OnToolHitTestについて
> if ( strcmp( name, ComboBoxEx32) == 0) {
> // 拡張コンボの場合、その子ウィンドウに置き換える
/////// ここにブレークポイントまたは確認メッセージをいれてみては? ///////
> pTI->uId = (UINT)::GetWindow( hwnd, GW_CHILD);
/////// pTI->uId の値は ComboBoxExのIDになればいいのかな?
> }
dairygoodsさんへ
大変お世話になっております。
> 最初に書いたように、この方法はドロップダウンリスト
>(コンボに文字列を入力できないタイプ)
> でないと、まともに動かないと思いますが、問題ないでしょうか?
再度、確認しましたが、ドロップダウンリストとドロップダウンの
いずれの場合はツールヒントは出なかったんです。
dairygoodsさんはどうやったんですか?
恐縮ですが、簡単なサンプルをいただけませんか?
急がないです。不便なら、結構でございますが。
でも、dairygoodsさんから色々と勉強になりましたので、
感謝しています。
e-mail: cje58130@ams.odn.ne.jp
トオリスガリさんへ
ご回答頂いてありがとうございます。
早速ですが、ご提示の件を確認しました。
件1:
> スタイルはどうなってますか?
ComboBoxExがドロップダウンリストとドロップダウンの
いずれの場合はツールヒントは出なかったんです。
件2:
>OnToolHitTestについて
>> if ( strcmp( name, ComboBoxEx32) == 0) {
>> // 拡張コンボの場合、その子ウィンドウに置き換える
> /////// ここにブレークポイントまたは確認メッセージをいれてみては? ///////
>> pTI->uId = (UINT)::GetWindow( hwnd, GW_CHILD);
> /////// pTI->uId の値は ComboBoxExのIDになればいいのかな?
>> }
OnToolHitTest()はこんな感じです。
int CCheckToolTipView::OnToolHitTest( CPoint point, TOOLINFO* pTI) const
{
int r = CView::OnToolHitTest( point, pTI);
HWND hwnd = (HWND)pTI->uId;
char name[ 13];
::GetClassName( hwnd, name, sizeof( name));
if ( strcmp( name, ComboBoxEx32) == 0)
{
::MessageBox( NULL, ComboBoxEx です, msg, 0);
// 拡張コンボの場合、その子ウィンドウに置き換える
pTI->uId = (UINT)::GetWindow( hwnd, GW_CHILD);
}
else if ( strcmp( name, ComboBox) == 0)
{
::MessageBox( NULL, ComboBox です, msg, 0);
}
return r;
}
やってみた結果、コンボ上にカーソルを置くとComboBox ですという
メッセージが出ます。また、拡張コンボ上にカーソルを置くと
ComboBoxEx ですというメッセージが出ますが、OnToolTipNotify()に
入れ替えると、拡張コンボのツールヒントが出なくなります。
ちょっと不思議ですね。
また、ヒントがございましたら、教えていただければ幸いです。
宜しくお願いいたします。
XXX さんへ
マルチポストはいけないことですがこのマルチポストにはそれなりの理由があったので
無言で責めるようなことは・・・
らららさんへ
このレス 上のと一緒に消してください。
リベンジ! というわけでもないけど
dairygoodsさんの方法で試してみました。
ドロップダウンで。矢印の上と微妙な境界部分で表示されます。
ただ、コンボボックスと拡張コンボボックス、その他のボタンなどを配置してみて
コンボボックスにフォーカスがあると(キャレット?がチカチカしてると)
マウスを拡張コンボボックスの上に移動しても
OnToolHitTestが呼ばれたり呼ばれなかったり?
他のコントロールをクリックした後などはちゃんと呼ばれるのですが???
コントロールを増やしてテストされてみては?
関係ないかもしれませんが、Win2000,VC++6,COMCTL32.DLLのバージョンは5.81.3103.1000で
す。
それと
>入れ替えると、拡張コンボのツールヒントが出なくなります。
入れ替える?
OnToolHitTest()とOnToolTipNotify()、両方あって良いんですよね?
入れ替えたりしなくても?
?だらけの?でした。
マルチポストはダメですよ。
無言で通報するのはイメージ悪いですけど。
マルチポストを許可するならするで、「使用上の注意」を書き換える必要があります。
今のところ、止めて下さいと書いています。
> dairygoodsさんはどうやったんですか?
> ですが、簡単なサンプルをいただけませんか?
掲示板上で解決するのが筋だと思いますので、
もうちょっと粘ってみます。
私は以下のように作成しました。
1) SDIプロジェクトを作りビューはCFormViewを選択。
2) OnInitialUpdate()にEnableToolTips(TRUE)を追加。
3) OnToolHitTest()関数を追加。
4) TTN_NEEDTEXTハンドラOnToolTipNotify()を追加。
5) ダイアログリソースに適当にコントロールを配置。
6) 文字列リソースにコントロールに対応したヒントを追加。
各関数の中身は、ここに書き込まれている通りです。
コントロールを操作してしまうと出にくく?なるようです。
?さん
レスありがとうございます。
> コントロールを増やしてテストされてみては?
実際には、ボタンとかエディットなどのコントロールを
増やしてやってみたが、いずれは拡張コンボ以外の
コントロールは問題がなかったが.
> OnToolHitTest()とOnToolTipNotify()、両方あって良いんですよね?
> 入れ替えたりしなくても?
実際には、両方あってのパターンもやりましたが、
だめでした。
どうしようもないかね。
またよろしくお願いいたします。