我有一个基于CMFCPropertySheet类的对话框。我在我的CMFCPropertySheet后代的构造函数中添加了第一个页面,并设置了外观(PropSheetLook_Tree)和一些标志:
// constructor code
m_psh.dwFlags|=PSH_NOAPPLYNOW|PSH_NOCONTEXTHELP;
m_psh.hwndParent=hwndParent; // hwndParent - parameter passed to the constructor
m_psh.hInstance=GetModuleHandle(L"mydll");
AddPage(&m_FirstPage);
SetLook(CMFCPropertySheet::PropSheetLook_Tree,190); m_FirstPage是CMFCPropertyPage的后裔。
我还在后面的CMFCPropertySheet::InitNavigationControl()中添加了其他页面
我对每个页面重写了CMFCPropertyPage::OnKillActive(),以检查输入的数据在页面上是否正确。
问题是第一页的CMFCPropertyPage::OnKillActive() (m_FirstPage)被调用了两次。第一次(意外)它被调用之前,我的对话框甚至变得可见。第二次--正如预期的--当用户切换页面或单击"OK“按钮时调用它。对于其他页面,只有在单击OK或切换页面时才调用OnKillActive()。
问题是,在第一次m_FirstPage.OnKillActive()调用期间,第一页上还没有数据。所以我的代码显示了一个错误消息。
为第一页调用两次OnKillActive()是正常的吗?总是这样叫两次吗?
目前,我在我的IsWindowVisible()中调用OnKillActive(),如果它不可见,我就不检查页面上的数据。这个方法正确吗?
(代码用Visual 2008编写)
更新:
第一个意外的OnKillActive()调用堆栈
CFirstPage::OnKillActive()
CPropertyPage::OnNotify(unsigned int wParam=0, long lParam=1196668, long * pResult=0x00123fc4)
CWnd::OnWndMsg(unsigned int message=78, unsigned int wParam=0, long lParam=1196668, long * pResult=0x00123ffc)
CWnd::WindowProc(unsigned int message=78, unsigned int wParam=0, long lParam=1196668)
AfxCallWndProc(CWnd * pWnd=0x00129370, HWND__ * hWnd=0x000a0348, unsigned int nMsg=78, unsigned int wParam=0, long lParam=1196668)
AfxWndProc(HWND__ * hWnd=0x000a0348, unsigned int nMsg=78, unsigned int wParam=0, long lParam=1196668)
// many calls that look like user32.dll!7e368734()
ATL::CTraceFileAndLineInfo::operator()(unsigned long dwCategory=272, unsigned int nLevel=590706, const wchar_t * pszFmt=0x001d4008, ...)
// many calls that look like user32.dll!7e368734()
CComCtlWrapper::_PropertySheetW(const _PROPSHEETHEADERW_V2 * unnamed1=0x00124f30)
AfxPropertySheetW(const _PROPSHEETHEADERW_V2 * unnamed1=0x00124f30)
CPropertySheet::DoModal()
OpenSettingsDlgBox(HWND__ * hwndParent=0x00040346)
// many calls that look like user32.dll!7e368734() OpenSettingsDlgBox()是一个dll函数。它是从另一个非MFC应用程序调用的。
发布于 2017-12-11 20:54:13
我敢打赌,这是因为在CPropertySheet派生的类的SetActivePage函数中调用了SendMessage()或与SETCURSEL等价的SendMessage()调用。
您应该(a)删除对SetActivePage或SendMessage(PSM_SETCURSEL)的调用,并将所需的初始选项卡作为第一个选项卡,或者(b)在CPropertyPage派生类的构造函数中设置有效的初始数据,或者(c)设置一个标志,以抑制CPropertyPage派生类中的验证,直到正确初始化为止。
https://stackoverflow.com/questions/47743645
复制相似问题