CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

高手救命:建立一个非模式对话框,当对话框不为当前窗口时让它自行销毁。然后按一下自己设定的某个按键,重新建立一个窗口,结果出错。示

楼主rchgq(小荷)2003-09-01 17:55:21 在 VC/MFC / 基础类 提问

高手救命:建立一个非模式对话框,当对话框不为当前窗口时让它自行销毁。然后按一下自己设定的某个按键,重新建立一个窗口,结果出错。示源码;  
   
   
  在主窗口头文件的定义中加入  
  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

相关问题

  • 如何销毁对话框?
  • DLL中封装对话框老出错???
  • 对话框按键的处理问题
  • 创建另一个对话框的同时销毁本对话框,怎么做?
  • 为什么 先销毁MessageBox 后, 才 销毁 对话框
  • 如何销毁非模态的对话框呀!
  • [请教]关于非摸态对话框的销毁问题
  • 急问:95下出"启动程序时出错"对话框!!!
  • 在新开的线程里创建对话框出错!
  • 求教!!!!!为什么在dll中使用对话框会出错?

关键词

  • 模式
  • 内存
  • 消息
  • menuset
  • 对话框
  • 销毁
  • 按键
  • dlgsize
  • setactivewindow
  • 出错

得分解答快速导航

  • 帖主:rchgq
  • he_zhidan

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo