用VC制作带弹出式菜单的按钮(4)
VERIFY(m_Menu.LoadMenu(m_MenuID)); //装入菜单资源
CMenu* pPopup = m_Menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, point.x, point.y, pWndPopupOwner); //弹出菜单
}
else //再次单击,清除菜单
{
m_Menu.Detach();
m_Menu.DestroyMenu();
}
}
CButton::OnLButtonDown(nFlags, point);
}
当单击按钮选择区时,在选择区的左下角弹出菜单,函数中的point是鼠标的屏幕坐标,求菜单位置时也使用屏幕坐标。
m_MenuID是与按钮关联的弹出菜单的ID,它在创建按钮时进行设置。
OnLButtonUp()函数响应按钮弹起消息,这是只要恢复按钮正常状态即可,以产生单击动画效果。
void CMenuButton::OnLButtonUp(UINT nFlags, CPoint point)
{
m_State = 0; //恢复为正常按钮
Invalidate(); //重绘按钮
CButton::OnLButtonUp(nFlags, point);
}
四、自定义接口函数
提供用户使用按钮的接口。
//设置关联菜单ID
void CMenuButton::SetMenuID(int nID)
{
m_MenuID = nID;
}
//设置按钮文本
void CMenuButton::SetText(CString str)
{
m_strText = str;
}
//设置文本颜色
void CMenuButton::SetForeColor(COLORREF color)
{
m_ForeColor = color;
Invalidate();
}
//设置背景颜色
void CMenuButton::SetBkColor(COLORREF color)
{
m_BackColor = color;
Invalidate();
}
//是否单击主按钮区
BOOL CMenuButton::isClick()
{
return b_ClickBut;
}
由于这种按钮分为两个区域,使用时要根据单击区域决定要做的工作,所以设置了isClick()接口函数。
- 上一篇:VC++中查找/替换对话框的使用
- 下一篇:VC++中进程间相互通信的十一种方法