0

カスタム実装のツールチップ システムを持つ CWnd オブジェクトから派生したコントロールがあります。ツールチップは CDialog を使用して実装され、正常に動作しますが、いつ非表示にする必要があるかを知るのに問題があります。

ツールチップは、マウスをコントロールの上に置くと表示され (WM_MOUSEHOVER)、マウスがコントロールから離れると非表示になります (WM_MOUSELEAVE)。ここまでは順調ですね。問題は、コントロールが設定されているダイアログがメニューから非表示になる可能性があることです (破棄されず、メニューから再度表示できます)。これが発生すると、WM_MOUSELEAVE イベントはコントロールに送信されず、ツールチップは削除されません...新しいダイアログの上に表示されます。

私の質問は: コントロールが隠されていることを知る方法はありますか? コントロールが設定されているダイアログの WM_SHOWWINDOW メッセージをキャプチャできることはわかっていますが、コードを追加しなくても他の場所でコントロールを使用できるように、コントロール自体から実行したいと考えています。

前もって感謝します!

ハビエル

4

1 に答える 1

2

通常、ダイアログ メッセージを転送する必要があるカスタム コントロールがある場合は、サブクラス化を使用します。次のようなもの

BOOL CMyDialog::OnInitDialog() 
{
    m_MyCtrl.SubclassDlgItem(IDC_MY_CTRL_ID,this);
    CMyDialog::OnInitDialog();
    return TRUE;
}

次に、コントロールからダイアログ メッセージを処理できます。

BEGIN_MESSAGE_MAP(CMyCtrl, CWnd)
    //{{AFX_MSG_MAP(CMyCtrl)
    ON_WM_SHOWWINDOW()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CMyCtrl::OnShowWindow(BOOL bShow,UINT nStatus ) 
{
.
.
}

コントロールを利用するには、ホスト ダイアログ コードを多少変更する必要がありますが、コントロールは再利用可能です。

于 2009-02-04T16:30:07.850 に答える