弹出框同时存在取消和关闭按钮的意义是啥

我在遇到一些这种对话框的时候一般会倾向于点×而不是取消,因为总觉得点取消还会做点什么(尽管没有),点×则是取消这个操作……不过事实上我写网页的时候遇到弹出窗之类的东西还是会同时保留取消和×,因为不同人的使用习惯不同~并且据我观察大多数人并不会对这两种关闭的方式产生疑惑。
■网友
函数源码如下:
void CDialog::OnOK() { if (!UpdateData(TRUE)) { TRACE(traceAppMsg, 0, "UpdateData failed during dialog termination.\"); // the UpdateData routine will set focus to correct item return; } EndDialog(IDOK); }
void CDialog::OnCancel() { EndDialog(IDCANCEL); }
  可以看出这俩按钮,都会调用EndDialog()来关闭对话框,只是返回值不同。   EndDialog()函数调用了DestroyWindow()函数,DestroyWindow()函数又发送了WM_DESTROY消息,该消息的处理函数是OnDestroy(),对话框的生存期最后一个函数是PostNcDestroy()函数
  点击[X],首先向对话框发送WM_CLOSE消息,由OnClose()函数处理,它调用DestroyWindow(),其后同上一样。 可以看出点击[X]时绕过了OnOK()和OnCancel()。
点击[X],路由为 OnClose()---\u0026gt; OnCancel() ---\u0026gt; EndDialog() ---\u0026gt; DestroyWindow() ---\u0026gt; OnDestroy() ---\u0026gt; PostNcDestroy() 点击[取消],路由为 OnCancel() ---\u0026gt; EndDialog() ---\u0026gt; DestroyWindow() ---\u0026gt; OnDestroy() ---\u0026gt; PostNcDestroy()   注意,上面提到的这些函数统统都是可以重载的,在重载时若加入了其它代码后,应该调用父类CDialog同名的函数才能正确路由下去,否则无法关闭对话框了。
举个例子:void CAboutDlg::OnClose() { // TODO: 在此添加消息处理程序代码和/或调用默认值 DoSomthing(0; // 执行自己的判断等等
// CDialog::OnClose(); // 把向导生成的父类调用给注释了,此时就无法关闭对话框了。 }
  此外,点击会发送WM_CLOSE消息,若需重载的话,应该在对话框的属性窗口中,选择WM_CLOSE消息来添加消息处理函数。VS的IDE会自动添加如下三段:
xxx.h文件,类声明中加入OnClose()函数声明afx_msg void OnClose();xxx.cpp文件,加入消息映射宏ON_WM_CLOSE() // 对于Windows标准消息,都是这种简短的格式。xxx.cpp文件,加入函数体void CMyDlg::OnClose() { CDialog::OnClose(); }上述3处如果都正常的话,就映射到OnClose()。
【弹出框同时存在取消和关闭按钮的意义是啥】 总结:
OnCancel只调用CDialog::EndDialog关闭对话框;OnClose()是响应 WM_CLOSE 的。一定程度上可以说CDialog::EndDialog()和OnClose()完成类似的工作,但处理的机制不一样,前者是CDialog的对象机制,后者是WM的消息映射机制。推荐阅读:关于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式对话框
■网友
懒得改窗口罢了。
■网友
X是关掉当前窗口。取消是不使用当前功能。意义不一样。
■网友
开发人员的问题。
■网友
手机界那帮产品经理非要把pc上的陋习弄到手机上。在pc上点x关闭对话框本来就是件费力的事情,不过有鼠标,还能瞄准一点。但做到手机上,这个x要是做得不够大,手指很容易误触。点取消button的操控性明显高于那个x


    推荐阅读