键盘精灵是指,当按下键盘上任意一个数字、字母或符号的时候,都会弹出“键盘精灵”,其类似于股票软件(如大智慧)中的。可以在这里面输入中英文和数字搜索您想要的东西。可以通过输入代码、名称或名称的汉语拼音首字母来搜索对应的商品(股票、基金、债券、指数等),按enter键进入相关页面。

个人理解,实现键盘精灵的几个关键点是CEdit和CListBox两个控件的关联,CEdit接收键盘输入,两者对enter键和上下方向键的 响应并显示相关页面,ClistBox对双击鼠标左键的响应并显示相关页面,以及何时显示和隐藏这两个控件。

下边是一些相关代码,是在SDI中手动添加这两个控件的,如果是基于CDialog的话,在消息响应函数和设置控件属性时操作就比较简单了。

1. 在view类.h文件中添加下面代码:

  1. CEdit         m_wndEditStock;    //EDIT控件 键盘精灵的东东
  2. CListBox      m_wndListBoxStock; //LIST控件  键盘精灵的东东
  3. afx_msg void OnChangeEditStockcode(); // 响应CEdit内容改变
  4. afx_msg void OnDblclkListStockcode(); // 响应CListBox 双击

2. 在view类.cpp文件的消息映射里添加下面的代码:

  1. ON_EN_CHANGE(IDE_EDIT_CODE, OnChangeEditStockcode)
  2. ON_LBN_DBLCLK(IDL_LIST_CODE_NAME, OnDblclkListStockcode)

3. 在view重载的OnInitialUpdate()函数中初始化控件,其中的rc和rc1是两个CRect,其位置自己可以随意定:

  1. m_wndEditStock.Create(
  2. WS_CHILD
  3. |WS_VISIBLE
  4. |WS_BORDER
  5. |WS_THICKFRAME
  6. |WS_TABSTOP
  7. |WS_CLIPCHILDREN
  8. |ES_UPPERCASE,
  9. rc, this, IDE_EDIT_CODE)
  10. m_wndListBoxStock.Create(
  11. WS_CHILD
  12. |WS_VISIBLE
  13. |LBS_HASSTRINGS
  14. |LBS_STANDARD
  15. |WS_THICKFRAME
  16. |LBS_NOINTEGRALHEIGHT
  17. |LBS_NOTIFY,
  18. rc1,  this, IDL_LIST_CODE_NAME)
  19. m_wndEditStock.ShowWindow(SW_HIDE);
  20. m_wndListBoxStock.BringWindowToTop();
  21. m_wndListBoxStock.ShowWindow(SW_HIDE);

4. view的cpp文件中添加消息响应函数 OnChangeEditStockcode和 OnDblclkListStockcode的实现部分。其中m_RelationArray是一个CArray<CString, CString&>派生类,这也是键盘精灵搜索的源资源 ,这个可以随意设计!

  1. // OnChangeEditStockcode函数
  2. {
  3. BOOL bFind = FALSE;
  4. CString szText;
  5. CString szCode;
  6. CString szName;
  7. CString szPyjc;
  8. CString szItem;
  9. long lCount = 0;
  10. m_wndEditStock.GetWindowText(szText);
  11. m_wndListBoxStock.ResetContent();
  12. int nSize = m_RelationArray.GetSize();
  13. if (szText == _T(""))
  14. {
  15. m_wndListBoxStock.ShowWindow(SW_HIDE); // Edit为空时,隐藏listbox
  16. return;
  17. }
  18. if (szText.GetLength() > 10)
  19. {
  20. szText = szText.Left(10);
  21. m_wndEditStock.SetWindowText(szText);
  22. m_wndListBoxStock.ShowWindow(SW_HIDE); // SW_HIDE
  23. return;
  24. }
  25. TCHAR ch = szText.GetAt(0);
  26. if (ch <= '9' && ch >= '0')
  27. {
  28. for (long i = 0; i < nSize; i++)
  29. {
  30. szCode = (m_RelationArray.GetAt(i)).CODE;
  31. if (szStockCode.Find(szText) == 0)
  32. {
  33. szName = (m_RelationArray.GetAt(i)).NAME;
  34. szItem =  szCode + _T("  ") + szName;
  35. m_wndListBoxStock.AddString(szItem);
  36. }
  37. }
  38. }
  39. else
  40. {
  41. m_wndListBoxStock.ShowWindow(SW_HIDE);
  42. return;
  43. }
  44. lCount = m_wndListBoxStock.GetCount();
  45. if (lCount <= 0)
  46. {
  47. m_wndListBoxStock.ShowWindow(SW_HIDE);
  48. }
  49. else
  50. {
  51. m_wndListBoxStock.ShowWindow(SW_SHOW);
  52. m_wndListBoxStock.SetCurSel(0);
  53. }
  54. }
  55. // OnDblclkListStockcode函数
  56. {
  57. CString szText;
  58. CString szName;
  59. CString szCode;
  60. m_wndListBoxStock.ShowWindow( SW_HIDE );
  61. m_wndEditStock.ShowWindow( SW_HIDE );
  62. long lIndex = m_wndListBoxStock.GetCurSel();
  63. if ( lIndex >= 0 )
  64. {
  65. m_wndListBoxStock.GetText( lIndex, szText );
  66. // do something with szText
  67. ... ...
  68. }
  69. }

