CToolTipCtrl
CToolTipCtrlは、ツールチップを表示するクラスでMFCとWTLでそれぞれ存在しています。MFCのCToolTipCtrlは、MSDNから引用させてもらうと、
このコンロトールは、アプリケーションでツールの目的を説明する 1 行のテキストを表示する小さなポップアップ ウィンドウです。
とのことで、1行しか表示できない上に使い方も多少面倒です。一方WTLのCToolTipCtrlは、WindowsのコントロールToolTip Controlからきており複数行表示やバルーンツールチップなどもできます。ということで、今回はMFCの環境でWTLのCToolTipCtrlを使う方法を紹介します。
インクルード
ヘッダーのインクルードとしては、直接的には
1 |
#include <atlctrls.h> |
をします。また、WTLを使用するということでstdafx.hあたりで
1 2 |
#include <atlbase.h> #include <atlapp.h> |
をするのですが、CMenuやCPaintDCがMFCのとかぶってしまうので#include <atlbase.h>の前に
1 |
#define _WTL_NO_AUTOMATIC_NAMESPACE |
を書きます。しかしこれを書いてもエラーが出ます。
c:\wtl\include\atlctrls.h(1986) : error C3861: ‘ImageList_Read’: 識別子が見つかりませんでした
c:\wtl\include\atlctrls.h(2093) : error C3861: ‘ImageList_Read’: 識別子が見つかりませんでした
c:\wtl\include\atlctrls.h(2099) : error C3861: ‘ImageList_Write’: 識別子が見つかりませんでした
c:\wtl\include\atlctrls.h(2106) : error C3861: ‘ImageList_ReadEx’: 識別子が見つかりませんでした
c:\wtl\include\atlctrls.h(2112) : error C3861: ‘ImageList_WriteEx’: 識別子が見つかりませんでした
おそらくこんなのが出てくるかと思います。これを回避するには、#include <atlbase.h>の前に
1 |
#undef __IStream_INTERFACE_DEFINED__ |
このようなものを書けばよいかと思います。おそらく、#include <afxwin.h>内のインクルード順序などでImageList_*が定義されなくなっているのではないかと思います。
コーディング
コーディングはいたって簡単で、使いたいウィンドウのクラスのメンバーで
1 |
WTL::CToolTipCtrl tooltip_; |
を定義しOnInitDialog内でこのようなものを書けば終了です。
1 2 3 4 5 6 |
tooltip_.Create( *this ); tooltip_.Activate( TRUE ); tooltip_.SetMaxTipWidth( 120 ); tooltip_.SetTitle( 1, _T( "タイトル" ) ); WTL::CToolInfo toolinfo( TTF_SUBCLASS, *this, 0, 0, _T( "テキスト" ) ); tooltip_.AddTool( toolinfo ); |
また、OnMouseMoveなどで
1 |
tooltip_.UpdateTipText( _T( "移動などに\r\n応じて変更\r\nMFCのよりも便利" ), *this ); |
このようにテキストを変えるのも有効でしょう。実際下のように表示されます。