近日在练习时遇到下面的问题,一时无法解决,知情者请答复,谢谢!
练习项目:在窗口的客户区用鼠标左键点两下,以这两点为源点画椭圆或矩形。鼠标右键即时弹出菜单实现图形的选择(椭圆或矩形);工具条实现颜色的选择。
问题:考虑到按了某工具条按钮后再按此按钮就没有意义,所以要灰化所按的按钮,同时又要启用以前灰化的按钮。如果不灰化当前所按的按钮,程序正常,但在实现互斥时出了问题。部分源代码如下:
void CDrawRectView::OnCommandRangeColor(UINT nID)
{
// TODO: Add your command handler code here
switch(nID)
{
case ID_BLACK:
m_rgb=RGB(0,0,0);
break;
case ID_RED:
m_rgb=RGB(255,0,0);
break;
case ID_GREEN:
m_rgb=RGB(0,255,0);
break;
case ID_BLUE:
m_rgb=RGB(0,0,255);
break;
}
SetToolBarCtrlState(nID);
}
void CDrawRectView::SetToolBarCtrlState(UINT nID)
{
int ControlBarNumber;
//获得工具条指针
CToolBar* pToolBar=(CToolBar*)(GetParentFrame()->GetControlBar(IDR_MAINFRAME));
//获得工具条控制指针
CToolBarCtrl* pToolBarCtrl=&(pToolBar->GetToolBarCtrl());
//获得工具条控件数目
ControlBarNumber=pToolBarCtrl->GetButtonCount();
for(UINT ii=ID_BLACK;ii<ID_BLUE;ii++)
{
TBBUTTONINFO* ptbbi;
pToolBarCtrl->GetButtonInfo(ii,ptbbi);
if(ptbbi->fsState!=TBSTATE_ENABLED)
{
pToolBarCtrl->EnableButton(nID,false);
pToolBarCtrl->EnableButton(ii,true);
return;
}
}
return;
}
问题说明:在自定义函数SetToolBarCtrlState中调用GetButtonCount是多余的,但问题正出在他身上。注释掉GetButtonCount后,GetButtonInfo又出了问题.问题的说明都是:
Unhandled exception in DrawRect.exe (MFC42D.DLL):0xC0000005:Access Violation
编译能通过,但运行时出错。
本程序是用VC++6.0在Win XP下编译.