在移动开发中,例如iOS中,如果要实现圆形的控件,很简单的一句layer.setCorner()半径设置为正方形边框的一半即可,这是最简单的方法,也是最low的方法,但是对于初学者来说,好歹是实现了.
然而,在MFC开发之中,根本就没有这一种方法,这也就是C++卫视比OC要好的原因之一了,因为那种方法有很多弊端,C++就直接不允许那么干了.那么MFC中绘制一个圆形的控件该如何绘制呢,这里我以按钮为例.
直接就上代码,然后来解析这个代码,这样的方法也许更直接.
void CMyButton::PreSubclassWindow()
{
//修改属性为可绘制的
ModifyStyle(0,BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//获取cdc对象
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
//背景透明
dc.SetBkMode(TRANSPARENT);
//获取矩形区域
CRect rc = lpDrawItemStruct->rcItem;
CPen pNewPen;
CPen *pOldPen;
pNewPen.CreatePen(PS_SOLID,2,RGB(0,255,0));
pOldPen = dc.SelectObject(&pNewPen);
//画刷
CBrush fillbrush;
CBrush *oldbrush;
fillbrush.CreateSolidBrush(RGB(255,0,0));
oldbrush = dc.SelectObject(&fillbrush);
//画椭圆的函数
dc.Ellipse(0, 0, rc.Width(), rc.Height());
//文字
CString str;
GetWindowText(str);
dc.DrawText(str,CRect(0,0,rc.right,rc.bottom),DT_CENTER | DT_VCENTER | DT_SINGLELINE);
dc.DeleteDC();
fillbrush.DeleteObject();
pNewPen.DeleteObject();
}
BOOL CMyButton::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
这段是最核心的代码,首先,创建一个新的类继承于CButton,然后添加重载函数PreSubclassWindow()和DrawItem(),加上里面的代码注释,应该可以看得明白.
技巧就是,画一个矩形去框住原来的按钮,然后再画一个圈去框矩形,去除不要的部分,用画刷图颜色,就可以了.
在iOS中,也有这样一种绘图的方法来设置圆形的图片,避免比如一个界面一次加载10几个甚至更多的圆形图片的话,用setCorner的话会使得加载的很慢,甚至是运行不了,所以MFC中这种方法也就延伸到了iOS中,有兴趣可以去搜一下.