您的位置:首页 > 其它

圆形热点按钮的制作

2012-03-24 11:39 387 查看
说明:

绘制一个圆形的按钮,如果鼠标悬停在圆里面时,边框变成黑色,否则为白色。

过程:

思路如下:首先在对话框中绘制一个圆形,然后处理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


不一定是最好看,但是,这或许是用于的。这篇文章如有不足之处,请多多指教
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: