圆形热点按钮的制作

说明:

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

过程:

思路如下:首先在对话框中绘制一个圆形,然后处理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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值