子类化:增强Edit控件为日期输入控件

无欲不欢147258

无欲不欢147258

2016-01-29 12:06

子类化:增强Edit控件为日期输入控件,子类化:增强Edit控件为日期输入控件

子类化:增强Edit控件为日期输入控件

作者:张鹏

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)下载源代码

关键字:子类化,Edit控件,日期

  MFC所提供的组件已经可以完成很多功能了,但有时候我们还需要这些控件按我们自己的意图去处理。比如EDIT控件,虽然我们可以设置EDIT控件为只能接受数字属性,但如果我们还需要它可以接收数字意外的字符,比如需要控件只能接收"2004-02-20"这样的格式的日期字符呢?我们需要自己在WM_CHAR消息里面来处理输入的字符。可是,当输入字符后,Windows会向Edit控件发送WM_CHAR消息,应用程序会调用Windows默认的Edit控件窗口处理函数WndProc来处理该控件。这时我们需要通过子类化将该窗口对象与自己的Edit类连接起来,这样,该类的的消息处理函数会替代原来的消息处理函数,窗口消息才能通过自己的类进行消息映射,并首先调用自己的类的消息处理函数,采用自己的Edit类来处理WM_CHAR消息。子类化可以通过宏DDX_Control宏进行静态关联,以可以通过函数SubclassWindow()或SubclassDlgItem()完成。

现在讲一下该日期输入框控件实现部分,程序运行如图一:


图一 程序运行界面

一、要想自己定义该控件的WM_CHAR消息处理函数,必须先先从CEdit类派生出自己的新类CMyEdit,这一步可以通过ClassWizard来完成。这个类主要完成对编辑框类的WM_CHAR和WN_KEYDOWN消息的处理,以达到对输入格式的控制。编辑框初始时显示" - - "的时间输入格式,要求按"year-month-day"的格式输入日期。所以初始化时设置控件格式,代码如下:

void CMyEdit::Initial(){SetLimitText(10);SetWindowText("    -  -  ");}
二、然后是关键的消息处理函数,因为我们需要过滤字符类(包括数字和Backspace键)和控制类两种击键消息(主要包括对Delete的处理)。当用户输入或者删除字符并更新窗口后,要保证"-"在字符串的第5和第8个位置,主要思路是在字符显示前通过添加" "来修整编辑框中的字符串,使显示时的字符串达到需要的要求。主要处理的函数如下:

字符消息处理:
void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: Add your message handler code here and/or call int oldpos=LOWORD(GetSel());CString str;GetWindowText(str);if ( nChar=''0'' && nChar<=''9'' ){if ( oldpos<4 || ( oldpos4 && oldpos<7) || oldpos7){str.Delete(oldpos,1);SetWindowText(str);SetSel(FormatPos(oldpos,oldpos));CEdit::OnChar(nChar, nRepCnt, nFlags);if ( LOWORD(GetSel())==4 || LOWORD(GetSel())==7){oldpos=LOWORD(GetSel());SetSel(FormatPos(oldpos+1,oldpos+1));}}elseif ( oldpos==4 || oldpos==7 ){oldpos+=1;SetSel(FormatPos(oldpos,oldpos));str.Delete(oldpos,1);SetWindowText(str);SetSel(FormatPos(oldpos,oldpos));CEdit::OnChar(nChar, nRepCnt, nFlags);}}elseif ( nChar==VK_BACK ){if ( (oldpos0 && oldpos<5) || ( oldpos5 && oldpos<8) || oldpos8){str.Insert(oldpos,'' '');SetWindowText(str);SetSel(FormatPos(oldpos,oldpos));CEdit::OnChar(nChar, nRepCnt, nFlags);}elseif ( oldpos==5 || oldpos==8 ){SetSel(FormatPos(oldpos-1,oldpos-1));}}}
击键消息处理:
void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: Add your message handler code here and/or call CString str;int oldpos=LOWORD(GetSel());GetWindowText(str);if ( nChar==VK_DELETE ){if ( oldpos<4 || ( oldpos4 && oldpos<7) || oldpos7){CEdit::OnKeyDown(nChar, nRepCnt, nFlags);GetWindowText(str);if ( oldpos<7 )str.Insert(str.Find(''-'',oldpos),'' '');SetWindowText(str);SetSel(FormatPos(oldpos,oldpos));}elseif ( oldpos==4 || oldpos==7 )return ;}elseCEdit::OnKeyDown(nChar, nRepCnt, nFlags);}
三、在对话框类中添加变量 CMyEdit,m_MyEdit,在初始化函数中添加动态子类化函数 :
m_MyEdit.SubclassDlgItem(IDC_EDIT,this);
为了演示一些其他问题,我添加了两个按钮子类化和反子类化。相关代码如下::
<
展开更多 50%)
分享

猜你喜欢

子类化:增强Edit控件为日期输入控件

C语言教程 C语言函数
子类化:增强Edit控件为日期输入控件

VC增强Edit控件为日期输入控件

编程语言 网络编程
VC增强Edit控件为日期输入控件

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

javascript版的日期输入控件(5)

电脑网络
javascript版的日期输入控件(5)

javascript版的日期输入控件(2)

电脑网络
javascript版的日期输入控件(2)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

javascript版的日期输入控件(3)

电脑网络
javascript版的日期输入控件(3)

javascript版的日期输入控件(4)

电脑网络
javascript版的日期输入控件(4)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

全面剖析VB.NET(5)

全面剖析VB.NET(5)

在jsp中发送email

在jsp中发送email
下拉加载更多内容 ↓