MFC 圆形控件的实现

2017-07-06  本文已影响291人  彦子凡

在移动开发中,例如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中,有兴趣可以去搜一下.

上一篇 下一篇

猜你喜欢

热点阅读