GdiplusFlat(10)自绘Edit Control边框的实现(附Edit Control垂直居中问题)

本文介绍了如何使用GDI+Flat实现自绘Edit Control的边框,同时解决了Edit Control的垂直居中问题。通过设置ES_MULTILINE样式并限制矩形高度,确保文字正确居中且不会换行到控件底部。文章提供了优化后的效果展示及完整源码。
摘要由CSDN通过智能技术生成
本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处: http://blog.csdn.net/zuishikonghuan/article/details/47419731

在上几篇中,我们说到了通过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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值