2016-04-06 63 views
0

私は80文字以上をサポートするツールチップを持つために、CListCtrlのOnToolTipNotifyをオーバーライドしようとしています。特定のセルに対してツールチップを表示したい。私はこれに関連したたくさんの投稿を見てきましたが、誰も私にこれを行う最善の方法を理解するのを完全に手伝ってくれませんでした。ここまで私がこれまで持っていたことはありますが、私はT2Wを使用するワイド文字コードに懸念しています。私はT2Wがスタックからメモリを使い、関数が返ってきたらそれがクリーンアップされると読んでいます。したがって、lpszTextは無効になります。これはうまくいくようですが、私はそれを行う別の方法を見つけることができません。MFC CListCtrl OnToolTipNotify

BOOL CListCtrlEx::OnToolTipNotify(UINT tooldId, NMHDR* notifMsg, LRESULT result) 
{ 
    USES_CONVERSION; 
    TOOLTIPTEXTA* tttA = reinterpret_cast<TOOLTIPTEXTA*>(notifMsg); 
    TOOLTIPTEXTW* tttW = reinterpret_cast<TOOLTIPTEXTW*>(notifMsg); 
    ... 
    int row, col; 
    cellHitTest(row, col); 
    CString tipStr; 

    // Note getTooltip() returns const ref to cell's tooltip string 
    if (-1 < row && -1 < col) 
     tipStr = m_Data[row]->colvals[col]->getTooltip(); 

    if (tipStr.IsEmpty()) return FALSE; 

    if (TTN_NEEDTEXTA == notifMsg->code) 
    { 
     tttA->lpszText = tipStr.GetBuffer(); 
     tttA->hinst = 0; 
    } 
    else 
    { 
     // Question: Is this a problem? Will the buffer pointed to 
     // by tttW->lpszText be deleted after this function ends 
     // making the pointer invalid? 
     tttW->lpszText = T2W(tipStr.GetBuffer()); 
     tttW->hinst = 0; 
    } 

    ... 
} 
+0

私は 'ON_NOTIFY_REFLECT(LVN_GETINFOTIP、OnGetInfoTip)'と '無効CMyListCtrlExを使用:: OnGetInfoTip(NMHDR * pNMHDR、LRESULT * PRESULT)' – sergiol

答えて

0

あなたの質問を私の最善の努力で理解しようとしました。 CStringを使用することができますが、ワイド変換はT2W変換マクロなしでは直接使用できません。これが疑問であれば、単にCStringW -​​をこのタイプの変数に代入してlpszTextに渡すだけです。

codeTTN_NEEDTEXTAでない場合は、TTN_NEEDTEXTWである必要があります。この仮定は間違っています。

編集:From this article、私は動的に割り当てる必要があることを知りました。お役に立てれば!

TTN_NEEDTEXTメッセージハンドラと1を使用すると、80文字以内 ツールチップを表示させたい場合は、1が欲しかった テキストバッファを割り当て、TOOLTIPTEXTを設定する必要があります:: lpszTextポインタメッセージでこの テキスト・バッファには、ハンドラ(1手動でこのテキスト バッファの割り当てを解除する必要があります):

+0

これは何の助けませんでした。あなたの言うことは、私のコードの問題はMSDNの文書 - https://msdn.microsoft.com/en-us/library/sa23xtsw.aspxに似ています。例では、szTextを使用していますが、これは80文字の制限があります。私はlpszTextを使用して80文字を超えるツールチップを使用しようとしています。 – user2971092

+0

答えを編集しました。 'tagNMTTDISPINFOW :: szText'が' 80'サイズの配列/ – Ajay

+0

と定義されているのを見ましたが、その記事を見ましたが、いつ/どこに/どのようにテキストバッファの割り当てを解除するのか分かりません。割り当て解除できるところにツールチップメッセージが表示されなくなったときに、別のコールバックがありますか?私は 'T2W'の代わりに上記のコードで' tipStr.AllocSysString() 'を使用することができますか? – user2971092

0

これは私が使用するコードです: tiptextは、私は m_pchTipとm_pwchTipは私のリストコントロールのメンバーで表示したいテキストを含むCStringのです。

if(m_pchTip != NULL) 
    { 
     delete[] m_pchTip; 
     m_pchTip = nullptr; 
    } 

    if(m_pwchTip != NULL) 
    { 
     delete[] m_pwchTip; 
     m_pwchTip = nullptr; 
    } 

     if(pNMHDR->code == TTN_NEEDTEXTA) 
     { 
      TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; 
      m_pchTip = new char[tiptext.GetLength() + 1]; 
      lstrcpyn(m_pchTip,tiptext,tiptext.GetLength() + 1); 
      m_pchTip[tiptext.GetLength()] = 0; 
      pTTTA->lpszText = m_pchTip; 
     } 
     else 
     { 
      TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; 
      m_pwchTip = new WCHAR[tiptext.GetLength() + 1]; 
      _mbstowcsz(m_pwchTip,tiptext,tiptext.GetLength() + 1); 
      m_pwchTip[tiptext.GetLength()] = 0; 
      pTTTW->lpszText = (WCHAR*)m_pwchTip; 
     } 
+0

あなたの答えは有望そうです。私はそれを試してみましょう。 TTN_NEEDTEXTAの場合、 'pTTTA-> lpszText = tiptext.GetBuffer();で十分ではないでしょうか? – user2971092

+0

tiptextが有効範囲外になると、ポインタが無効になります。 – dwo

+0

私の場合、 'tiptext'はセルのメンバのconst refですので、それは問題ないと思います。しかし今、私は 'TTN_NEEDTEXTA'をサポートする必要性について質問しています。 'pNMHDR-> code'は私にとっては' TTN_NEEDTEXTW'と常に等しいので、 'TTN_NEEDTEXTA'をどのようにテストするか分かりません。 – user2971092

0

これは私がやったことです。私がTTN_NEEDTEXTA == notifMsg->codeのケースを処理する必要がある私のアプリケーションでは、私はそれをサポートしていないケースを見つけることができなかったので。メッセージマップからON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA...)を削除しました。CListCtrlEx::OnToolTipNotifyTTN_NEEDTEXTA == notifMsg->codeの場合はFALSEを返します。 ANSI対UNICODEをよく理解すると、私はそれを再訪します。

私のセルクラスでは、CString tooltipのメンバーをCStringWに変更しました。 CListCtrlEx :: OnToolTipNotify関数は、セルのCStringWメンバーにアクセスできるので、lpszText = const_cast<LPWSTR>((LPCWSTR)m_Data[row]->colvals[col]->tooltip)を設定します。

関連する問題