5. view重载Onchar消息函数,在里面添加下面的代码,用于在CEdit中显示键盘输入的字符,这里只是响应了数字键和退格键。

  1. if  (((nChar >= '0' && nChar <= '9')||(nChar == VK_BACK)))
  2. {
  3. CWnd* pwnd = GetDlgItem(IDE_EDIT_CODE);
  4. if (pwnd !=NULL)
  5. {
  6. pwnd->SetFocus(); // 否则会仅仅显示一个字符
  7. CString str,temp;
  8. temp.Format(_T("%c"),nChar);
  9. pwnd->BringWindowToTop();
  10. pwnd->ShowWindow(SW_SHOW);
  11. pwnd->SetWindowText(temp);
  12. pwnd->GetWindowText(str);
  13. int length = str.GetLength();
  14. m_wndEditStock.SetSel(length,length);
  15. }
  16. }
  17. else
  18. this->SetFocus();

6. 在view重载的PreTranslateMessage中响应return键,其中在用上下方向键选择CListBox的item后响应return。

  1. if (pMsg->wParam == VK_RETURN)
  2. {
  3. HWND hWnd = ::GetFocus();
  4. if (GetDlgItem(IDE_EDIT_CODE)->GetSafeHwnd() == hWnd)
  5. {
  6. CString str;
  7. GetDlgItem(IDE_EDIT_CODE)->GetWindowText(str);
  8. //... ... 用得到的str做些事情
  9. GetDlgItem(IDE_EDIT_CODE)->SetWindowText(_T("")); // 设置CEdit为空,为下次接收键盘输入
  10. GetDlgItem(IDE_EDIT_CODE)->ShowWindow(SW_HIDE);
  11. this->SetFocus();
  12. }
  13. // 响应用上下键滚动 并回车选择
  14. if (GetDlgItem(IDL_LIST_CODE_NAME)->GetSafeHwnd() == hWnd)
  15. {
  16. CString szText,szCode;
  17. long lIndex = m_wndListBoxStock.GetCurSel();
  18. if ( lIndex >= 0 )
  19. {
  20. m_wndListBoxStock.GetText( lIndex, szText );
  21. // 用得到的szText做些事情
  22. }
  23. m_wndListBoxStock.ShowWindow(SW_HIDE);
  24. m_wndEditStock.ShowWindow(SW_HIDE);
  25. }
  26. }

以上代码参考了http://www.pudn.com/downloads305/sourcecode/app/detail1357832.html中的代码,在此向作者致意!

