描述:
做的一个聊天室控件,托各位的福,一切还算顺利
在activex control test container里测试时,功能一切正常。
但我新建一个dialog based project后,将注册后的此控件加入控件栏
然后点击,在dialog中生成时却出了错,说是:
Debug Assertion Failed!
Program:C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.COM
File:winocc.cpp
Line:279
……
然后我就搜索这个winocc.cpp,找到了,在:C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC这个文件夹中。
然后打开它,发现第279行是在这个函数里的:
void CWnd::MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint)
{
ASSERT(::IsWindow(m_hWnd)); //此即第279行
if (m_pCtrlSite == NULL)
::MoveWindow(m_hWnd, x, y, nWidth, nHeight, bRepaint);
else
m_pCtrlSite->MoveWindow(x, y, nWidth, nHeight, bRepaint);
}
函数体的第一行就是文件的第27行。
看了之后我记起来,我控件里为了显示对话框,有个函数用到了MoveWindow这个函数:
void CAtxChatCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
// TODO: Replace the following code with your own drawing code.
//pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
//pdc->Ellipse(rcBounds);
m_ChatDlg.MoveWindow(rcBounds,TRUE);
}
但如果去掉这个调用,而使用原来的默认值,编译注册后控件的面板就不能显示了
而是显示原来的那个椭圆。
这个问题让我困惑了好久,实在搞不定了,还是来请教高人吧:)
哪位帮帮手,非常感谢!
解决方案1:
控件拥有自己的窗体吗?
解决方案2:楼主是否在做控件的时候选了 在插入对话框中可用 的选项?!
解决方案3: OnCreate是在窗体创建时调用的,很可能里面的控件还没有创建完成。所以一定要先判断是否是有效的窗口。这个问题很常见,养成习惯在任何可能有问题的窗体操作前自己判断一下是好事。
嘿嘿,我经常都不注意的,以后一定注意,谢谢
OnCreate是在窗体创建时调用的,很可能里面的控件还没有创建完成。所以一定要先判断是否是有效的窗口。这个问题很常见,养成习惯在任何可能有问题的窗体操作前自己判断一下是好事。
解决方案5:up
解决方案6:if(m_ChatDlg.GetSafeHwnd())
解决方案7:可经先用::IsWindow(控件.GetSafeHwnd())判断控件是否创建,只有当它为真时才进行MoveWindow操作。