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

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

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

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

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


プロジェクトファイル ダウンロード
// stdafx.h
#pragma once

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

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

// MainDlg.h
#pragma once

class CMainDlg : public CDialogImpl<CMainDlg>
{
public:
    enum { IDD = IDD_MAINDLG };

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

    BEGIN_MSG_MAP(CMainDlg)
        MSG_WM_INITDIALOG(OnInitDialog)
        COMMAND_ID_HANDLER_EX(IDOK, OnOK)
        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
    END_MSG_MAP()

    BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam){
        // スクリーンの中央に配置
        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, CWindow wndCtl){
        EndDialog(nID);
    }

    void OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl){
        EndDialog(nID);
    }
};
			

// SampleProject.cpp
#include "stdafx.h"
#include "resource.h"
#include "MainDlg.h"

CAppModule _Module;

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

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

    AtlInitCommonControls(ICC_BAR_CLASSES);

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

    CMainDlg dlg;
    int nRet = (int) dlg.DoModal();

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

    return nRet;
}
			

 まず、リソースを作成します。ダイアログにエディットコントロールを配置し、 [ID]を次のように設定します。 なお、エディットコントロールの[プロパティ]では[MultiLine]、[Horizontal Scroll]、 [Vertical Scroll]、[Auto VScroll]、[Want Return]を[True]に設定します。

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

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

 CMainDlgクラスでは、まず、エディットコントロール用に CEditクラスのインスタンスをメンバ変数として宣言します。 これを使うためには、WM_INITDIALOGメッセージハンドラでコントロールのハンドルを代入する必要があります。

 次に、WM_INITDIALOGメッセージハンドラでツールチップコントロールを作成し、 エディットコントロールに対するツールチップ情報をツールチップコントロールに追加します。 ツールチップ情報はTOOLINFO構造体から派生したCToolInfoクラスでカプセル化されます。 CToolInfoクラスのコンストラクタ引数は、順にTOOLINFO構造体の uFlags、hwnd、uId、rect、lpszText、lParamに対応し、第3引数以降は省略可能です。

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

 なお、表示するツールチップ文字列を複数行にすることもできます。 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
#pragma once

class CMainDlg : public CDialogImpl<CMainDlg>
{
public:
    enum { IDD = IDD_MAINDLG };

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

    BEGIN_MSG_MAP(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()

    BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam){
        // スクリーンの中央に配置
        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, CWindow wndCtl){
        EndDialog(nID);
    }

    void OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl){
        EndDialog(nID);
    }
};
			

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

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