我正在尝试在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派生类之一。

07-27 13:33