用VC制作带弹出式菜单的按钮(3)
void CMenuButton::OnMouseMove(UINT nFlags, CPoint point)
{
if( !b_InFlag || GetCapture()!=this ) //鼠标进入按钮
{
b_InFlag = true; //设置进入标志
SetCapture(); //捕获鼠标
m_State = 1; //置按钮状态(1-当前按钮)
if( b_ClickFlag ) //检测单击选择区标志
{
m_Menu.Detach(); //清除打开的菜单
m_Menu.DestroyMenu();
b_ClickFlag = false;
}
Invalidate(); //重绘按钮
}
else
{
if ( !m_ButRect.PtInRect(point) ) //鼠标离开按钮
{
b_InFlag = false; //清除进入标志
ReleaseCapture(); //释放鼠标捕获
b_ClickBut = false; //清除单击标志
m_State = 0; //置按钮状态(0-正常按钮)
if( b_ClickFlag ) //检测单击选择区标志
{
m_Menu.Detach(); //清除打开的菜单
m_Menu.DestroyMenu();
b_ClickFlag = false;
}
Invalidate(); //重绘按钮
}
}
CButton::OnMouseMove(nFlags, point);
}
b_InFlag是个BOOL型量,鼠标进入时设置,离开时清除,目的是防止鼠标在按钮上移动时重复刷新按钮,以避免闪烁。
b_ClickFlag是单击按钮选择区标志,当它为true时,表示弹出菜单已打开,为false时表示菜单未弹出。当菜单已经弹出,而鼠标又移回按钮单击时,应清除菜单。
b_ClickBut是单击按钮主体区标志。
OnLButtonDown()函数响应按钮单击消息,当单击的是按钮主体区时,设置b_ClickBut标志;当单击的是按钮选择区时,要根据单击次数,决定是否弹出菜单。
void CMenuButton::OnLButtonDown(UINT nFlags, CPoint point)
{
if( m_LRect.PtInRect(point) ) //单击按钮主体区
{
m_State = 2; //置按钮状态(2-正常按钮)
b_ClickBut = true; //设置单击按钮标志
Invalidate(); //重绘按钮
}
else if( m_RRect.PtInRect(point) && m_MenuID ) //单击选择区
{
m_State = 3;
b_ClickBut = false; //清除单击按钮标志
Invalidate(); //重绘按钮
b_ClickFlag = !b_ClickFlag; //单击选择区标志
if( b_ClickFlag ) //一次单击,弹出菜单
{
CRect rect = m_RRect;
ClientToScreen(rect); //转换为屏幕坐标
point = rect.BottomRight();
point.x -= rect.Width(); //设置弹出菜单的位置
- 上一篇:VC++中查找/替换对话框的使用
- 下一篇:VC++中进程间相互通信的十一种方法