CPropertySheet作为子窗口控件(mfc高手入)

heroboy2000 2004-11-27 10:11:06
CPropertySheet作为子窗口控件,要注意什么吗?为什么对话框一旦切换到后台,窗口就死了。
BOOL CWindentDlg::OnInitDialog()
{
....
m_sheet.Create(this,WS_CHILD|WS_VISIBLE,WS_EX_NOPARENTNOTIFY);
....
}
死机时的堆栈:
user32.dll!77d186ff()
user32.dll!77d3063a()
user32.dll!77d3063a()
user32.dll!77d187eb()
user32.dll!77d3063a()
user32.dll!77d40494()
user32.dll!77d1b743()
user32.dll!77d3063a()
user32.dll!77d1b7ab()
user32.dll!77d2661f()
user32.dll!77d26675()
user32.dll!77d25310()
user32.dll!77d2759d()
user32.dll!77d275bf()
user32.dll!77d18709()
user32.dll!77d2759d()
user32.dll!77d2759d()
user32.dll!77d187eb()
user32.dll!77d2759d()
user32.dll!77d2759d()
> mfc71d.dll!ATL::CTraceFileAndLineInfo::operator()(unsigned long dwCategory=0, unsigned int nLevel=1243236, const char * pszFmt=0x77d1c00e, ...) 行163 + 0x27 C++
user32.dll!77d40494()
user32.dll!77d2759d()
user32.dll!77d1e366()
user32.dll!77d2759d()
mfc71d.dll!CWnd::DefWindowProcA(unsigned int nMsg=6, unsigned int wParam=0, long lParam=0) 行1024 + 0x20 C++
mfc71d.dll!CWnd::WindowProc(unsigned int message=6, unsigned int wParam=0, long lParam=0) 行1746 + 0x1a C++
mfc71d.dll!AfxCallWndProc(CWnd * pWnd=0x0012fca4, HWND__ * hWnd=0x000207d8, unsigned int nMsg=6, unsigned int wParam=0, long lParam=0) 行241 + 0x1a C++
mfc71d.dll!AfxWndProc(HWND__ * hWnd=0x000207d8, unsigned int nMsg=6, unsigned int wParam=0, long lParam=0) 行389 C++
mfc71d.dll!AfxWndProcBase(HWND__ * hWnd=0x000207d8, unsigned int nMsg=6, unsigned int wParam=0, long lParam=0) 行209 + 0x15 C++
user32.dll!77d18709()
user32.dll!77d187eb()
mfc71d.dll!CThreadSlotData::GetThreadValue(int nSlot=0) 行269 C++
user32.dll!77d1b368()
user32.dll!77d40494()
user32.dll!77d1b3b4()
ntdll.dll!7c92eae3()
user32.dll!77d1919b()
user32.dll!77d3ea85()
mfc71d.dll!AfxInternalPumpMessage() 行158 + 0x13 C++
mfc71d.dll!CWinThread::PumpMessage() 行916 C++
mfc71d.dll!AfxPumpMessage() 行195 + 0xb C++
mfc71d.dll!CWnd::RunModalLoop(unsigned long dwFlags=4) 行4566 + 0x5 C++
mfc71d.dll!CDialog::DoModal() 行527 + 0xc C++
windent.exe!CWindentApp::InitInstance() 行62 + 0xb C++
mfc71d.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00141f45, int nCmdShow=1) 行39 + 0xb C++
windent.exe!WinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00141f45, int nCmdShow=1) 行25 C++
windent.exe!WinMainCRTStartup() 行390 + 0x39 C
kernel32.dll!7c816d4f()
ntdll.dll!7c935b4f()
kernel32.dll!7c8399f3()

另外,既然在propertysheet中每个page只有在,切换到当前page时才创建,那么它是怎么保存页面上的内容的呢(文本框内的文本,复选框是否选中等),我没有使用ddx/ddv
...全文
282 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
whwjn 2004-11-29
^_^ thanks
回复
heroboy2000 2004-11-29
whwjn(菜鸟学飞) 说的对,使我错了,给你一半分吧
回复
whwjn 2004-11-29
是的,msdn就是这个意思,一开始并不创建,推迟page的创建,直到用户选择了某一页
回复
heroboy2000 2004-11-29
AddPage adds the CPropertyPage object to the CPropertySheet object's list of pages but does not actually create the window for the page. The framework postpones creation of the window for the page until the user selects that page.

MSDN是这么说的,可能是用户第一次选择的这个page时候创建窗口的吧!
我再去看一下mfc的源代码
回复
蒋晟 2004-11-28
页面上的内容默认是使用ddx/ddv来进行交换的,如果你没有使用ddx/ddv,那么页面上的控件不会自动和成员变量交换数据
更多信息参考http://www.codeguru.com/Cpp/controls/propertysheet/article.php/c567/
回复
whwjn 2004-11-28
不是每次都创建,只是第一次创建,以后都是show或者hide
回复
回复
whwjn 2004-11-28
msdn上面说了?哪里啊?
你可以自己设一下断点看看,看进不进OnInitUpdate里面,肯定不是每次都创建,
我用了好久了的,如果每次都创建那我以前的程序怎么运作的好好的。
不是当前的page,但是必须调用过SetActivePage或者手动的使它既活过一次才
m_hWnd!=NULL
回复
heroboy2000 2004-11-28
楼上的错了,本来我以为也是这样的,但是msdn上说每次是重新创建的,
而且在程序中,不是当前的page,它的m_hWnd==NULL,说明没有创建
回复
heroboy2000 2004-11-28
问题已经解决,
因为当对话框上面的控件再包含另一个子控件(子窗口)的话,也就是子窗口的子窗口,
那么包含子窗口的控件,要加上WS_EX_CONTROLPARENT的exstyle。
但还是多谢楼上的链接。

我的第二个问题是:
既然propertysheet没有保存每个page的内容,而且在page切换的时候,每个page都是重新创建的,那么为什么在切换page的时候,page上的内容还保留着
回复
相关推荐
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2004-11-27 10:11
社区公告
暂无公告