圆形热点按钮的制作

原创 2012年03月24日 11:39:30

说明:

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

过程:

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


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

一步步教你制作WPF圆形玻璃按钮

图1   1.介绍 从我开始使用vista的时候,我就非常喜欢它的圆形玻璃按钮。WPF最好的一个方面就是允许自定义任何控件的样式。用了一段时间的Microsoft Expression Bl...

Java制作圆形按钮

制作圆形Swing按钮(中文版)     作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站        这是一个关于制作...

用PPT制作圆形水晶按钮

看到图1中的水晶按钮,你可能以为是在Photoshop之类的专业图形软件中制作,然后再插入到这个演示文稿中的,其实我们可以利用PowerPoint的绘图功能来制作。这样不用处理插入图片的背景,而且非常...

iOS圆形按钮

  • 2015年01月12日 22:44
  • 133KB
  • 下载

CSS经典圆形按钮

  • 2013年08月14日 11:06
  • 18KB
  • 下载

自绘热点按钮

本程序自绘位图按钮,当鼠标滑过按钮时显示按钮的热点效果;还可以为对话框设置背景图片。...

圆形按钮类(25KB)

  • 2006年02月23日 09:05
  • 25KB
  • 下载

android 圆形纯数字按钮

最近在搞一个数字拨号按键按钮,就想到使用GridView,但在实现中遇到点问题,在给数字键进行圆形状态键设置时发现一个问题,GridView中自带的原生选择矩形按钮总是存在,于是就想到了让其状态背景设...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:圆形热点按钮的制作
举报原因:
原因补充:

(最多只允许输入30个字)