2013-11-21 91 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對象的實例,而不是指向其的指針。