是这样的,我用PropertyPage做了一个属性页,响应了PSN_RESET,想点击属性页右上角的"X"按钮的时候,能隐藏属性页.
case WM_NOTIFY:
switch(((LPPSHNOTIFY)lParam)->hdr.code)
{
case PSN_RESET:
SetWindowPos(((LPPSHNOTIFY)lParam)->hdr.hwndFrom, HWND_NOTOPMOST,0,0,0,0, SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE);
SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
return FALSE;
    }
可是现在结果是,属性页虽然隐藏了,但是我再度用
SetWindowPos是它出现的时候,如果我点击另外的属性页标签,就会出现虽然对话框切换了,但是显示的仍然是上次选择的属性页的对话框的样子,也就是说没有刷新.
是不是我处理PSN_RESET有错啊?

解决方案 »

  1.   

    隐藏时不要使用HWND_NOTOPMOST,使用HWND_BOTTOM下次显示时,使用HWND_TOP试试看吧may you succeed
      

  2.   

    你用ShowWindow((((LPPSHNOTIFY)lParam)->hdr.hwndFrom,SW_HIDE)试试
      

  3.   

    土星兄,我没用过属性页,不过根据MSDN的解释,PSN_RESET通知消息发生在属性页被销毁之前。既然处理这个消息之后属性页被销毁了,那么也就无法完成刷新了。这可能就是你所说的“没有刷新”的缘故吧。
    你可以试试捕捉属性页父窗口对话框的WM_CLOSE来完成隐藏。ps: 我的一点疑问,为什么隐藏窗口不用ShowWindow :-P
      

  4.   

    在SetWindowPos前面加上Invalidata()
      

  5.   

    大家你们提的建议我都试过了
    都还是不行
    老马,我之所以使用SetWindowPos,是因为我要设置它为最上层
    消失的时候要取消它的最上层:)
    你说的捕捉父窗口对话框的WM_CLOSE应该怎么来做呢?
    mfc里面是如何使用关闭的呢?
      

  6.   

    就是处理父窗口对话框回调过程中的WM_CLOSE
      

  7.   

    另外老马,你说的被销毁了我是难以置信的
    如果被销毁了,再次使用SetWindowPos是不可能显示出来的:)
    而且我测试了,没有捕捉到WM_DESTORY消息
    现在我是这样做的
    InvalidateRect(g_hwndPropertyPage, NULL, TRUE);
    ShowWindow(g_hwndPropertyPage, SW_SHOW);//g_hwndPropertyPage是属性页的句柄
    可是还是不行
      

  8.   

    Here are some short handy functions for adding and deleting submenus and menu items in runtime. To add a menu with some items in the file menu at a specified index, use:   MenuItemData data[] ={
        ID_COMMAND_1, "First Item",
        ID_COMMAND_2, "Second Item",
        0, NULL
      };
      CMenu *pMenu = AddSubMenu(pMainFrm, file_menu_index, sub_menu_index, "Dynamic Menu", data); To append an item to the menu later on, use:   AddSubMenuItem(pMenu, ID_COMMAND_3, "Third Item");To remove a submenu again, use:   RemoveSubMenu(pMainFrm, file_menu_index, sub_menu_index);To remove only one item, use:   RemoveSubMenuItem(pMenu, ID_COMMAND_1);That's all. Enjoy!
      

  9.   

    To lsaturn (土星-站了一晚) :
    Sorry, I come into the wrong place, very sorry...
      

  10.   

    老马
    我原来也想在父窗口中处理的
    可是
    PROPSHEETHEADER这个结构提供的pfnCallback回调函数
    只会接受PSCB_INITIALIZED和PSCB_PRECREATE这两个消息
    我晕啊!
      

  11.   

    Here's where I supposed to go:
    http://expert.csdn.net/Expert/topic/2939/2939806.xml?temp=.9563257
      

  12.   

    zhangcrony(为了不再郁闷地生活﹐我不得不郁闷地工作)
    你让我白高兴一场,我还以为有答案了:)
    不过也好增加一点人气
      

  13.   

    或者在PSN_RESET的时候先用某个结构保存现场,然后显示的时候再恢复现场。
      

  14.   

    我发现如果在
    PSN_RESET的时候把当前对话框
    ShowWindow(hDlg, SW_HIDE)的话,再显示的时候就可以切换,但是遗憾的是当前对话框已经消失了:)
      

  15.   

    问题解决了
    但是不完美
    我在显示的时候使用了这一句
    PropSheet_SetCurSel(g_hwndPropertyPage, NULL, 0);//g_hwndPropertyPage是属性页句柄
    就可以了,所以我认为是由于属性页没有收到一些应该收到的消息造成的,至于是什么我还不知道
    PropSheet_SetCurSel(g_hwndPropertyPage, NULL, 0);但是这个每次都设为第一页,这样不好,我想设为原来所在的页面
    PropSheet_GetCurrentPageHwnd和PropSheet_HwndToIndex倒是可以搭配使用,但是要求Version 5.80,这样不好,在有些机子上就用不了了,应该怎么解决呢?
      

  16.   

    我说的保存现场其实就是用一个结构体变量保存关闭前的数据,然后在显示的时候按照保存的数据再重新设置属性页的数据。
    比如现在你的问题,你可以提前用一个int保存原有的页面index,然后显示的时候再调用PropSheet_SetCurSel(g_hwndPropertyPage, NULL, index);
      

  17.   

    ok,解决了
    也只有自己保存index了
    PropSheet_GetCurrentPageHwnd和PropSheet_HwndToIndex倒是可以搭配使用,但是要求Version 5.80,真是郁闷啊
    还找不到原因,我测试一下消息再说
    我估计就是消息处理上的逻辑问题
    应该算是bug了