在上几篇中,我们说到了通过GdipCreateFromHDC函数将HDC(设备上下文句柄)装换成GDI+的Graphics对象,讲到了画笔和画刷的使用,演示了何利用GDI+Flat来画图片和画文字,讲到了双缓冲绘图和DC复制,并说了用GdiplusFlat来绘制按钮的两种方法。
这篇我们来说说自绘Edit Control边框的实现。
还是和以前一样,我们必须自己声明GDI+Flat函数,自己定义GDI+Flat的数据结构。自己动手,丰衣足食。~~
首先说一说Edit Control垂直居中的问题。
正常情况下,即使是单行Edit,也不能垂直居中(左图):
经过优化以后,就可以垂直居中了,如右图。
具体代码如下,edit是Edit Control的句柄。
首先需要给Edit Control添加ES_MULTILINE多行风格(具体见我以前一篇关于Edit Control的博文)
TEXTMETRIC tm;
GetTextMetrics(GetDC(edit), &tm);//获取字体信息
RECT rect;
GetClientRect(edit, &rect);//获取edit矩形
OffsetRect(&rect, 0, (100 - tm.tmHeight)/2);//移动矩形
rect.bottom = rect.top + tm.tmHeight;//设置RECT的底边坐标
SendMessage(edit, EM_SETRECT, 0, (LPARAM)&rect);//设置矩形
可能有人会不明白rect.bottom = rect.top + tm.tmHeight;这一句是干嘛用的,其实,如果Edit Control比较高,不添加这一句虽然文字也居中了,但是不要忘了我们添加了ES_MULTILINE风格,虽然没有接受回车的风格,但是竟然可以换行直到控件底部,这是不能容忍的,所以这一句把矩形限制在了这一行,只要我们不加ES_AUTOVSCROLL风格,就不用再担心这个问题了。
好了,先来看看效果:
(1)
(2)
还不错吧。。完整源码:
(注意:自绘Edit Control边框可以但是不需要使用双缓冲绘图解决,而且使用双缓冲反而会损失效率,至于说原因我就不用说了吧。双缓冲不是万能的,它能解决很多问题,但不一定所有的情况都适合)
(1)源码:
#include "stdafx.h"
#include <gdiplus.h>
#include <gdiplusflat.h>
#pragma comment(lib,"gdiplus.lib")//very important
#include <windows.h>
#include <windowsx.h>
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"gdi32.lib")
#pragma comment(lib,"Msimg32.lib")
//GDI+Flat
#define ARGB(a,r,g,b) ((int)(((BYTE)a)<<24)|(((BYTE)r)<<16)|(((BYTE)g)<<8)|((BYTE)b))
typedef struct _GdiplusStartupInput{
unsigned int GdiplusVersion;
unsigned int DebugEventCallback;
BOOL SuppressBackgroundThread;
BOOL SuppressExternalCodecs;
}GdiplusStartupInput;
extern "C" int WINAPI GdiplusStartu