高手救命:建立一个非模式对话框,当对话框不为当前窗口时让它自行销毁。然后按一下自己设定的某个按键,重新建立一个窗口,结果出错。示
高手救命:建立一个非模式对话框,当对话框不为当前窗口时让它自行销毁。然后按一下自己设定的某个按键,重新建立一个窗口,结果出错。示源码;
在主窗口头文件的定义中加入
public:
MenuSet *m_MenuSet;
按设定的按键处理:
if(m_MenuSet) m_MenuSet->SetActiveWindow(); //激活对话框
else
{
//创建非模态对话框
m_MenuSet=new MenuSet(this);
m_MenuSet->Create(IDD_DIALOG1,this);
}
::GetWindowRect(m_MenuSet->m_hWnd,&dlgsize);
m_MenuSet->ShowWindow(SW_SHOWNORMAL);
::SetWindowPos(m_MenuSet->m_hWnd,HWND_TOPMOST,tt.x,tt.y,dlgsize.right-dlgsize.left,dlgsize.bottom-dlgsize.top,SWP_SHOWWINDOW);
在对话框的消息处理中,当对话框不为当前窗口时让它自行销毁:
LRESULT MenuSet::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message==134 && wParam==0 && lParam==0) DestroyWindow();
return CDialog::WindowProc(message, wParam, lParam);
}
结果错误:“0x00483e6e”指令引用的"0xddddde81"内存,该内存不能为"READ"
问题点数:20、回复次数:19Top
1 楼FAICHEN(CC)回复于 2003-09-01 18:02:10 得分 0
delete m_MenuSetTop
2 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-09-01 18:11:40 得分 20
关闭对话框:
其实,一般窗口的销毁可以用DestoryWindow(),对话框的销毁可以用EndDialiog().
EndDialog(IDOK);
DoModal()的返回值为IDOK,但不会执行用户定义的OnOK.
只要发送WM_CLOSE消息,就会有响应的函数处理的。
SendMessage(WM_CLOSE);
PostMessage(WM_CLOSE);
void CTestDialog::OnButton1()
{
GetParent()->DestroyWindow();
}
窗口和对话框一起关
PostMessage(WM_QUIT);
SendMessage(WM_QUIT);//不行
无模式对话框用DestroyWindow();
用EndDialog
你再打开原对话框就有问题
无模式对话框
的OnOK,OnCance
都要重载
Top
3 楼rchgq(小荷)回复于 2003-09-01 18:42:47 得分 0
问题是我要让对话框再收到某个按键消息时自行销毁,应该在哪个位置,怎么实现它?Top
4 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-09-01 18:51:00 得分 0
SendMessage(WM_CLOSE);
Top
5 楼rchgq(小荷)回复于 2003-09-01 19:02:48 得分 0
SendMessage(WM_CLOSE)只是关闭对话框,并不能彻底删除销毁掉,而且我要在非模式对话框内部把它销毁。应该怎么做?Top
6 楼rchgq(小荷)回复于 2003-09-01 19:57:55 得分 0
该怎么做?请各位大侠帮帮忙,Top
7 楼atEleven(@十一)回复于 2003-09-01 20:13:58 得分 0
if(message==134 && wParam==0 && lParam==0)
{
DestroyWindow();
return TRUE;
}Top
8 楼rchgq(小荷)回复于 2003-09-02 09:23:47 得分 0
还是不行,怎么办?烦死人了,搞不懂.
我不是已经把对话框用 DESTROYWINDOW() 删除掉了吗?为什么结果错误:“0x00483e6e”指令引用的"0xddddde81"内存,该内存不能为"READ"Top
9 楼rchgq(小荷)回复于 2003-09-02 09:26:34 得分 0
补充一下:我把非模式对话框DESTORYWINDOW()之后,按一下某个按键,还要重新建立这么个窗口.Top
10 楼rchgq(小荷)回复于 2003-09-02 10:16:56 得分 0
拜托了.Top
11 楼_xiao(小小)回复于 2003-09-02 11:11:44 得分 0
是不是这句出问题了?
if(m_MenuSet) m_MenuSet->SetActiveWindow(); //激活对话框
你销毁对话框后并没有delete menuSet以及置menuSet为Null,所以下次按键时还是会调用SetActiveWindow(),但是这个窗口已经被销毁了,所以出错了?
Top
12 楼ycy_fox(小姚)回复于 2003-09-02 11:21:27 得分 0
同意小小的意见。虽然对话框窗口已经销毁,但是,标识对话框的指针值没有给NULL,所以,下次按键时,仍然会调用SetActiveWindow(),但是窗口已经销毁了,所以不能显示出现,并出错,要在DestroyWindow后将指针置NULLTop
13 楼rchgq(小荷)回复于 2003-09-02 16:50:04 得分 0
我在非模式对话框类中的
void MenuSet::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
delete this; //删除对话框对象
CDialog::PostNcDestroy();
}
因此当再次调用时,m_MenuSet应该为NULL
Top
14 楼qiqiqiqi1(麦壳)回复于 2003-09-02 16:57:46 得分 0
你在操作什么时候出现的错误?Top
15 楼qiqiqiqi1(麦壳)回复于 2003-09-02 17:04:49 得分 0
哈哈
void MenuSet::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
delete this; //删除对话框对象
CDialog::PostNcDestroy();
}
好象有问题啊
自己内部DELETE自己?
不行吧Top
16 楼rchgq(小荷)回复于 2003-09-02 17:06:22 得分 0
再次建立一个非模式对话的时候,就会出现在这个错误Top
17 楼rchgq(小荷)回复于 2003-09-02 17:40:32 得分 0
我是参考书上的例子,应该不会错的,这里主要是当调用DestroyWindow()对话框类时删除对话框,Top
18 楼rchgq(小荷)回复于 2003-09-03 09:17:12 得分 0
WHYTop
19 楼samsun2000(美女都结婚了)回复于 2003-09-03 09:41:55 得分 0
我也怀疑是“if(m_MenuSet) m_MenuSet->SetActiveWindow(); ”里面有问题,试试
if (IsWindow(m_MenuSet->m_hWnd)) m_MenuSet->SetActiveWindow();
else{...}Top



