ホーム ATL/WTL
ツールチップ
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2004/02/07
PR
 WTLではコモンコントロールのツールチップコントロールをCToolTipCtrlT というテンプレートクラスでカプセル化しています。 テンプレート引数にはクラスを指定しますが、 そのクラスはCToolTipCtrlTクラスの基底クラスとして使用されます。 atlctrls.hヘッダではtypedefによって次のように宣言されています。

// atlctrls.h内
typedef CToolTipCtrlT<ATL::CWindow>   CToolTipCtrl;
			

これは、CToolTipCtrlクラスはCWindowクラスの派生クラスであることを意味します。

 WTLのCToolTipCtrlクラスは、MFCの同名のクラスと同等の機能を備えているほか、 拡張機能も備えています。 以下に示すのは、CToolTipCtrlクラスを使用する例です。 表示するツールチップを静的に設定する方法と、動的に設定する方法を示します。

静的なツールチップ
 まず、ツールチップを静的に設定する方法です。 以下の例はダイアログ上のエディットコントロールにマウスカーソルを乗せると、 「edit control」というツールチップを表示します。


// stdafx.h内
#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>

#include <atlcrack.h>
#include <atlmisc.h>
#include <atlctrls.h>  // コントロール用クラスを使用するため
			

// maindlg.h内
class CMainDlg : public CDialogImpl<CMainDlg>
{
public:
    enum { IDD = IDD_MAINDLG };

    CEdit m_edit_tooltip;    // ツールチップ表示用

    // メッセージマップ
    BEGIN_MSG_MAP_EX(CMainDlg)
        MSG_WM_INITDIALOG(OnInitDialog)
        COMMAND_ID_HANDLER_EX(IDOK, OnOK)
        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
    END_MSG_MAP()

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){
        // スクリーンの中央に配置
        CenterWindow();

        // 大きいアイコン設定
        HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
            ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));
        SetIcon(hIcon, TRUE);
        
        // 小さいアイコン設定
        HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
            ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));
        SetIcon(hIconSmall, FALSE);

        // コントロール設定
        m_edit_tooltip = GetDlgItem(IDC_EDIT_TOOLTIP);

        // ツールチップコントロール作成
        CToolTipCtrl tooltip;
        tooltip.Create(m_hWnd);
        tooltip.Activate(TRUE);

        // エディットコントロールのツールチップ情報をツールチップコントロールに追加
        CToolInfo tiEdit(TTF_SUBCLASS, m_edit_tooltip, 0, NULL, _T("edit control"));
        tooltip.AddTool(tiEdit);

        return TRUE;
    }

    void OnOK(UINT uNotifyCode, int nID, HWND hWndCtl){
        EndDialog(nID);
    }

    void OnCancel(UINT uNotifyCode, int nID, HWND hWndCtl){
        EndDialog(nID);
    }
};
			

// Control.cpp内
#include "stdafx.h"

#include "resource.h"

#include "maindlg.h"

CAppModule _Module;

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)
{
    HRESULT hRes = ::CoInitialize(NULL);
    ATLASSERT(SUCCEEDED(hRes));

    ::DefWindowProc(NULL, 0, 0, 0L);

    AtlInitCommonControls(ICC_COOL_CLASSES | ICC_WIN95_CLASSES);

    hRes = _Module.Init(NULL, hInstance);
    ATLASSERT(SUCCEEDED(hRes));

    int nRet = 0;
    // BLOCK: アプリケーション実行
    {
        CMainDlg dlgMain;
        nRet = dlgMain.DoModal();
    }

    _Module.Term();
    ::CoUninitialize();

    return nRet;
}
			

 まず、リソースを作成します。ダイアログにエディットコントロールを配置し、 リソースIDを次のように指定します。 なお、エディットコントロールの[スタイル]ではデフォルト加え[複数行]、[水平スクロールバー]、 [垂直スクロールバー]、[垂直オートスクロール]、[改行を許可]にチェックを入れます。

コントロール名 リソースID
エディット IDC_EDIT_TOOLTIP

 次に、stdafx.h内では、CToolTipCtrlクラスを使用するためにatlctrls.hヘッダをインクルードします。

 次に、CMainDlgクラスのWM_INITDIALOGメッセージハンドラで エディットコントロールを初期化し、ツールチップコントロールを作成します。 その後エディットコントロールに対するツールチップ情報を作成してそれをツールチップコントロールに追加します。

