2016-06-28 24 views
0

私はすでにツールチップの生成を扱っているアプリケーションを持っています。私は親フレームを持つCWnd派生クラスを変更しています。ツールチップは実装されていません。私はすでにあるツールチップのコードを活用したいと思いますので、私は、フレームウィンドウを取得するためにGetParentFrame()を使用することができますCFrameWndにTTN_NEEDTEXTを転送する方法はありますか?

BEGIN_MESSAGE_MAP(CMyWindow, CWnd) 
    ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify) 
    ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify) 
END_MESSAGE_MAP() 

BOOL CMyWindow::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) 
{ 
    UNREFERENCED_PARAMETER(id); 
    UNREFERENCED_PARAMETER(pResult); 

    // need to handle both ANSI and UNICODE versions of the message 
    TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; 
    TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; 
    CStringA strTipText; 
    UINT_PTR nID = pNMHDR->idFrom; 
    if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || 
     pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND)) 
    { 
     // idFrom is actually the HWND of the tool 
     nID = ::GetDlgCtrlID((HWND)nID); 
    } 

    if (nID != 0) // will be zero on a separator 
     strTipText.Format("Control ID = %d", nID); 

    if (pNMHDR->code == TTN_NEEDTEXTA) 
    { 
     strncpy_s(pTTTA->szText, sizeof(pTTTA->szText), strTipText, 
      strTipText.GetLength() + 1); 
    } 
    else 
    { 
     ::MultiByteToWideChar(CP_ACP, 0, strTipText, strTipText.GetLength() + 1, 
      pTTTW->szText, sizeof(pTTTW->szText)/(sizeof pTTTW->szText[0])); 
    } 

    return TRUE; // message was handled 
} 

thisから

、私は、ツールチップには、次のコードを追加して表示するために取得することができます私は一貫した外観を得るためにその場で。 TTN_NEEDTEXTメッセージをフレームウィンドウで処理できるように転送できる方法はありますか?

+0

'GetParentFrame()'はHWNDまたはCWindowを返しますか? – andlabs

+0

@andlabs私の机ではないが、HWNDではなくクラスを返すと思う。 – Adrian

+1

私は、Unicode文字列を使用して、必要に応じて*を* CP_ACPに変換することをお勧めします。 – andlabs

答えて

3

メッセージマップにON_NOTIFY_whateverを使用します。これは、TTN_NEEDTEXTが使用するメッセージがWM_NOTIFYであることを暗示するはずです。実際これがそうです。だから自分でWM_NOTIFYを作り、それを親に送ってください。

The documentation for WM_NOTIFYは、wParamはコントロールの識別子であり、lParamNMHDRポインタです。あなたがメッセージを再構築するために必要なすべてを持っているのでwParamは、NMHDRのちょうどidFrom一員であることを示しているページの一番下の例があります:

LRESULT lr = this->GetParentFrame()->SendMessage(WM_NOTIFY, pNMHDR->idFrom, (LPARAM) pNMHDR); 

あなたは、この呼び出しは何あなた次第です発行する必要があります場合にはする必要があります。この場合、最初の呼び出しを行い、文字列をオーバーライドしてTRUEを返すことをお勧めします。私は、しかし、完全には分かりません。

注:MFCにこれを行う機能がある場合はわかりません。私は個人的にはMFCを使用しませんが、概念は同じです。

その戻り値はどうですか?SendMessage()?さて、pResultで返すことができます(たとえば、親の変更を微調整するだけの場合)。または、無視してカスタム値を返すことができます。しかし、TTN_NEEDTEXTの場合は問題ありません。 TTN_NEEDTEXT doesn't care what the LRESULT is

+0

それでは、 'pResult'はどうなりますか? – Adrian

+0

ああ、私は完全にそのパラメータを逃した!答えを編集する。 – andlabs

+0

涼しいので無視されます。これらのM $ページを読む方法についてのドキュメントがありますか?私はいつもそれが何を意味するのかを理解しようとするのが難しいし、外出して常に尋ねなければならないのは面倒です。 : – Adrian

関連する問題