MFC父窗口中调用子窗口控件提示控件未定义

wangziyilimingjie 2014-12-21 11:05:14
我的子窗口实际就是一个messagebox的功能,我用的EditControl控件,想在父窗口中SetWindowText不同的提示语到子窗口的Edit控件中,但是我用CWnd *pWnd = Dlg.GetDlgItem(IDC_EDIT8);却提示IDC_EDIT8未定义,我要怎么才能调用?
...全文
608 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
信阳毛尖 2014-12-22
  • 打赏
  • 举报
回复
那我就班门弄斧多说几句吧
引用 7 楼 wangziyilimingjie 的回复:
[quote=引用 5 楼 VisualEleven 的回复:] DoModal()调用完成以后,你的对话框窗口就销毁了,后面所有调用与窗口相关的操作均为非法操作。
CDialogMessage Dlg; Dlg.SetDlgItemText(IDC_EDIT8, _T("请输入有效命令后再进行转换操作!")); Dlg.DoModal(); 我改成这样 还是程序崩溃啊[/quote] --------------------------------------------------------------------------------------------- 你改来改去只能暴露LZ一个问题:LZ尚未搞清楚窗口类对象和窗口本身之间的关系 窗口类对象创建了,并不代表窗口本身创建了;而窗口本身如果创建了,那么窗口类对象肯定是已经创建出来了。 CDialogMessage Dlg创建了窗口类对象,而Dlg.DoModal();才是创建窗口本身的源泉,其内部肯定是最终调用CreateWindow这个API来创建窗口本身最终通过GDI显示在屏幕上供我们肉眼看的! 给你举个非模态的例子可能你会好理解一些:

//创建窗口类对象
CDialogMessage *pDlg = new CDialogMessage();
if(pDlg)
{
	//在Create函数中调用CreateWindow创建窗口本身
	pDlg->Create(CDialogMessage::IDD,CWnd::FromHandle(::GetDesktopWindow()));
	//窗口显示
	pDlg->ShowWindow(SW_SHOW);
	pDlg->UpdateWindow();
}
父窗口创建出来之后,其上的子窗口才会创建出来。在窗口本身尚未创建出来的情况下,怎么可能获取窗口本身指针以及其上的子窗口指针呢?
引用 4 楼 wangziyilimingjie 的回复:
[quote=引用 1 楼 swapwave 的回复:] 在resource.h中定义了吧?没有包含这个头文件吗?
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();这个函数返回之后(这个函数的原理你若不懂自己去仔仔细细的搞明白,这个很重要,不要迷迷糊糊 依葫芦画瓢,要知其所以然)窗口本身就销毁了,当然也是不能获取窗口本身指针以及其上的子窗口指针的!
lis2012 2014-12-22
  • 打赏
  • 举报
回复
通过中间变量cstring来保存,然后初始化的时候加载就可以了,楼上的方法应该是可行的
schlafenhamster 2014-12-22
  • 打赏
  • 举报
回复
把 edit8 关联 变量 改成 CString ( value 而 不是 控件) CDialogMessage Dlg; m_edit=“hahahaha”; Dlg.DoModal();
wangziyilimingjie 2014-12-21
  • 打赏
  • 举报
回复
引用 8 楼 VisualEleven 的回复:
DoModal()调用之前,你的窗口还没有创建,所以跟窗口相关的操作也是非法的。 把你的SetDlgItemText(IDC_EDIT8, _T("请输入有效命令后再进行转换操作!"));这个操作放到CDialogMessage对话框类的OnInitDialog函数中去。
刚刚找了下CDialogMessage下没有OnInitDialog函数....只有父窗口的类下有这个函数
wangziyilimingjie 2014-12-21
  • 打赏
  • 举报
回复
引用 8 楼 VisualEleven 的回复:
DoModal()调用之前,你的窗口还没有创建,所以跟窗口相关的操作也是非法的。 把你的SetDlgItemText(IDC_EDIT8, _T("请输入有效命令后再进行转换操作!"));这个操作放到CDialogMessage对话框类的OnInitDialog函数中去。
谢谢版主耐心回复,我把这句话放到OnInitDialog中的话,就不能实现不同情况提示不同语句的效果了,请问有什么办法能实现不同情况,弹出的子窗口中显示内容是不同的?非常感谢
Eleven 2014-12-21
  • 打赏
  • 举报
