MFC Button控件自绘制----详细讲解

简介:     VC下的界面着实难看 有时候我们不得不自己进行控件的绘制 以前 一直不理解最近再次看了学了一遍终于明白了一点   与大家分享下...       需要源代码的Q我 寻找一起学VC的朋友     比如说   我们要改变一个编辑框的背景 我们响应WM_CTLCOLOR函数 进行OnCtlColor进行修改但是对与 Button控件就不行了 .
 

  VC下的界面着实难看 有时候我们不得不自己进行控件的绘制 以前 一直不理解最近再次看了学了一遍终于明白了一点
  与大家分享下...       需要源代码的Q我 寻找一起学VC的朋友 

   比如说


  我们要改变一个编辑框的背景 我们响应WM_CTLCOLOR函数 进行OnCtlColor进行修改但是对与 Button控件就不行了 ..
 
  这时候我们要进行自绘制    相关函数   virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

  要覆盖掉这个虚函数  并且类型要设置为 BS_OWNERDRAW 这时候 放 应用程序进行初始化界面的时候 会进入我们的

  DrawItem函数 进行控件的绘制   所以说 自绘制 就2个步骤    

  ASSERT 宏 
 
  Evaluate an expression and generate a debug report when the result is FALSE (debug version only).    
  计算表达是当结果是false的时候生成调试报告 (仅仅在debug下 )
 


  1. 类型要设置为 BS_OWNERDRAW


  2.重写 virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );函数   代码就我们自己设计了

 重绘需要的函数  注意 都是SDK中的函数
 
  BOOL DrawFrameControl(   //这个函数画一个指定类型控件的框架
  HDC hdc,     // handle to device context  DC
  LPRECT lprc, // bounding rectangle   举行区域
  UINT uType,  // frame-control type   类型
  UINT uState  // frame-control state  状态 具体看MSDN
);
  

 
int DrawText(   //在指定的矩形区域 输出文本
  HDC hDC,          // handle to DC
  LPCTSTR lpString, // text to draw
  int nCount,       // text length
  LPRECT lpRect,    // formatting dimensions
  UINT uFormat      // text-drawing options
);

COLORREF SetTextColor(  //设置指定DC的文本颜色
  HDC hdc,           // handle to DC
  COLORREF crColor   // text color
);

int FillRect(  // 用给定画刷填充矩形区域
  HDC hDC,           // handle to DC
  CONST RECT *lprc,  // rectangle
  HBRUSH hbr         // handle to brush
);


int SetBkMode(    //设置背景模式   TRANSPARENT透明
  HDC hdc,      // handle to DC
  int iBkMode   // background mode
);


typedef struct tagDRAWITEMSTRUCT {    //具体看MSDN
  UINT      CtlType;      //控件类型
  UINT      CtlID;    //id
  UINT      itemID;    //项ID 
  UINT      itemAction;  行为   
  UINT      itemState;  //状态
  HWND      hwndItem;    //控件句柄
  HDC       hDC;    //dc句柄
  RECT      rcItem;   //举行区域
  ULONG_PTR itemData;  
} DRAWITEMSTRUCT  ;

    
    Draw3dRect 
    (
  LPCRECT lpRect,   
    COLORREF clrTopLeft,
  COLORREF clrBottomRight
   );  
 此函数用于实现绘制3D矩形的位置大小,其中lpRect是填入整个3D矩形的位置大小,
  clrTopLeft和clrBottomRight分别是3D效果中左上方和右下方的颜色RGB的值。


   BOOL DrawFocusRect
    (  画一个虚线矩形
    HDC hDC,          // handle to device context
    CONST RECT* lprc  // logical coordinates
    );  
   数功能: 画一个焦点矩形。这个矩形是在标志焦点的样式中通过异或运算完成的(焦点通常用一个点线表示)。
   如用同样的参数再次调用这个函数,就表示删除焦点矩形

 


  下面是程序代码: 


   void  CBtnXiaoWei::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CString btnCaption;  //保存button标题
GetWindowText(btnCaption);  //获得button标题
CRect drawRect; //定义CRect对象
HDC dc= lpDrawItemStruct->hDC;//控件DC
CDC*pDC=CDC::FromHandle(dc);//获得CDC指针 通过 HDC
UINT nStyle=lpDrawItemStruct->CtlType;
drawRect.CopyRect(&(lpDrawItemStruct->rcItem)); //拷贝控件矩形区域到我们的CRect对象  
DrawFrameControl(dc,&drawRect,DFC_MENU,nStyle); //绘制控件框架
CBrush pBrush;//创建画刷

static int n=0;
pBrush.CreateSolidBrush(RGB(100+n,130,n)); //创建
pDC->FillRect(drawRect,&pBrush);//画矩形
pDC->SetTextColor(m_clo); //设置文本颜色


CRect textRect;//定义一个CRect用于绘制文本
textRect.CopyRect(&drawRect); //拷贝矩形区域
CSize sz=pDC->GetTextExtent(btnCaption);//获得字符串尺寸
textRect.top+=(textRect.Height()-sz.cy)/2;//调整文本位置 居中
pDC->SetBkMode(TRANSPARENT);//设置文本背景透明
pDC->DrawText(btnCaption,&textRect,DT_RIGHT|DT_CENTER|DT_BOTTOM);//绘制文本
n+=10;
}

 


void CBtnXiaoWei::SetTextColer(COLORREF clo)
{
m_clo=clo;
Invalidate(); //是局部无效引起重画
}

 

 

 

 


 

目录
相关文章
|
5月前
MFC基本控件2-单选按钮的使用
接下来是第二个MFC控件-单选按钮的使用方法, 同样分为基本使用和衍生的使用。
|
3月前
MFC自定义button实现颜色控制
MFC自定义button实现颜色控制
|
5月前
MFC基本控件3-Button的风格
我们继续来了解MFC控件的基本使用, 按钮的使用大家肯定都很熟悉了, 我们今天来了解一下Button按钮的功能扩展怎么实现。
VB编程:ReleaseCapture&SendMessage拖动无标题栏的窗体-57
VB编程:ReleaseCapture&SendMessage拖动无标题栏的窗体-57
VB编程:ReleaseCapture&SendMessage拖动无标题栏的窗体
VB编程:ReleaseCapture&SendMessage拖动无标题栏的窗体
146 0
VB编程:ReleaseCapture&SendMessage拖动无标题栏的窗体
|
开发工具 C语言
Qt编写自定义控件11-设备防区按钮控件
一、前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜色指示,例如布防、撤防、旁路、报警、离线、在线等状态,可以作为一个通用的设备按钮对象使用。
815 0
|
开发工具 C语言 索引
Qt编写自定义控件8-动画按钮组控件
一、前言 动画按钮组控件可以用来当做各种漂亮的导航条用,既可以设置成顶部底部+左侧右侧,还自带精美的滑动效果,还可以设置悬停滑动等各种颜色,原创作者雨田哥(QQ:3246214072),驰骋Qt控件界多年,雨田哥是我见过的在这块水平相当牛逼的,在我之上,想要什么效果都可以搞出来,大家也可以找他定制...
1296 0
|
Windows
背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件
原文:背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件 [源码下载] 背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事...
1088 0