16,549
社区成员




//创建窗口类对象
CDialogMessage *pDlg = new CDialogMessage();
if(pDlg)
{
//在Create函数中调用CreateWindow创建窗口本身
pDlg->Create(CDialogMessage::IDD,CWnd::FromHandle(::GetDesktopWindow()));
//窗口显示
pDlg->ShowWindow(SW_SHOW);
pDlg->UpdateWindow();
}
父窗口创建出来之后,其上的子窗口才会创建出来。在窗口本身尚未创建出来的情况下,怎么可能获取窗口本身指针以及其上的子窗口指针呢?
CDialogMessage Dlg;
Dlg.DoModal();
Dlg.GetDlgItem(IDC_EDIT8)->SetWindowText(_T("请输入有效命令后再进行转换操作!"));
现在没有提示未定义了 ,但是执行到Dlg.GetDlgItem(IDC_EDIT8)->SetWindowText(_T("请输入有效命令后再进行转换操作!"));这句就直接程序崩溃.....怎么才能正常执行啊?[/quote]
-------------------------------------------------------------------------------------------------------------
同样的道理,当窗口本身销毁了,不代表窗口类对象析构了;当窗口类对象析构了,窗口本身一定销毁了(前提是你写的逻辑对!)
接上面的举例代码:
//销毁窗口本身
::DestroyWindow(pDlg->GetSafeHwnd());
//销毁窗口类对象pDlg
delete pDlg;
pDlg = NULL;
Dlg.DoModal();这个函数返回之后(这个函数的原理你若不懂自己去仔仔细细的搞明白,这个很重要,不要迷迷糊糊 依葫芦画瓢,要知其所以然)窗口本身就销毁了,当然也是不能获取窗口本身指针以及其上的子窗口指针的!
class CDialogMessage : public CDialog
{
DECLARE_DYNAMIC(CDialogMessage)
public:
CDialogMessage(CWnd* pParent = NULL); // 标准构造函数
virtual ~CDialogMessage();
enum { IDD = IDD_DIALOG_XXXX };
virtual BOOL OnInitDialog();
void SetMessageData(LPCTSTR lpszMessage);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
private:
TCHAR m_szMessage[256]; //CString
};
CDialogMessage::CDialogMessage(CWnd* pParent /*=NULL*/)
: CDialog(CDialogMessage::IDD, pParent)
{
memset(m_szMessage,0,sizeof(m_szMessage));
}
BOOL CDialogMessage::OnInitDialog()
{
CDialog::OnInitDialog();
if(*m_szMessage)
GetDlgItem(IDC_EDIT8)->SetWindowText(m_szMessage);
return FALSE;
}
void CDialogMessage::SetMessageData(LPCTSTR lpszMessage)
{
if(lpszMessage)
lstrcpy(m_szMessage,lpszMessage);
}
CDialogMessage Dlg;
Dlg.SetMessageData(_T("请输入有效命令后再进行转换操作!"));
Dlg.DoModal();