说明:
绘制一个圆形的按钮,如果鼠标悬停在圆里面时,边框变成黑色,否则为白色。
过程:
思路如下:首先在对话框中绘制一个圆形,然后处理WM_MOUSEMOVE消息,计算出当前鼠标所停的点是否在圆里面。如果在,那么就在绘制时把边框变成黑色的。再处理WM_LBUTTONUP,如果鼠标在圆里面,就弹出一个对话框。
首先先定义类circle
class circle : public CWnd
{
DECLARE_DYNAMIC(circle)
private:
CPoint center; .//圆心所在点
int radium;//半径
public:
circle();
virtual ~circle();
void draw(int radium,CPoint center,CDC *pDC,int mode,CString text);//绘制圆形按钮
bool isInCricle(CPoint point);//判断是否在圆里面
void click(CPoint point);
protected:
DECLARE_MESSAGE_MAP()
};
然后再实现。
void circle::draw(int radium,CPoint center,CDC *pDC,int mode,CString text)
{
CPen pen = CPen(PS_SOLID,5,RGB(255,255,255));
CPen selected = CPen(PS_SOLID,5,RGB(0,0,0));
CFont font;
font.CreatePointFont(196,_T("黑体"));
if (mode == 0)//在圆外面
{
pDC->SelectObject(pen);
pDC->Ellipse(center.x - radium,center.y - radium,center.x + radium,center.y + radium);//计算圆的区域
pDC->SelectObject(font);
pDC->TextOutW(center.x - text.GetLength() * 7,center.y - text.GetLength() * 5,text);//7 = sqrt(196)/2
this->radium = radium;
this->center = center;
}
else//在圆里面
{
pDC->SelectObject(selected);
pDC->Ellipse(center.x - radium,center.y - radium,center.x + radium,center.y + radium);
pDC->SelectObject(font);
pDC->TextOutW(center.x - text.GetLength() * 7,center.y - text.GetLength() * 5,text);
this->radium = radium;
this->center = center;
}
}
bool circle::isInCricle(CPoint point)
{
int m,n;
m = static_cast<int>(point.x) - this->center.x;//计算这个点是否在圆里面
n = static_cast<int>(point.y) - this->center.y;
if (m * m + n * n <= this->radium * this->radium)
{
return TRUE;
}
else
{
return FALSE;
}
}
void circle::click(CPoint point)
{
if (this->isInCricle(point))
{
MessageBoxW(_T("成功了!"),_T("消息"));
}
}
在对话框头文件中,定义
circle myCircle;
CDC *pDC;//绘图上下文
最后再initDialog中进行初始化
myCircle.draw(50,CPoint(100,100),pDC,0,_T("ABC"));
另外,我们还得处理WM_MOUSEMOVE和WM_LBUTTONUP
void CcirclebuttonDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (myCircle.isInCricle(point))
{
myCircle.draw(50,CPoint(100,100),pDC,1,_T("ABC"));
}
else
{
myCircle.draw(50,CPoint(100,100),pDC,0,_T("ABC"));
}
CDialogEx::OnMouseMove(nFlags, point);
}
//处理WM_MOUSEMOVE
void CcirclebuttonDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
myCircle.click(point);
CDialogEx::OnLButtonUp(nFlags, point);
}
//处理WM_LBUTTONUP