自定义编辑框VC,可加载更改字体,添加背景图片,显示输入提示信息

搞了一天终于弄了个完整的编辑框控件出来了,

哎,,,搞界面开发还是有点复杂的。

 1 #pragma once
 2
 3 #include "AdvEdit.h"
 4 // CBkgEditBox
 5
 6 class CBkgEditBox : public CEdit
 7 {
 8     DECLARE_DYNAMIC(CBkgEditBox)
 9
10 public:
11     CBkgEditBox();
12     virtual ~CBkgEditBox();
13
14 protected:
15     DECLARE_MESSAGE_MAP()
16 public:
17     afx_msg BOOL OnEraseBkgnd(CDC* pDC);
18     afx_msg void OnSetFocus(CWnd* pOldWnd);
19     afx_msg void OnMouseHover(UINT nFlags, CPoint point);
20     afx_msg void OnMouseLeave();
21     afx_msg void OnMouseMove(UINT nFlags, CPoint point);
22     afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
23     afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
24     afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
25     afx_msg void OnKillFocus(CWnd* pNewWnd);
26
27 private:
28     BOOL m_bFirstDraw;          // 第一次绘制背景标识
29     Gdiplus::Image *m_pPngBg;   // 背景位图资源
30     BOOL m_bHover;              // 鼠标是否在编辑框上标识
31     BOOL m_bAllowMouseTrack;    // 鼠标移动时是否允许追踪鼠标移动
32     COLORREF m_clrBkgnd;        // 默认背景Hover颜色
33     COLORREF m_clrHoverBkgnd;   // 默认背景UnHover颜色
34     COLORREF m_clrText;         // 字体颜色
35     CString  m_strTipStr;       // 输入提示信息
36     CBrush   m_brhNull;         // 空画刷对象
37     CFont*   m_pTextFont;       // 编辑框字体
38
39 public:
40     BOOL SetBackgndRes( UINT nResourceID, LPCTSTR lpszType=_T("PNG"));
41     void SetGrayTipString(LPCTSTR lpszTipString);
42     void SetTextColor(COLORREF clrText);
43     BOOL SetTextFont(int nHeight = 18, int nWidth = 10, LPCTSTR lpszFaceName = _T("宋体"));
44   BOOL IsEditEmpty();
45 };
  1 // MyEditBox.cpp : 实现文件
  2 //
  3
  4 #include "stdafx.h"
  6 #include "BkgEditBox.h"
  7
  8
  9 // CBkgEditBox
 10
 11 IMPLEMENT_DYNAMIC(CBkgEditBox, CEdit)
 12
 13 CBkgEditBox::CBkgEditBox()
 14 {
 15     m_bFirstDraw = TRUE;
 16     m_pPngBg     = NULL;
 17     m_bHover     = FALSE;
 18     m_bAllowMouseTrack = TRUE;
 19
 20     m_clrBkgnd      = RGB(255,255,255);
 21     m_clrHoverBkgnd = RGB(255,255,255);
 22     m_clrText       = RGB(0,0,0);
 23     m_strTipStr = _T("");
 24
 25     m_brhNull.CreateStockObject(NULL_BRUSH);
 26     m_pTextFont = NULL;
 27 }
 28
 29 CBkgEditBox::~CBkgEditBox()
 30 {
 31     if (NULL != m_pTextFont)
 32     {
 33         delete m_pTextFont;
 34         m_pTextFont = NULL;
 35     }
 36 }
 37
 38
 39 BEGIN_MESSAGE_MAP(CBkgEditBox, CEdit)
 40     ON_WM_ERASEBKGND()
 41     ON_WM_SETFOCUS()
 42     ON_WM_MOUSEHOVER()
 43     ON_WM_MOUSELEAVE()
 44     ON_WM_MOUSEMOVE()
 45     ON_WM_CTLCOLOR()
 46     ON_WM_CTLCOLOR_REFLECT()
 47     ON_WM_CHAR()
 48     ON_WM_KILLFOCUS()
 49 END_MESSAGE_MAP()
 50
 51
 52
 53 // CBkgEditBox 消息处理程序
 54
 55
 56
 57
 58 BOOL CBkgEditBox::OnEraseBkgnd(CDC* pDC)
 59 {
 60     // 图片背景与编辑框的距离顶点
 61     int nLeftStep,nTopStep,nWidthStep,nHeightStep;
 62     nLeftStep = 1;
 63     nTopStep  = 5;
 64     nWidthStep  = 2;
 65     nHeightStep = 8;
 66     CDC* pOldDC = pDC;
 67     if (NULL != m_pPngBg)
 68     {
 69         pDC = GetParent()->GetDC();
 70         CRect rect;
 71         GetWindowRect(&rect);
 72         this->GetParent()->ScreenToClient(&rect);
 73
 74         int nWidth  = m_pPngBg->GetWidth();
 75         int nHeight = m_pPngBg->GetHeight();
 76
 77         // 不是第一次绘制时需要调整位置
 78         if (!m_bFirstDraw)
 79         {
 80             rect.left -= nLeftStep;
 81             rect.top  -= nTopStep;
 82         }else
 83         {
 84             MoveWindow(rect.left + nLeftStep, rect.top + nTopStep,
 85                 nWidth - nWidthStep, nHeight - nHeightStep);
 86         }
 87
 88
 89         CDC MemDc;
 90         MemDc.CreateCompatibleDC(pDC);
 91
 92         CBitmap bitMemMap;
 93         bitMemMap.CreateCompatibleBitmap(pDC, nWidth, nHeight);
 94         MemDc.SelectObject(&bitMemMap);
 95
 96         Gdiplus::Graphics graphics(MemDc.m_hDC);
 97         graphics.DrawImage(m_pPngBg, 0, 0, nWidth, nHeight);
 98         pDC->BitBlt(rect.left, rect.top, nWidth,nHeight, &MemDc, 0, 0,SRCCOPY);
 99
100         bitMemMap.DeleteObject();
101         MemDc.DeleteDC();
102         m_bFirstDraw = FALSE;
103
104         pDC = pOldDC;
105     }
106
107
108
109     {
110
111         // 内阴影
112         CBrush brhInnerShadow;
113         if (!m_bHover)
114         {
115             brhInnerShadow.CreateSolidBrush(m_clrBkgnd);
116         }else
117         {
118             brhInnerShadow.CreateSolidBrush(m_clrHoverBkgnd);
119         }
120
121
122         CBrush* pOldBrh = pDC->SelectObject(&brhInnerShadow);
123         pDC->SelectStockObject(NULL_PEN);
124         CRect rcShadow;
125         GetClientRect(&rcShadow);
126         if (NULL != m_pPngBg)
127         {
128             rcShadow.right  = rcShadow.left + m_pPngBg->GetWidth() - nWidthStep;
129             rcShadow.bottom = rcShadow.top + m_pPngBg->GetHeight() - nHeightStep;
130         }
131         pDC->Rectangle(&rcShadow);
132         if(NULL!=pOldBrh)
133         {
134             pDC->SelectObject(pOldBrh);
135         }
136         brhInnerShadow.DeleteObject();
137         this->UpdateWindow();
138
139     }
140
141     return CEdit::OnEraseBkgnd(pDC);
142 }
143
144 BOOL CBkgEditBox::SetBackgndRes( UINT nResourceID, LPCTSTR lpszType/*=_T("PNG")*/ )
145 {
146     return G_ImageFromIDResource(nResourceID, lpszType, m_pPngBg);
147 }
148
149
150 void CBkgEditBox::OnMouseHover(UINT nFlags, CPoint point)
151 {
152     m_bHover = TRUE;
153     Invalidate();
154
155     CEdit::OnMouseHover(nFlags, point);
156 }
157
158
159 void CBkgEditBox::OnMouseLeave()
160 {
161     // Hover结束
162     m_bHover = FALSE;
163     // 重绘背景
164     Invalidate();
165
166     // 鼠标离开,继续追踪HOVER消息
167     m_bAllowMouseTrack = TRUE;
168
169     //CWnd* pWnd =this->GetParent();
170
171     //CRect rcTmp;
172     //GetClientRect(rcTmp);
173     //rcTmp.OffsetRect(3, 3);
174     ////InvalidateRect(rcTmp);
175     //this->ClientToScreen(&rcTmp);
176     //pWnd->ScreenToClient(&rcTmp);
177     //pWnd->InvalidateRect(&rcTmp);
178     //pWnd->UpdateWindow();
179
180
181
182     CEdit::OnMouseLeave();
183 }
184
185
186 void CBkgEditBox::OnMouseMove(UINT nFlags, CPoint point)
187 {
188     // 默认情况下,窗口是不响应 WM_MOUSELEAVE 和 WM_MOUSEHOVER 消息的,
189     // 所以要使用 _TrackMouseEvent 函数来激活这两个消息
190     // https://msdn.microsoft.com/en-us/library/ms645604
191
192     if (m_bAllowMouseTrack)
193     {
194         TRACKMOUSEEVENT tme;
195         tme.cbSize      = sizeof(TRACKMOUSEEVENT);
196         tme.dwFlags     = TME_HOVER|TME_LEAVE;
197         tme.hwndTrack   = m_hWnd;
198         tme.dwHoverTime = 10; // 超过10ms才会认为HOVER
199
200         _TrackMouseEvent(&tme);
201         m_bAllowMouseTrack = FALSE;
202     }
203
204     CEdit::OnMouseMove(nFlags, point);
205 }
206
207 BOOL CBkgEditBox::IsEditEmpty()
208 {
209     CString strText;
210     GetWindowText(strText);
211     if (strText.IsEmpty())
212     {
213         return TRUE;
214     }
215     if (strText == m_strTipStr)
216     {
217         return TRUE;
218     }
219     return FALSE;
220 }
221
222
223 HBRUSH CBkgEditBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
224 {
225     HBRUSH hbr = CEdit::OnCtlColor(pDC, pWnd, nCtlColor);
226
227     // TODO:  在此更改 DC 的任何特性
228
229     // TODO:  如果默认的不是所需画笔,则返回另一个画笔
230
231     return hbr;
232 }
233
234 HBRUSH CBkgEditBox::CtlColor( CDC* pDC, UINT nCtlColor )
235 {
236     // 设置透明背景
237     pDC->SetBkMode(TRANSPARENT);
238
239     CString sText;
240     GetWindowText(sText);
241     if (sText == m_strTipStr)
242     {
243         pDC->SetTextColor(RGB(150,150,150));
244     }else
245     {
246         pDC->SetTextColor(m_clrText);
247     }
248
249     return m_brhNull;
250 }
251
252
253 void CBkgEditBox::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
254 {
255     Invalidate(TRUE);
256
257     CEdit::OnChar(nChar, nRepCnt, nFlags);
258 }
259
260
261 void CBkgEditBox::OnSetFocus(CWnd* pOldWnd)
262 {
263     CEdit::OnSetFocus(pOldWnd);
264
265     CString sText;
266     GetWindowText(sText);
267     if (sText == m_strTipStr)
268     {
269         SetWindowText(_T(""));
270     }
271     Invalidate(TRUE);
272     return ;
273
274 }
275 void CBkgEditBox::OnKillFocus(CWnd* pNewWnd)
276 {
277     CEdit::OnKillFocus(pNewWnd);
278
279     CString sText;
280     GetWindowText(sText);
281     if (_T("") == sText)
282     {
283         SetWindowText(m_strTipStr);
284     }
285 }
286
287 void CBkgEditBox::SetGrayTipString( LPCTSTR lpszTipString )
288 {
289     m_strTipStr = lpszTipString;
290
291     SetWindowText(lpszTipString);
292 }
293
294 void CBkgEditBox::SetTextColor( COLORREF clrText )
295 {
296     m_clrText = m_clrText;
297 }
298
299 // https://msdn.microsoft.com/zh-tw/library/vstudio/2ek64h34.aspx
300 BOOL CBkgEditBox::SetTextFont( int nHeight /*= 20*/, int nWidth /*= 12*/, LPCTSTR lpszFaceName /*= _T("宋体")*/ )
301 {
302     if (NULL != m_pTextFont)
303     {
304         delete m_pTextFont;
305         m_pTextFont = NULL;
306     }
307     m_pTextFont = new CFont;
308     m_pTextFont->CreateFont(
309         nHeight,                   // nHeight
310         nWidth,                    // nWidth
311         0,                         // nEscapement
312         0,                         // nOrientation
313         FW_NORMAL,                 // nWeight
314         FALSE,                     // bItalic
315         FALSE,                     // bUnderline
316         0,                         // cStrikeOut
317         ANSI_CHARSET,              // nCharSet
318         OUT_DEFAULT_PRECIS,        // nOutPrecision
319         CLIP_DEFAULT_PRECIS,       // nClipPrecision
320         DEFAULT_QUALITY,           // nQuality
321         DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
322         lpszFaceName);
323
324     this->SetFont(m_pTextFont);
325     return TRUE;
326 }
时间: 2024-10-17 01:28:55

