用PreTranslateMessage试图拦截,但既不是WM_CLOSE 也不是 WM_COMMAND 跟WM_SYSCOMMAND.
因为本人想在CPropertySheet中的CPropertyPage的OnApply都执行完之后才判断是否关闭CPropertySheet,所以不可以OnCmdMsg来截获ID_OK请高手指教

解决方案 »

  1.   

    在你的Sheet类中,直接添加OnDestroy()消息响应函数,然后在它调用它的父类的OnDestroy()函数之前做你想做的事情,如果不想关闭,就直接返回就行了,我做过,应该是可行的
      

  2.   

    但是添加OnClose()好像就拦截不到,我也不太清楚是为什么,如果要拦截Close消息,则可以用以下方法:
    添加Sheet类的OnSysCommand(UINT nID, LPARAM lParam)函数,然后在其中添加代码:
    if(nID = SC_CLOSE)
    //处理关闭按钮;这两种方法都能满足你的要求,呵呵
      

  3.   

    楼上的方法我之前也试过
    1。用OnDestory()直接return,SHEET仍然会关闭,但是在DefWindowProc中就无法再截获WM_DESTORY了
    2。OnClose是无法有效截获的,因为
       下面时关闭方式不同发送的消息如下:
    1)点击OK按钮:OnOk-WM_DESTROY
    2) 点击Cancel按钮:OnCancel-WM_DESTROY
    3) 点击×按钮:WM_CLOSE-ONCANCEL-WM_DESTROY
    4) 键盘ESC按键:OnCancel-WM_DESTROY
    所以按下OK键不能产生WM_CLOSE
    3。OnSysCommand之前也试过,无效只有DefWindowProc能截获,不过无论点返回窗口都会关闭。估计是已经接受此消息.
      

  4.   

    OnSysCommand无效的原因同2列出的原因因为我是用按OK键来试的,如果用×则可以响应
      

  5.   

    不好意思,班门弄斧了,我只知道我的上面两个方法能拦截到关闭的消息,就没有仔细往下研究过,不好意思那直接在Sheet类的OnOk、OnCancel等函数中拦截如何?也不行?
      

  6.   

    不用不好意思,还要感谢你的回贴呢!Sheet是没有OnOk、OnCancel的。倒是有一个OnCmdMsg可以拦截上面两个消息,不过最重要的是,在此拦截达不到我的要求,因为在这里page的OnApply并没有执行,它是在这个函数返回后才执行,因此达不到我的目的。
      

  7.   

    ContinueModal()可以用一下
    只要一直返回TRUE就可以了。
      

  8.   

    Sheet这两个消息是有的,按照其他对话框照葫芦画瓢的添加就可以了,记得他们的ID号分别是:IDOK、IDCANCEL、ID_APPLY_NOW,这点我肯定不会错不过你想利用系统的OnApply()函数,而有不关闭只怕可能性不大,因为在系统的OnApply()函数中就可能已经调用关闭函数了。所以你对sheet的ID_APPLY_NOW重载一个响应消息,然后在其中自己编程实现,应该就可以了,当然,我没有尝试,只是想法