首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在对话框显示之前调用CMFCPropertyPage::OnKillActive()

在对话框显示之前调用CMFCPropertyPage::OnKillActive()
EN

Stack Overflow用户
提问于 2017-12-10 21:26:57
回答 1查看 286关注 0票数 0

我有一个基于CMFCPropertySheet类的对话框。我在我的CMFCPropertySheet后代的构造函数中添加了第一个页面,并设置了外观(PropSheetLook_Tree)和一些标志:

代码语言:javascript
复制
// 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_FirstPageCMFCPropertyPage的后裔。

我还在后面的CMFCPropertySheet::InitNavigationControl()中添加了其他页面

我对每个页面重写了CMFCPropertyPage::OnKillActive(),以检查输入的数据在页面上是否正确。

问题是第一页的CMFCPropertyPage::OnKillActive() (m_FirstPage)被调用了两次。第一次(意外)它被调用之前,我的对话框甚至变得可见。第二次--正如预期的--当用户切换页面或单击"OK“按钮时调用它。对于其他页面,只有在单击OK或切换页面时才调用OnKillActive()

问题是,在第一次m_FirstPage.OnKillActive()调用期间,第一页上还没有数据。所以我的代码显示了一个错误消息。

为第一页调用两次OnKillActive()是正常的吗?总是这样叫两次吗?

目前,我在我的IsWindowVisible()中调用OnKillActive(),如果它不可见,我就不检查页面上的数据。这个方法正确吗?

(代码用Visual 2008编写)

更新:

第一个意外的OnKillActive()调用堆栈

代码语言:javascript
复制
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应用程序调用的。

EN

回答 1

Stack Overflow用户

发布于 2017-12-11 20:54:13

我敢打赌,这是因为在CPropertySheet派生的类的SetActivePage函数中调用了SendMessage()或与SETCURSEL等价的SendMessage()调用。

您应该(a)删除对SetActivePage或SendMessage(PSM_SETCURSEL)的调用,并将所需的初始选项卡作为第一个选项卡,或者(b)在CPropertyPage派生类的构造函数中设置有效的初始数据,或者(c)设置一个标志,以抑制CPropertyPage派生类中的验证,直到正确初始化为止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47743645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档