VC++界面编程之--自定义CEdit(编辑框)皮肤

时间:2022-09-07 22:52:37

VC++界面编程之--自定义CEdit(编辑框)皮肤

自定义编辑框是登陆界面经常用到的效果,所以我也模仿站酷网的素材做了个VC++界面编程之--自定义CEdit(编辑框)皮肤

要想继承CCustomDraw来完全自绘CEdit控件,是不太可行的方案,因为一旦你完全重绘,那么你需要额外做以下几件事:

1. CEdit光标的处理;

2. 当是密码提示时,需要弹窗提示用户大写打开。

3. 需要处理窗口文字的滚动。

这样一来,工作量会很大,而且效果也不一定好。


我这里想到相对比较好的解决方案是:子窗口+透明边框的CEdit。子窗口负责皮肤的绘制,而CEdit负责处理用户的输入。这样一来,可以利用到CEdit原有的一些特性,以保证原有的效果,并减轻我们开发的工作量。

如下图的密码输入框侦测到用户键盘大写打开时,CEdit也会提示用户大写已经打开:

VC++界面编程之--自定义CEdit(编辑框)皮肤


CEdit制作透明背景的方式是:

1. 子窗口获取WM_CTLCOLOREDIT和WM_CTLCOLORSTATIC这两个消息,当CEdit为ReadOnly时会响应WM_CTLCOLORSTATIC。

2. 在这两个消息中,返回背景画刷。

LRESULT OnCtlColorEdit(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CDCHandle dc( (HDC) wParam );
dc.SetTextColor(m_clrText);
dc.SetBkMode(TRANSPARENT);

// The AtlGetBackgroundBrush will repaint window.
if( m_brEditBack.m_GDIBrush.m_hBrush == NULL )
{
m_brEditBack.GetBackGroundBrush(m_Edit.m_hWnd, m_hWnd);
}

return (LRESULT)m_brEditBack.m_GDIBrush.m_hBrush;
}

总结了下,有些Windows控件看起来简单,但要想完全实现其效果,也得花很多功夫。能利用Windows现有的东西就尽量利用,不要一直想着完全重写。

本文源码下载链接:http://download.csdn.net/detail/renstarone/6399469