2013-11-21 92 views
2

我试图在CMfcButton上显示工具提示。 当我的代码运行SetToolTip()时,应用程序崩溃。CMFCButton.SetToolTip()crash

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); 
}; 

这是我的错误:

enter image description here

任何想法吗?

感谢很多:)

最好的问候,

+0

该错误代码(0xC000041D)被标识为_STATUS_FATAL_USER_CALLBACK_EXCEPTION_。你能否重复这些步骤来重新创建未处理的异常? – rrirower

+0

复制步骤?我不明白对不起!该错误出现在SetToolTip()调用中。 –

+0

当您在资源编辑器中添加按钮时,是否将其添加为“CMFCButton”或“CButton”?如果是后者,您可能会错过通常在DDX宏中完成的子类化步骤。 –

回答

2

试试这个:

更改标题定义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。当您使用DoDataExchange中的DDX宏时,此操作在幕后完成,当OnInitDialog的默认实现调用UpdateData时,该函数依次调用DoDataExchange以及 - 如果我在第一次通过时调用正确的话 - 将对话框控件分为正确的类型。

由于您使用了一个指针,并且在按钮控件和您使用它的类型之间没有链接,所以实际类型和预期类型之间存在不匹配,这就是崩溃的原因。

如果您使用VS2012向导从对话框设计器添加变量(右键单击对话框控件并选择添加变量),它将在头文件中创建成员变量声明并将DDX宏添加到DoDataExchange功能适合你。然后,您可以选择更改成员变量的类型,例如从CButton到您自己的CButton派生类之一。

+1

这是解决方案!这是完美的 !谢谢 !不过,你能解释一下为什么指针不好吗? –

+0

@WalterFabioSimoni好吧,上面的解释说明了 - 这是我对MFC框架如何处理它的理解,你可以调试并进入MFC源代码,看到这发生了一个更好的主意。现在,我只是请你开始并再次运行:-) –

0

您使用术语指针按钮并命名变量'm_pButtonExport'。这是不正确的。该代码创建CMFCButton对象的实例,而不是指向按钮对象实例的指针。该变量应该被命名为“m_ButtonExport”,并且被称为CMFCButton对象的实例,而不是指向其的指针。