回复
DoModal()调用之前,你的窗口还没有创建,所以跟窗口相关的操作也是非法的。 把你的SetDlgItemText(IDC_EDIT8, _T("请输入有效命令后再进行转换操作!"));这个操作放到CDialogMessage对话框类的OnInitDialog函数中去。
wangziyilimingjie 2014-12-21
  • 打赏
  • 举报
回复
引用 5 楼 VisualEleven 的回复:
DoModal()调用完成以后,你的对话框窗口就销毁了,后面所有调用与窗口相关的操作均为非法操作。
CDialogMessage Dlg; Dlg.SetDlgItemText(IDC_EDIT8, _T("请输入有效命令后再进行转换操作!")); Dlg.DoModal(); 我改成这样 还是程序崩溃啊
wangziyilimingjie 2014-12-21
  • 打赏
  • 举报
回复
引用 5 楼 VisualEleven 的回复:
DoModal()调用完成以后,你的对话框窗口就销毁了,后面所有调用与窗口相关的操作均为非法操作。
那我要怎样才能实现我要的功能啊,大神指点一下吧
Eleven 2014-12-21
  • 打赏
  • 举报
回复
DoModal()调用完成以后,你的对话框窗口就销毁了,后面所有调用与窗口相关的操作均为非法操作。
wangziyilimingjie 2014-12-21
  • 打赏
  • 举报
回复
引用 1 楼 swapwave 的回复:
在resource.h中定义了吧?没有包含这个头文件吗?
CDialogMessage Dlg; Dlg.DoModal(); Dlg.GetDlgItem(IDC_EDIT8)->SetWindowText(_T("请输入有效命令后再进行转换操作!")); 现在没有提示未定义了 ,但是执行到Dlg.GetDlgItem(IDC_EDIT8)->SetWindowText(_T("请输入有效命令后再进行转换操作!"));这句就直接程序崩溃.....怎么才能正常执行啊?
wangziyilimingjie 2014-12-21
  • 打赏
  • 举报
回复
CDialogMessage Dlg; Dlg.DoModal(); Dlg.GetDlgItem(IDC_EDIT8)->SetWindowText(_T("请输入有效命令后再进行转换操作!")); 现在没有提示未定义了 ,但是执行到Dlg.GetDlgItem(IDC_EDIT8)->SetWindowText(_T("请输入有效命令后再进行转换操作!"));这句就直接程序崩溃.....怎么才能正常执行啊?
wangziyilimingjie 2014-12-21
  • 打赏
  • 举报
回复
引用 1 楼 swapwave 的回复:
在resource.h中定义了吧?没有包含这个头文件吗?
包含头文件了 CDialogMessage Dlg; Dlg.DoModal(); 这样都弹出子窗口了
swapwave 2014-12-21
  • 打赏
  • 举报
回复
在resource.h中定义了吧?没有包含这个头文件吗?
信阳毛尖 2014-12-21
  • 打赏
  • 举报
回复
引用 10 楼 wangziyilimingjie 的回复:
[quote=引用 8 楼 VisualEleven 的回复:] DoModal()调用之前,你的窗口还没有创建,所以跟窗口相关的操作也是非法的。 把你的SetDlgItemText(IDC_EDIT8, _T("请输入有效命令后再进行转换操作!"));这个操作放到CDialogMessage对话框类的OnInitDialog函数中去。
刚刚找了下CDialogMessage下没有OnInitDialog函数....只有父窗口的类下有这个函数[/quote] OnInitDialog函数是CDialog基类的虚函数,你只需要在CDialogMessage这个派生类中重写就行了啊! --------------------------------------------------------------------------------------------------------------------------------------------------
引用 9 楼 wangziyilimingjie 的回复:
[quote=引用 8 楼 VisualEleven 的回复:] DoModal()调用之前,你的窗口还没有创建,所以跟窗口相关的操作也是非法的。 把你的SetDlgItemText(IDC_EDIT8, _T("请输入有效命令后再进行转换操作!"));这个操作放到CDialogMessage对话框类的OnInitDialog函数中去。
谢谢版主耐心回复,我把这句话放到OnInitDialog中的话,就不能实现不同情况提示不同语句的效果了,请问有什么办法能实现不同情况,弹出的子窗口中显示内容是不同的?非常感谢[/quote] 版主说的对,DoModal()之后窗口对象就析构了,怎么可能在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();

16,549

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