编写丰富多彩的CEdit控件
VC++提供的标准控件和类库已经非常丰富,但是有时候它们还是无法很好的满足我们的需求,这里举CEdit为例.
我们需要过滤部分输入字符(比如仅限数字输入),很多网友推荐采用派生的方法:重载CEdit的OnChar()函数.这个方法比其他的确简洁明了,又做到了细化和可维护性原则.但是,我们还会碰到一种情况:采用派生也无法达到需求.比如:彩色的Caret和相应颜色的字符选中背景,限定字符输入,自动格式化字符串,任意制定EditBox的大小,任意制定字体,垂直方向居中等需求.无计可施之时,干脆写一个自己的CEdit类.
下面介绍CEdit类的开发方法(别怕,微软标准的CEdit不是那么可怕,开发并不困难).
1.可以采用MFC的类向导,选中CWnd作为基类;现在编写其Create()函数:
if(m_strClassName.IsEmpty())
{
m_strClassName = AfxRegisterWndClass( CS_PARENTDC | CS_HREDRAW | CS_VREDRAW,
::LoadCursor( NULL, m_csName ),
( HBRUSH )::GetStockObject( GRAY_BRUSH ) );
}
lpszClassName = LPCTSTR(m_strClassName);
dwStyle |= WS_CHILD;
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
2.编辑自己的Caret:
大概你很少看到彩色的字符输入符号吧,因为系统采用的是单色的Caret.Caret能否由自己创建呢?答案是肯定的。可以使用CreateCaret(CBitmap)来创建图像作为字符输入符号.最难的是如何控制Caret显示的位置.我们需要考虑不同字体的字符所需要的像素数(宽度和高度),而且相同的字体不同的字符的宽度也是不一样的。但是不要紧,CpaintDC提供了标准的处理方法:
LOGFONT logfont = wnffont.getfont(m_nFnLogIdx);
CFont font;
font.CreateFontIndirect(&logfont);//draw font
dc.SelectObject(&font);
Csize szText = dc.GetOutputTextExtent( m_szData );
其中,m_nfnLoIdx为用户指定的字体,m_szData为用户已经输入的字符串;GetOutputTextExtent()函数为我们取得了详细的字符串的在像素坐标系中的x坐标信息,换句话说:我们由此可以获得当前Caret应该显示在什么位置。
- · 如何删除其它应用程序在任务栏上的图标
- · 用C++模板描述的链表、栈、队列(补充)
- · 使用纯资源DLL文件实现多语言菜单、界面文字、Tooltips等
- · 怎样利用MFC创建VB能引用的DLL方法
- · 数据结构学习(C++)——序言
- · 数据结构学习(C++)——单链表(定义与实现)
- · 数据结构学习(C++)——如何在一个链表中链入不同类型的对象
- · 人工设定窗口图标
- · 一个关于临时对象的BUG(上)
- · 数据结构学习(C++)——循环链表
- · 字符串指针与字符数组
- · 数据结构学习(C++)——双向链表
- · 优秀的开源C++库:ACE及其安装使用
- · 小议auto_ptr
- · 让基于对话框的应用程序有启动画面
- · 数据结构学习(C++)——单链表应用(一元多项式【1】)
- · 什么是WTL?
- · 数据结构学习(C++)——单链表应用(一元多项式【2】)
- · 一个关于临时对象的BUG(下)
- · 数据结构学习(C++)——稀疏矩阵(十字链表【1】)
- · MIME之Base64编解码
- · MIME之Quoted-Printable编解码
- · 浅谈指针
- · 我的COM学习笔记
- · C++学习历程
- · C++的历史纪实
- · const的思考
- · Tuples Herb Sutter(陶章志译)
- · 浅析C++里面的宏
- · WTL体系结构(1)
- · C++的程序设计典范
- · C++设计目标和原则
- · 测试2个类型相同的方法
- · 计算cpu速度的小程序
- · Union的迷思
- · 小技巧:一个工具条内放多排按钮
- · 闲言碎语话编程
- · 解析#pragma指令