これで、エディットコントロールにマウスカーソルを乗せるとツールチップが表示されます。

 なお、表示するツールチップ文字列を複数行にすることもできます。 そのためには、CToolTipCtrlクラスのメンバ関数であるSetMaxTipWidth()を使って、 ツールチップの幅を設定する必要があります。 こうすることで、幅よりも長い文字列は自動的に複数行で表示されます。


// OnInitDialog()内
CToolTipCtrl tooltip;
tooltip.Create(m_hWnd);
tooltip.Activate(TRUE);

// ツールチップ幅を設定
tooltip.SetMaxTipWidth(80);

CToolInfo tiEdit(TTF_SUBCLASS, m_edit_tooltip, 0, NULL, _T("複数行のツールチップ"));
tooltip.AddTool(tiEdit);
			

また、文字列の任意の場所で改行したい場合は、「\r\n」で改行することができます。


// OnInitDialog()内
CToolTipCtrl tooltip;
tooltip.Create(m_hWnd);
tooltip.Activate(TRUE);

// ツールチップ幅を設定
tooltip.SetMaxTipWidth(80);

CToolInfo tiEdit(TTF_SUBCLASS, m_edit_tooltip, 0, NULL, _T("複数行の\r\nツールチップ"));
tooltip.AddTool(tiEdit);
			

動的なツールチップ
 次に、ツールチップを動的に設定する方法を示します。 以下に示すのはダイアログ上のエディットコントロールにマウスカーソルを乗せると、 エディットコントロールの現在の行数をツールチップで表示する例です。 なお、前述の静的なツールチップを作成したプログラムのCMainDlgクラスだけを変更します。


// maindlg.h内
class CMainDlg : public CDialogImpl<CMainDlg>
{
public:
    enum { IDD = IDD_MAINDLG };

    CEdit m_edit_tooltip;    // ツールチップ表示用エディット

    // メッセージマップ
    BEGIN_MSG_MAP_EX(CMainDlg)
        MSG_WM_INITDIALOG(OnInitDialog)
        NOTIFY_CODE_HANDLER_EX(TTN_GETDISPINFO, OnTooltipGetDispInfo)
        COMMAND_ID_HANDLER_EX(IDOK, OnOK)
        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
    END_MSG_MAP()

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){
        // スクリーンの中央に配置
        CenterWindow();

        // 大きいアイコン設定
        HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
            ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));
        SetIcon(hIcon, TRUE);
        
        // 小さいアイコン設定
        HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
            ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));
        SetIcon(hIconSmall, FALSE);

        // コントロール設定
        m_edit_tooltip = GetDlgItem(IDC_EDIT_TOOLTIP);

        // ツールチップコントロール作成
        CToolTipCtrl tooltip;
        tooltip.Create(m_hWnd);
        tooltip.Activate(TRUE);

        // エディットコントロールのツールチップ情報をツールチップコントロールに追加
        CToolInfo tiEdit(TTF_SUBCLASS, m_edit_tooltip);
        tooltip.AddTool(tiEdit);

        return TRUE;
    }

    LRESULT OnTooltipGetDispInfo(LPNMHDR pnmh){
        LPNMTTDISPINFO pntdi = (LPNMTTDISPINFO)pnmh;

        if(pntdi->uFlags & TTF_IDISHWND){
            int ID = ::GetDlgCtrlID((HWND)pntdi->hdr.idFrom);
            if(ID == IDC_EDIT_TOOLTIP){
                CString strText;
                strText.Format(_T("%d行"), m_edit_tooltip.GetLineCount());
                lstrcpy(pntdi->szText, strText);
            }
        }

        return 0;
    }

    void OnOK(UINT uNotifyCode, int nID, HWND hWndCtl){
        EndDialog(nID);
    }

    void OnCancel(UINT uNotifyCode, int nID, HWND hWndCtl){
        EndDialog(nID);
    }
};
			

 まず、WM_INITDIALOGメッセージハンドラでツールチップ情報を作成する際、 第3引数以降を省略します。こうすると第5引数にはデフォルトでLPSTR_TEXTCALLBACKが指定され、 ツールチップを表示するタイミングで通知コードがTTN_GETDISPINFOWM_NOTIFYメッセージが発生するようになります。

 次に、通知コードがTTN_GETDISPINFOのツールチップコントロール用通知メッセージハンドラを追加します。 そのハンドラではエディットコントロールの現在の行数を取得し、 ツールチップとして表示しています。