3

から派生したクラスがありCTreeCtrlます。ここでは、デフォルトのオブジェクトをカスタムのオブジェクトOnCreate()に置き換えます。CToolTipCtrl

int CMyTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
        return -1;

    // Replace tool tip with our own which will
    // ask us for the text to display with a TTN_NEEDTEXT message
    CTooltipManager::CreateToolTip(m_pToolTip, this, AFX_TOOLTIP_TYPE_DEFAULT);
    m_pToolTip->AddTool(this, LPSTR_TEXTCALLBACK);
    SetToolTips(m_pToolTip);

    // Update: Added these two lines, which don't help either
    m_pToolTip->Activate(TRUE);
    EnableToolTips(TRUE);
    
    return 0;
}

私のメッセージハンドラは次のようになります。

ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CMyTreeCtrl::OnTtnNeedText)

しかし、私はTTN_NEEDTEXTメッセージを受け取りません。Spy ++を見てみましたが、このメッセージが送信されないようです。

ここで何が問題になる可能性がありますか?

アップデート

これが適切かどうかはわかりません。CTreeCtrlの親ウィンドウのタイプはCDockablePaneです。これが機能するために必要な追加の作業がありますか?

4

5 に答える 5

5

ついに!私は(部分的に)それを解決しました:

CDockablePane 親ウィンドウが実際にこの問題を引き起こしたようです...

最初に、CTreeCtrl から派生したクラスからツールチップ固有のコードをすべて削除しました。すべてが親ペイン ウィンドウで行われます。

次に、親ウィンドウのOnCreate()メソッドを編集しました。

int CMyPane::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDockablePane::OnCreate(lpCreateStruct) == -1)
        return -1;

const DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
    TVS_CHECKBOXES | TVS_DISABLEDRAGDROP | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT |
    TVS_INFOTIP | TVS_NOHSCROLL | TVS_SHOWSELALWAYS;

// TREECTRL_ID is a custom member constant, set to 1
if(!m_tree.Create(dwStyle, m_treeRect, this, TREECTRL_ID ) )
{
    TRACE0("Failed to create trace tree list control.\n");
    return -1;
}

// m_pToolTip is a protected member of CDockablePane
m_pToolTip->AddTool(&m_tree, LPSTR_TEXTCALLBACK, &m_treeRect, TREECTRL_ID);
m_tree.SetToolTips(m_pToolTip);


return 0;

}

残念ながら、ツール ID が設定されていない場合、基本クラスはメンバーについてAddTool()の形式で文句を言うため、より少ないパラメーターで単純に呼び出すことはできません。ID を設定する必要があるため、長方形も設定する必要があります。メンバーを作成し、CTor に設定しました。ツールの四角形のサイズを変更する有効な方法をまだ見つけていないので、これは私の非常に醜い回避策です。これが、このソリューションを部分的と呼ぶ理由でもあります。更新:これに関して質問しました。ASSERTuFlagCRect(0, 0, 10000, 10000)

最後に、ツールチップ情報を取得するハンドラーがあります。

// Message map entry
ON_NOTIFY(TVN_GETINFOTIP, TREECTRL_ID, &CMobileCatalogPane::OnTvnGetInfoTip)


// Handler
void CMyPane::OnTvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMTVGETINFOTIP>(pNMHDR);

    // This is a CString member
    m_toolTipText.ReleaseBuffer();
    m_toolTipText.Empty();

    // Set your text here...

    pGetInfoTip->pszText = m_toolTipText.GetBuffer();

    *pResult = 0;
}
于 2009-05-15T09:05:15.447 に答える
4

ビルトインを交換する場合でも、ツールチップを有効にする必要があると思います。

EnableToolTips(TRUE);

