读书人

为什么CTreeCtrl类用CreateEx创建WS_P

发布时间: 2013-05-02 09:39:29 作者: rapoo

为什么CTreeCtrl类用CreateEx创建WS_POPUP风格树控件debug下出现断言错误,如何解决
如题,在一个对话框中动态创建一个树控件 如:
CRect rect(0, 0, 100, 100);
DWORD dwStyle = WS_POPUP | WS_BORDER | TVS_DISABLEDRAGDROP | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_FULLROWSELECT | TVS_CHECKBOXES;
m_Tree.CreateEx(0, WC_TREEVIEW, NULL, dwStyle, rect, GetParent(), 0, NULL);
m_Tree.Init(this);
但是debug下出现断言错误。
[解决办法]

引用:
不能使用WS_POPUP,这个风格给模态对话框用的

基本控件可以使用WS_POPUP,前提是必须使用CreateEx来创建(这个可以在afxwin.h找到原话)
[解决办法]
引用:
实践出真知,去掉就不崩溃了,我碰到过。

实践出真知。将WS_POPUP改成WS_CHILD肯定没问题。
但是Create中加WS_POPUP就会有问题
// can't use for desktop or pop-up windows (use CreateEx instead)
ASSERT(pParentWnd != NULL);
ASSERT((dwStyle & WS_POPUP) == 0);
这是Create中的代码

引用:
引用:引用:不能使用WS_POPUP,这个风格给模态对话框用的
基本控件可以使用WS_POPUP,前提是必须使用CreateEx来创建(这个可以在afxwin.h找到原话)嗯 我查MSDN也是这么说的,Release版本能编译通过,而且我查看底层代码,发现CreateEx之后调用的是CW……

我怎么看到的是Create最后调用的CreateEx呢?

BOOL CWnd::Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd, UINT nID,
CCreateContext* pContext)
{
// can't use for desktop or pop-up windows (use CreateEx instead)
ASSERT(pParentWnd != NULL);
ASSERT((dwStyle & WS_POPUP) == 0);

return CreateEx(0, lpszClassName, lpszWindowName,
dwStyle
[解决办法]
WS_CHILD,
rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
pParentWnd->GetSafeHwnd(), (HMENU)(UINT_PTR)nID, (LPVOID)pContext);
}

读书人网 >VC/MFC

热点推荐