关闭

圆形热点按钮的制作

487人阅读 评论(0) 收藏 举报
分类:

说明:

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

过程:

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


不一定是最好看,但是,这或许是用于的。这篇文章如有不足之处,请多多指教
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10720次
    • 积分:324
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论