关闭

点击edit控件弹出对话框,焦点不在该对话框上时,对话框摧毁

618人阅读 评论(0) 收藏 举报
前面一大部分都是参考某位同学的,具体哪位记不清了,在此声明一下。
 
点击edit控件出现对话框:
1,首先捕获鼠标信息:
    添加一个消息传递,重载函数PreTranslateMessage(MSG* pMsg),可以在wizard中添加PreTranslateMessage即可。
重载的代码:
if( pMsg->message == WM_LBUTTONUP )//消息为鼠标左键升起,不能为down,不知道原因。down的话按在任何地方都会调用对话框
{  
  if ( GetDlgItem(IDC_EDIT1)->GetSafeHwnd() == pMsg->hwnd )//判断句柄为edit
  {
 jisuan*m_pDlg;//非模态显示对话框。如果用模态的话,鼠标会变成光标的样子,什么都做不了
 m_pDlg = new jisuan;
        m_pDlg->Create(IDD_DIALOG1, this);
 m_pDlg->ShowWindow(SW_SHOW);
  }
}
这样就会调用对话框
2.传值:
  要把被调用对话框里的值传给edit控件。在被调用对话框里的ok控件被按下的函数里添加如下代码:
 CString aa;
 CWnd*cwnd=AfxGetMainWnd();//获得父窗口句柄,在此即为调用对话框的edit控件所在的对话框
 if (GetDlgItemText(IDC_EDIT_NEW,aa))//读取被调用对话框里edit控件的值,存在aa里,返回的值为aa的长度,没有值的时候返回为0
 {
  cwnd->SetDlgItemText(IDC_EDIT1,aa);//把aa的值放在edit控件里
 }
 UpdateData(false);
3.销毁被调用的对话框:因为非模态显示的对话框在关闭后没有销毁,只是最小化,看不到了,所以要手动销毁。模态显示的对话框在ok关闭的时候就销毁了,无须收到销毁。
  在wizard里,添加一个消息:PostNcDestory,在函数PostNcDestory()里添加代码:
 delete this;
ok 了!!
在调试程序的时候,我删除了无用的控件,因此出现问题“试图执行系统不支持的操作”,搜了一下原因,引例如下:
试图执行系统不支持的操作:
开发平台:VS.NET 2003。
出现错误:试图执行系统不支持的操作。
错误原因:a)删除了对话框控件,但是没有删除相应控件代码;
          b)修改了资源ID,资源ID对不上号;
          c)将MFC程序做成打包软件,安装在没有VC的机器上,出现错误,在有VC环境的机器上运行则没有这个错误。
       解决办法:对于前面两种情况,删除相应控件或资源代码即可;第三种情况在无VC环境的机器上,注册程序中使用的控件即可。

以上是通过按钮调用摧毁对话框的函数,,当焦点不在对话框上直接关闭对话框的时候,加载以下函数:
在CWnd::OnActivate消息中处理:
if(nState   ==   WA_INACTIVE)
{
      PostNcDestory()  //失去焦点了,摧毁对话框
}
这样当窗口不是当前窗口时,关闭该窗口。。。。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6774次
    • 积分:110
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:5篇
    • 译文:0篇
    • 评论:3条
    文章分类
    文章存档
    最新评论