美文网首页
MFC 圆形控件的实现

MFC 圆形控件的实现

作者: 彦子凡 | 来源:发表于2017-07-06 09:21 被阅读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中,有兴趣可以去搜一下.

    相关文章

      网友评论

          本文标题:MFC 圆形控件的实现

          本文链接:https://www.haomeiwen.com/subject/vrochxtx.html