有些用VC6引入Microsoft Office Chart 11.0开发程序时可能会发现,如果把控件加到对话框资源上,只要一运行程序,电脑CPU马上就到100%了,中断以后可以发现,程序在COccManager和BindControls函数中CDataBoundProperty* pBinding = pSite->m_pBindings;
if(pBinding)
{
while(pBinding)
{
这附近停住了,在这个地方仔细跟踪的时候可以发现,这个while已经陷入了死循环,正因为这里的死循环才导致了CPU的100%,如果修改这里,需要重新编译VC库,但经过分析,发现,可以通过以下的方法将此改写。
我们自己写一个类,继承自COccManager,重写它的CreateDlgControls(CWnd* pWndParent, void* lpResource,
_AFX_OCC_DIALOG_INFO* pOccDlgInfo)函数,在最后面的
if (bSuccess)
{
// unfreeze events now that all controls are loaded
if (m_mapCustomCtrlContMap.count(pWndParent) > 0 && m_mapCustomCtrlContMap[pWndParent] != NULL)
m_mapCustomCtrlContMap[pWndParent]->FreezeAllEvents(FALSE);
BindControls(pWndParent);
}
这里,将BindControls改成自己的函数,改写就是把它的BindControls函数拷贝一下,修改一个地方,即可,修改的地方,就是将上面的while那一段改成以下的:
while(pBinding)
{
pBinding->SetClientSite(pSite);
if (pBinding->m_ctlid != 0)
{
CWnd* pWnd = pWndParent->GetDlgItem(pBinding->m_ctlid);
pBinding->SetDSCSite(m_mapCustomCtrlContMap[pWndParent]->m_mapCustomSiteMap[pWnd]);
}
pBinding = pBinding->GetNext();
}
然后在我们的工程app类的InitInstance类里,一般系统自己生成的都是
AfxEnableControlContainer();
现在改成:
manager = new CCustomOccManager();
AfxEnableControlContainer(manager);
就把系统本身用的COccManager替成了我们自己写的CCustomOccManager,程序就可以了,试试,就不会100%了。
下面是我做的分析图:
可加QQ:254963715或发邮件至glass_heart_1979@163.com进行交流。