2014-02-08 141 views
1

我试图让使用此代码对话框的句柄:m_hWnd成员变量为空

class CStatisticsDlg : public CDialogEx 
{ 
public: 
    CStatisticsDlg(); 

// Dialog Data 
    enum { IDD = IDD_STATISTICS }; 

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

// Implementation 
protected: 
    DECLARE_MESSAGE_MAP() 
public: 
}; 

CStatisticsDlg::CStatisticsDlg() : CDialogEx(CStatisticsDlg::IDD) 
{ 
} 

void CStatisticsDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialogEx::DoDataExchange(pDX); 
    // DDX_Control(pDX, IDC_FUCK, m_fuck); 
} 

BEGIN_MESSAGE_MAP(CStatisticsDlg, CDialogEx) 
END_MESSAGE_MAP() 

但是,当我创建类的这个实例:

CStatisticsDlg statisticsDlg; 

并尝试通过statisticsDlg.m_hWnd获取其句柄,句柄为空。

为什么会出现这种情况?获取对话框句柄的最佳方法是什么?

+0

你什么时候尝试拿到手柄?它可能不会被创建,直到显示对话框。 –

+0

我呼叫statisticsDlg.DoModal()后; – user3126297

+0

在您拨打电话并回电后?然后对话框不再存在,并且不再有窗口句柄。 – Timbo

回答

2

创建过程中您可以获取m_hWnd的第一点是对话框的OnInitDialog函数。 m_hWnd在DoModal调用之前不存在,并且在DoModal返回后不存在。

+0

嗨斯科特,我试着统计statisticsDlg.DoModal()后调用statisticsDlg.OnInitDialog(),但这会导致Debug Assertion Error。 – user3126297

+0

如果在DoModal调用之前m_hWnd不存在并且在DoModal返回后不存在,我该如何调用OnInitDialog? – user3126297

+2

您不调用OnInitDialog,MFC会在创建对话框时调用它。在WM_INITDIALOG对话框中添加消息处理程序。并且...获取一本书或教程。你不知道发生了什么。 –

0

尝试使用无模式对话框模型。使用create函数代替domodal .m_hWnd在create调用开始之前不存在。