自定义编辑框VC,可加载更改字体,添加背景图片,显示输入提示信息的相关文章

VC 下加载 JPG / JPEG / GIF / PNG 图片最简单的方法

VC MFC 提供的 API LoadBitmap / LoadImage 类 CBitmap 等都只能操作 BMP 位图,图标.对于其他常用的 JPG / JPEG / GIF / PNG 格式,它无能为力.VC 下怎样才能加载各种非 BMP 格式的图片呢? 下面介绍一种最简单的办法.用 CImage 类的 Load 函数加载图片,之后用 Detach 取得HBITMAP 句柄.取得图片的HBITMAP 句柄后就可以像操作 BMP 图片一样处理 JPG / JPEG / GIF / PNG 格

用 SDL2 加载PNG平铺背景并显示前景

上一篇中加载的是BMP,这次可以引用 SDL2_image.lib,加载更多格式的图像. LoadImage函数做了改动,区别在于不用将surface转换成texture了. 环境:SDL2 + VC++2015 下面的代码将打开background.png和image.png,将background平铺背景,将image作为前景呈现. 1 #include <stdexcept> 2 #include <string> 3 #include <iostream> 4

js数据显示在文本框中(页面加载显示和按钮触动显示)

web代码如下: <!DOCTYPE html> <html> <head> <title>jsTest02.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is

