是这样的,我用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有错啊?
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有错啊?
你可以试试捕捉属性页父窗口对话框的WM_CLOSE来完成隐藏。ps: 我的一点疑问,为什么隐藏窗口不用ShowWindow :-P
都还是不行
老马,我之所以使用SetWindowPos,是因为我要设置它为最上层
消失的时候要取消它的最上层:)
你说的捕捉父窗口对话框的WM_CLOSE应该怎么来做呢?
mfc里面是如何使用关闭的呢?
如果被销毁了,再次使用SetWindowPos是不可能显示出来的:)
而且我测试了,没有捕捉到WM_DESTORY消息
现在我是这样做的
InvalidateRect(g_hwndPropertyPage, NULL, TRUE);
ShowWindow(g_hwndPropertyPage, SW_SHOW);//g_hwndPropertyPage是属性页的句柄
可是还是不行
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!
Sorry, I come into the wrong place, very sorry...
我原来也想在父窗口中处理的
可是
PROPSHEETHEADER这个结构提供的pfnCallback回调函数
只会接受PSCB_INITIALIZED和PSCB_PRECREATE这两个消息
我晕啊!
http://expert.csdn.net/Expert/topic/2939/2939806.xml?temp=.9563257
你让我白高兴一场,我还以为有答案了:)
不过也好增加一点人气
PSN_RESET的时候把当前对话框
ShowWindow(hDlg, SW_HIDE)的话,再显示的时候就可以切换,但是遗憾的是当前对话框已经消失了:)
但是不完美
我在显示的时候使用了这一句
PropSheet_SetCurSel(g_hwndPropertyPage, NULL, 0);//g_hwndPropertyPage是属性页句柄
就可以了,所以我认为是由于属性页没有收到一些应该收到的消息造成的,至于是什么我还不知道
PropSheet_SetCurSel(g_hwndPropertyPage, NULL, 0);但是这个每次都设为第一页,这样不好,我想设为原来所在的页面
PropSheet_GetCurrentPageHwnd和PropSheet_HwndToIndex倒是可以搭配使用,但是要求Version 5.80,这样不好,在有些机子上就用不了了,应该怎么解决呢?
比如现在你的问题,你可以提前用一个int保存原有的页面index,然后显示的时候再调用PropSheet_SetCurSel(g_hwndPropertyPage, NULL, index);
也只有自己保存index了
PropSheet_GetCurrentPageHwnd和PropSheet_HwndToIndex倒是可以搭配使用,但是要求Version 5.80,真是郁闷啊
还找不到原因,我测试一下消息再说
我估计就是消息处理上的逻辑问题
应该算是bug了