MFC中给静态文本加上提示的做法

作者:朱金灿

来源:http://www.cnblogs.com/clever101/

 

 

还是那句老话:纸上得来终觉浅,绝知此事要躬行。前天给同事解决了一个问题,他动态创建了一个静态控件,可是这个静态控件的ToolTip总是显示不出来。我提示他在创建时要设置一下窗口风格。果然他在创建时加上SS_NOPREFIX就好了。

 

今天抽空把这个知识记录一下(这也算是我的一个习惯了,无关乎技术含量),上网搜了一下CToolTipCtrl类的用法,搜到一篇文章:

 

CToolTipCtrl 使用详细解说

 

我测试了该文的做法,发现要与该文作者商榷一下了。该文作者说:

ToolTip是 Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法。

    一般用法步骤:

    1.添加CToolTipCtrl成员变量 m_tt。

    2.在父窗口中调用 EnableToolTips(TRUE);

    3. 在窗口的OnCreate(或者其他适当的位置)中向ToolTip中添加需要显示Tip的子窗口,并同时指定相应的显示字串 CToolTipCtrl::AddTool(pWnd,"string to display")

    4.重载父窗口的 BOOL PreTranslateMessage(MSG* pMsg) ,在函数中调用 m_tt.RelayEvent(pMsg)

下面假设在窗口CWndYour中使用 CToolTipCtrl

 

但是我照该文的做法,移动鼠标到静态文本控件上提示并没出来。我感觉正确的做法应该是设置窗口风格。具体是,如果你是拖来控件的做法,要把Notify的属性设为TRUE,具体如下图:

 

 

如果你是动态创建静态文本控件,必须给窗口风格添加SS_NOTIFY(其它窗口我也估计也类似),具体是:


class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// 对话框数据
    enum { IDD = IDD_ABOUTBOX };

protected:
    
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
    DECLARE_MESSAGE_MAP()
public:
    
virtual BOOL OnInitDialog();

private:

    CToolTipCtrl m_tt; 

    CStatic m_StaticText;

public:
    
virtual BOOL PreTranslateMessage(MSG* pMsg);
};

BOOL CAboutDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    
// TODO:  在此添加额外的初始化

    m_StaticText.Create(_T(
"my static"), WS_CHILD|WS_VISIBLE|WS_BORDER|SS_NOTIFY, 
        CRect(
10,10,150,50),this);

    m_tt.Create(
this); 

    m_tt.Activate(TRUE); 


    m_tt.AddTool(
&m_StaticText,_T("这是一个静态文本!"));//添加

    
return TRUE;  // return TRUE unless you set the focus to a control
    
// 异常: OCX 属性页应返回FALSE
}

BOOL CAboutDlg::PreTranslateMessage(MSG
* pMsg)
{
    
// TODO: 在此添加专用代码和/或调用基类
    if (NULL != m_tt.GetSafeHwnd())            
        m_tt.RelayEvent(pMsg);


    
return CDialog::PreTranslateMessage(pMsg);
}


    我的编译环境为: VS 2005 + sp1, Win XP sp3。

 

参考文献:

 

1. CToolTipCtrl 使用详细解说

 

 

 

posted @ 2010-05-01 14:31  是金子就会灿烂  阅读(3750)  评论(0编辑  收藏  举报