淘宝购物车页面 智能搜索框Ajax异步加载数据

如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区非常的活跃,许多朋友都在不同地方分享了很多优秀的插件.我在相关的网站上找过想实现类似功能的插件,但是没有找到.于是乎,自己动手丰衣足食.自己来搭建智能搜索框下拉列表.当然,如果有类似功能并且常维护Bug的插件,望留言交流. 源码地址: 淘宝购物车页面--PC端和移动端项目实战 首先需要先给大家打一根

代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到合意的,所以根据网上找的一段代码,进行了较大改动. 需引用 zepto 或 jquery. 我这个是应用于手机上的,两列瀑布流,图片高度未知——等图片的onloaded事件触发后,才对容器进行计算和定位. 大容器是 $("#imgList"),容器格子是$(".pin"

jquery文档加载几种写法,图片加载写法

jquery文档加载写法: $(function(){ }) ; //个人最常使用方式 $(document).ready(function(){ }); //调用文档对象下的ready方法传入一个函数. $(window).load(function() { });//调用window对象下的load方法传入一个函数. (function() { })(jQuery)//()()表示立即执行 并且传入jquery = $ 所以之前$也可以替换为jQuery 注意: jquery的ready只是

Android 加载gif图片强大框架(支持预加载、缓存,还支持显示静态图片,一行代码全搞定)

之前项目中没有涉及到显示gif图片的功能,也没有着重研究过,最近项目中要用到显示gif图片,于是就在网上一顿搜,用过之后发现如下几个缺点. 1.加载大的gif图片会出现oom. 2.没有预加载和缓存功能,比较消耗内存. 3.功能比较单一,显示gif了但是不能显示静态图片. 最后无意间发现了一个强大的gif加载框架,能够满足上面的所有缺陷,支持预加载和缓存,同时支持显示静态图片和gif图片.下面是一些源代码: //xml布局就是一个ImageView //在需要的地方直接调用 Glide.with

【JavaScript】加载失败的红叉图片处理与&lt;img&gt;图片标签的onerror事件

大家上网的时候肯定见到过加载失败的红叉图片,具体如下图.当然现在Google Chrome与Firefox对其处理会好看一些. 其实可以利用<img>图片标签的onerror事件对其处理的,要求其加载失败之后,马上加载一张默认图片,而不是显示为红叉叉. 其代码如下: <img src="s.png" onerror="javascript:this.src='xx.png';this.width=80;this.height=80;" />

Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)

最近在做ListView分页显示,其中包括图片 和文字(先下载解析文字内容,再异步加载图片)发现每次点击下一页后,文字内容加载完毕,马上向下滑动,由于这时后台在用线程池异步下载图片,我每页有20条,也就是20张图片,会导致listview滑动卡顿! 这是用户不想看到的,我参考了网易新闻和电子市场等应用,发现它们都是只加载屏幕内的图片,不现实的不加载,于是我也仿照做了一个.我是菜鸟,我承认 呵呵,虽然不见得完全和他们的一样,但是确实解决了翻页时那一刻的卡顿现象. 因为未发现网上有相关文章,希望对朋