我正在尝试在CMfcButton上显示工具提示。
当我的代码运行SetToolTip()时,应用程序崩溃。
BOOL CGenerationDlg::OnInitDialog()
{
BOOL bret = CPropertyPage::OnInitDialog();
m_pButtonExport = (CMFCButton *)GetDlgItem(IDC_BTN_EXPORTE_BILAN);
m_pButtonExport->EnableFullTextTooltip();
m_pButtonExport->SetTooltip(L"my tooltip");
return bret;
}
void CKenoDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
}
这是我的头文件:
// KenoDlg.h : fichier d'en-tête
//
#pragma once
#include "keno.h"
#include "AboutDlg.h"
// boîte de dialogue CKenoDlg
class CKenoDlg : public CPropertyPage
{
// Construction
public:
CKenoDlg(CWnd* pParent = NULL); // constructeur standard
CAboutDlg* myDialog;
// Données de boîte de dialogue
enum { IDD = IDD_KENO_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // Prise en charge de DDX/DDV
CMFCButton * m_pButtonExport;
// Implémentation
protected:
HICON m_hIcon;
// Fonctions générées de la table des messages
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedBtnGenerate();
afx_msg void OnBnClickedBtnExport();
afx_msg void OnStnClickedStaticAbout();
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
};
这是我的错误:
有什么想法吗?
非常感谢 :)
最好的祝福,
最佳答案
试试这个:
更改 header 以定义CMFCButton
实例而不是指针:
class CKenoDlg : public CPropertyPage
{
// ... existing code ...
protected:
virtual void DoDataExchange(CDataExchange* pDX); // Prise en charge de DDX/DDV
CMFCButton m_pButtonExport;
// ... existing code ...
};
然后,如下更改
DoDataExchange
函数:void CKenoDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BTN_EXPORTE_BILAN, m_pButtonExport);
}
最后,在
OnInitDialog
中,执行以下操作:BOOL CGenerationDlg::OnInitDialog()
{
BOOL bret = CPropertyPage::OnInitDialog();
m_pButtonExport.EnableFullTextTooltip();
m_pButtonExport.SetTooltip(L"my tooltip");
return bret;
}
之所以需要这样做而不是使用指针,是因为MFC必须将控件子类化为
CMFCButton
而不是默认的CButton
。当您在DDX
中使用DoDataExchange
宏时,这是在幕后完成的,当OnInitDialog
的默认实现调用UpdateData
时,它又调用DoDataExchange
,并且-如果我没记错的话-第一次使用,则对话框控件被归为正确的类型。由于使用了指针,并且按钮控件和使用它的类型之间没有链接,因此实际类型和预期类型之间不匹配,这就是崩溃的原因。
如果使用VS2012向导从对话框设计器中添加变量(右键单击对话框控件并选择“添加变量”),它将在头文件中创建成员变量声明,并将
DDX
宏添加到DoDataExchange
函数,用于您。然后,您可以选择更改成员变量的类型,例如从CButton
到您自己的CButton
派生类之一。