まあ、それはあなたにとってうまくいかなかったので、そして誰も助けを提供していないので、ここに私からのいくつかの提案があります。彼らは足が不自由ですが、彼らはあなたを再び動かすかもしれません:

  • OnCreate()rotineが実際に実行されていることを確認してください。
  • ツールチップを交換する前に、ツールチップを有効にしてください。
  • これを行うために使用するコードは次のようになります。(私はすべての詳細を理解していないことを告白します、私はそれをいくつかのサンプルコードからコピーしました、それはうまくいきました、そしてそれで私はそれをもう見ませんでした。)

    //標準のツールチップを有効にします

    EnableToolTips(TRUE);

    //組み込みのツールチップを無効にします

    CToolTipCtrl * pToolTipCtrl =(CToolTipCtrl *)CWnd :: FromHandle((HWND):: SendMessage(m_hWnd、LVM_GETTOOLTIPS、0、0L));

于 2008-11-06T19:01:20.137 に答える
1

OnToolHitTest() をオーバーライドする必要はありませんか?

(旧) リソース 1

(旧) リソース 2:

ヒット コード (nHit) を返すだけでなく、TOOLINFO 構造体にも入力する必要があります。VIRGIL が CMainFrame::OnToolHitTest で行う方法は次のとおりです。

 int nHit = MAKELONG(pt.x, pt.y);
 pTI->hwnd = m _ hWnd;
 pTI->uId  = nHit;
 pTI->rect = CRect(CPoint(pt.x-1,pt.y-1),CSize(2,2));
 pTI->uFlags |= TTF _ NOTBUTTON;
 pTI->lpszText = LPSTR _ TEXTCALLBACK;

hwnd や uId の設定など、ほとんどは明らかですが、そうでないものもあります。rect メンバーを、マウスの位置を中心とした幅 2 ピクセル、高さ 2 ピクセルの四角形に設定します。ツールチップ コントロールは、この四角形を「ツール」の境界四角形として使用します。これを小さくしたいので、マウスをどこにでも移動すると、ツールの外に移動することになります。ツールチップはボタンに関連付けられていないため、uFlags に TTF_NOTBUTTON を設定します。これは、afxwin.h で定義されている特別な MFC フラグです。MFC はそれを使用して、ツールヒントのヘルプを実行します。ツールチップ用の別の MFC 拡張フラグ、TTF _ ALWAYSTIP があります。ウィンドウがアクティブでないときでも MFC にヒントを表示させたい場合に使用できます。お気づきかもしれませんが、これまでのところ、MFC、ツールヒント、または TOOLINFO に、ヒントの実際のテキストが何であるかを伝えていません。それが LPSTR _ TEXTCALLBACK の目的です。この特別な値は、ツールヒント コントロール (MFC が使用する内部のスレッド グローバル コントロール) に、ウィンドウを呼び出してテキストを取得するように指示します。これは、通知コード TTN _ NEEDTEXT を含む WM _ NOTIFY メッセージをウィンドウに送信することによって行われます。

于 2009-04-28T18:55:38.910 に答える
1

私は CTreeCtrl で試したことはありませんが、ツールチップ ctrl の RelayEvent を呼び出して、ツールチップをいつ表示する必要があるかを知る必要があると思います。これを試して:

MyTreeCtrl.h:

virtual BOOL PreTranslateMessage(MSG* pMsg);

MyTreeCtrl.cpp:

BOOL CMyTreeCtrl::PreTranslateMessage(MSG* pMsg) 
{
    m_pToolTip.Activate(TRUE);
    m_pToolTip.RelayEvent(pMsg);

    return CTreeCtrl::PreTranslateMessage(pMsg);
}

これが助けになることを願っています。

于 2008-11-09T00:06:53.593 に答える
0

すべてのツールチップ ID を具体的に処理してみてください。

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, &CMyTreeCtrl::OnNeedTipText)

それでもうまくいかない場合は、RelayEvent() を PreTranslateMessage() から手動で呼び出す必要がある場合があります。

于 2008-11-08T05:31:13.627 に答える