类似股软(大智慧)之键盘精灵的 vc2008--UNICODE 环境实现的更多相关文章

  1. 精灵类(CCSprite)

    一.对精灵的理解 玩家控制的主角.AI控制的NPC,以及地图上的宝箱.石块,甚至游戏主菜单的背景图片都是精灵.因此,可以这样认为,玩家看到的一切几乎都是由精灵构成的. 精灵不一定是静态的.通常,一个精 ...

  2. 使用 HTML5 input 类型提升移动端输入体验(键盘)

    在最近的项目中,策划老是要求我们弹出各种类型的键盘,特别是在iOS下,例如输入帐号的时候,不应该支持输入中文,该输入纯数字的时候就应该谈数字键盘等.个人觉得这些都是我们平时开发很少意识到的,虽然有些刁 ...

  3. js/jQuery实现类似百度搜索功能

    一.页面代码:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...

  4. linux系统下键盘按键的重新映射——xmodmap工具和xev工具

    大家会不会有时候,感觉键盘上的某几个键用起来不是很方便,打字打久了很容易手指头疼呢? 例如大家使用vim编辑器时, 经常需要使用到esc键,而该键在左上角,很不方便的.再比如写程序的时候,经常会使用到 ...

  5. .NET下如何拦截鼠标、键盘消息?Win32NET来帮你

    Win32NET是一个Win32API的.NET下封装的类库,包含: 1: 常用win32的API的net封装 2:鼠标.键盘.热键hook钩子模块, 3:模拟键盘输入文字(支持各种字符文字.不同语言 ...

  6. 几个常用的JS鼠标键盘事件例子

    首先普及一下鼠标左右键值的相关方法: 1.event.x 鼠标横轴  2.event.y 鼠标纵轴  3.event.keycode 键盘值  4.events.button==0 默认.没有按任何按 ...

  7. Linux实战教学笔记01:计算机硬件组成与基本原理

    标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...

  8. ubuntu入门

    Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...

  9. Ubuntu完全教程,让你成为Ubuntu高手!

    Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...

随机推荐

  1. [Golong]学习笔记(一) 基础知识

    Go编程基础 Go的内置keyword(25个) 不多 break default func interface select case defer go map struct chan else g ...

  2. 【Util】之——cookie

    拿走即用 使用前引入文件:http://files.cnblogs.com/ccto/util-cookie.js 使用方法: //设置cookie CookieUtil.set("name ...

  3. 自己写bootloader(一)

    bootloader功能目标:启动内核1.从Flash上把内核读入内存  1>读Flash:    a.NORFLASH:读内存    b.NANDFLASH:  2>初始化内存(SDRA ...

  4. Servlet/Filter发布后与其他页面的相对路径

    1.Servlet 3个文件 E:\web.workspace\mldndemo\WebContent\ch14\regist.html E:\web.workspace\mldndemo\WebCo ...

  5. LeetCode: Restore IP Addresses 解题报告

    Restore IP Addresses My Submissions Question Solution Given a string containing only digits, restore ...

  6. VBA学习笔记(4)--文件夹和文件遍历一层

    说明(2017.3.22): 1. '遍历指定文件夹里的文件 '遍历指定文件夹,返回第一层文件(不含文件夹) Public Sub test1() Dim k% Dim filename$ Dim p ...

  7. war 宽度变窄

    1.打开开始菜单-运行-输入Regedit 打开注册表编辑器 展开 HKEY_CURRENT_USER 继续展开 Software继续展开 Blizzard Entertainment 在Warcra ...

  8. 【C#】复制物体后,给副本命名的规则——用正则表达式

    需求:已经实现物体复制功能后,给新生成的副本进行命名. 问题:因为副本也能被复制,即副本的副本,所以复制品的命名规则会如下图所示. 尝试过用for循环和递归,发现在for循环内部递归返回的话会有问题, ...

  9. MySQL 时间戳(Timestamp)函数

    1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp() mysql> select current_timestamp, curren ...

  10. u-boot 2011.09 使用自己的board 以及config.h

    一个新的方案,用的UBOOT 可能和上一个方案是同一个,但是配置有可能不一样,今天记录一下通过修改配置文件使用新的 board 文件以及 config.h 进入 u-boot 2011.09 // 打 ...