本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:
http://blog.csdn.net/zuishikonghuan/article/details/47394747
在上几篇中,我们说到了通过GdipCreateFromHDC函数将HDC(设备上下文句柄)装换成GDI+的Graphics对象,讲到了画笔和画刷的使用,演示了何利用GDI+Flat来画图片和画文字,并讲到了双缓冲绘图和DC复制。
这一篇博文中,我们来聊聊如何用GdiplusFlat来绘制按钮。
还是和以前一样,我们必须自己声明GDI+Flat函数,自己定义GDI+Flat的数据结构。自己动手,丰衣足食。~~
其实,自绘按钮有两种形式,这两种形式分别是:
1。我们不创建按钮,我们直接在窗口的设备上下文场景的一部分上绘制按钮,也就是说不存在一个子窗口,按钮完全是我们自己画上去的。
2。将一个标准的win32按钮子类化(子类化介绍),在按钮的WM_PAINT、WM_MOUSEMOVE、WM_MOUSELEAVE、WM_LBUTTONDOWN、WM_LBUTTONUP消息里面控制按钮的绘制,也就是说,我们直接基于一个Win32按钮,我们是改变了这个win32按钮的实现逻辑,绘制成我们需要的样式,按钮依旧作为子窗口存在。
这一篇文章讲一讲方法1
先看看效果图:(GIF本身的限制,动画有颜色失真)
首先我们用GDI写一个画文字的函数,你可能会问为何费用要用GDI?因为GDI+画文字的居中精度不准,而且GDI绘制效率高,同时我们也不需要花里胡哨的文字。
void WINAPI MyDrawText(HDC hdc, LPCTSTR str, LONG left, LONG top, LONG width, LONG height, BOOL iscenter, COLORREF color = 0){
SetBkMode(hdc, TRANSPARENT);
RECT r = { left, top, left + width, top + height };
HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
HFONT hOldFont = (HFONT)SelectObject(hdc, hFont);
SetTextColor(hdc, color);
DrawText(hdc, str, -1, &r, iscenter ? DT_CENTER | DT_VCENTER | DT_SINGLELINE : 0);
SelectObject(hdc, hOldFont);
DeleteObject(hFont);
}//参数:设备上下文句柄,要绘制的字符串,x位置,y位置,宽度,高度,是否绘制在矩形中央,颜色
之后我们写一个ARGB宏,用于生成ARGB颜色
#define ARGB(a,r,g,b) ((int)(((BYTE)a)<<24)|(((BYTE)r)<<16)|(((BYTE)g)<<8)|((BYTE)b))
我们写一个画按钮的函数
void WINAPI drawbutton(HDC hdc,unsigned int argb){//参数:设备上下文句柄;按钮背景ARGB颜色
int graphics;
GdipCreateFromHDC(mdc, &graphics);//创建Graphics