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

个人理解,实现键盘精灵的几个关键点是CEdit和CListBox两个控件的关联,CEdit接收键盘输入,两者对enter键和上下方向键的 响应并显示相关页面,ClistBox对双击鼠标左键的响应并显示相关页面,以及何时显示和隐藏这两个控件。
下边是一些相关代码,是在SDI中手动添加这两个控件的,如果是基于CDialog的话,在消息响应函数和设置控件属性时操作就比较简单了。
1. 在view类.h文件中添加下面代码:
- CEdit m_wndEditStock; //EDIT控件 键盘精灵的东东
- CListBox m_wndListBoxStock; //LIST控件 键盘精灵的东东
- afx_msg void OnChangeEditStockcode(); // 响应CEdit内容改变
- afx_msg void OnDblclkListStockcode(); // 响应CListBox 双击
2. 在view类.cpp文件的消息映射里添加下面的代码:
- ON_EN_CHANGE(IDE_EDIT_CODE, OnChangeEditStockcode)
- ON_LBN_DBLCLK(IDL_LIST_CODE_NAME, OnDblclkListStockcode)
3. 在view重载的OnInitialUpdate()函数中初始化控件,其中的rc和rc1是两个CRect,其位置自己可以随意定:
- m_wndEditStock.Create(
- WS_CHILD
- |WS_VISIBLE
- |WS_BORDER
- |WS_THICKFRAME
- |WS_TABSTOP
- |WS_CLIPCHILDREN
- |ES_UPPERCASE,
- rc, this, IDE_EDIT_CODE)
- m_wndListBoxStock.Create(
- WS_CHILD
- |WS_VISIBLE
- |LBS_HASSTRINGS
- |LBS_STANDARD
- |WS_THICKFRAME
- |LBS_NOINTEGRALHEIGHT
- |LBS_NOTIFY,
- rc1, this, IDL_LIST_CODE_NAME)
- m_wndEditStock.ShowWindow(SW_HIDE);
- m_wndListBoxStock.BringWindowToTop();
- m_wndListBoxStock.ShowWindow(SW_HIDE);
4. view的cpp文件中添加消息响应函数 OnChangeEditStockcode和 OnDblclkListStockcode的实现部分。其中m_RelationArray是一个CArray<CString, CString&>派生类,这也是键盘精灵搜索的源资源 ,这个可以随意设计!
- // OnChangeEditStockcode函数
- {
- BOOL bFind = FALSE;
- CString szText;
- CString szCode;
- CString szName;
- CString szPyjc;
- CString szItem;
- long lCount = 0;
- m_wndEditStock.GetWindowText(szText);
- m_wndListBoxStock.ResetContent();
- int nSize = m_RelationArray.GetSize();
- if (szText == _T(""))
- {
- m_wndListBoxStock.ShowWindow(SW_HIDE); // Edit为空时,隐藏listbox
- return;
- }
- if (szText.GetLength() > 10)
- {
- szText = szText.Left(10);
- m_wndEditStock.SetWindowText(szText);
- m_wndListBoxStock.ShowWindow(SW_HIDE); // SW_HIDE
- return;
- }
- TCHAR ch = szText.GetAt(0);
- if (ch <= '9' && ch >= '0')
- {
- for (long i = 0; i < nSize; i++)
- {
- szCode = (m_RelationArray.GetAt(i)).CODE;
- if (szStockCode.Find(szText) == 0)
- {
- szName = (m_RelationArray.GetAt(i)).NAME;
- szItem = szCode + _T(" ") + szName;
- m_wndListBoxStock.AddString(szItem);
- }
- }
- }
- else
- {
- m_wndListBoxStock.ShowWindow(SW_HIDE);
- return;
- }
- lCount = m_wndListBoxStock.GetCount();
- if (lCount <= 0)
- {
- m_wndListBoxStock.ShowWindow(SW_HIDE);
- }
- else
- {
- m_wndListBoxStock.ShowWindow(SW_SHOW);
- m_wndListBoxStock.SetCurSel(0);
- }
- }
- // OnDblclkListStockcode函数
- {
- CString szText;
- CString szName;
- CString szCode;
- m_wndListBoxStock.ShowWindow( SW_HIDE );
- m_wndEditStock.ShowWindow( SW_HIDE );
- long lIndex = m_wndListBoxStock.GetCurSel();
- if ( lIndex >= 0 )
- {
- m_wndListBoxStock.GetText( lIndex, szText );
- // do something with szText
- ... ...
- }
- }
5. view重载Onchar消息函数,在里面添加下面的代码,用于在CEdit中显示键盘输入的字符,这里只是响应了数字键和退格键。
- if (((nChar >= '0' && nChar <= '9')||(nChar == VK_BACK)))
- {
- CWnd* pwnd = GetDlgItem(IDE_EDIT_CODE);
- if (pwnd !=NULL)
- {
- pwnd->SetFocus(); // 否则会仅仅显示一个字符
- CString str,temp;
- temp.Format(_T("%c"),nChar);
- pwnd->BringWindowToTop();
- pwnd->ShowWindow(SW_SHOW);
- pwnd->SetWindowText(temp);
- pwnd->GetWindowText(str);
- int length = str.GetLength();
- m_wndEditStock.SetSel(length,length);
- }
- }
- else
- this->SetFocus();
6. 在view重载的PreTranslateMessage中响应return键,其中在用上下方向键选择CListBox的item后响应return。
- if (pMsg->wParam == VK_RETURN)
- {
- HWND hWnd = ::GetFocus();
- if (GetDlgItem(IDE_EDIT_CODE)->GetSafeHwnd() == hWnd)
- {
- CString str;
- GetDlgItem(IDE_EDIT_CODE)->GetWindowText(str);
- //... ... 用得到的str做些事情
- GetDlgItem(IDE_EDIT_CODE)->SetWindowText(_T("")); // 设置CEdit为空,为下次接收键盘输入
- GetDlgItem(IDE_EDIT_CODE)->ShowWindow(SW_HIDE);
- this->SetFocus();
- }
- // 响应用上下键滚动 并回车选择
- if (GetDlgItem(IDL_LIST_CODE_NAME)->GetSafeHwnd() == hWnd)
- {
- CString szText,szCode;
- long lIndex = m_wndListBoxStock.GetCurSel();
- if ( lIndex >= 0 )
- {
- m_wndListBoxStock.GetText( lIndex, szText );
- // 用得到的szText做些事情
- }
- m_wndListBoxStock.ShowWindow(SW_HIDE);
- m_wndEditStock.ShowWindow(SW_HIDE);
- }
- }
以上代码参考了http://www.pudn.com/downloads305/sourcecode/app/detail1357832.html中的代码,在此向作者致意!
类似股软(大智慧)之键盘精灵的 vc2008--UNICODE 环境实现的更多相关文章
- 精灵类(CCSprite)
一.对精灵的理解 玩家控制的主角.AI控制的NPC,以及地图上的宝箱.石块,甚至游戏主菜单的背景图片都是精灵.因此,可以这样认为,玩家看到的一切几乎都是由精灵构成的. 精灵不一定是静态的.通常,一个精 ...
- 使用 HTML5 input 类型提升移动端输入体验(键盘)
在最近的项目中,策划老是要求我们弹出各种类型的键盘,特别是在iOS下,例如输入帐号的时候,不应该支持输入中文,该输入纯数字的时候就应该谈数字键盘等.个人觉得这些都是我们平时开发很少意识到的,虽然有些刁 ...
- js/jQuery实现类似百度搜索功能
一.页面代码:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...
- linux系统下键盘按键的重新映射——xmodmap工具和xev工具
大家会不会有时候,感觉键盘上的某几个键用起来不是很方便,打字打久了很容易手指头疼呢? 例如大家使用vim编辑器时, 经常需要使用到esc键,而该键在左上角,很不方便的.再比如写程序的时候,经常会使用到 ...
- .NET下如何拦截鼠标、键盘消息?Win32NET来帮你
Win32NET是一个Win32API的.NET下封装的类库,包含: 1: 常用win32的API的net封装 2:鼠标.键盘.热键hook钩子模块, 3:模拟键盘输入文字(支持各种字符文字.不同语言 ...
- 几个常用的JS鼠标键盘事件例子
首先普及一下鼠标左右键值的相关方法: 1.event.x 鼠标横轴 2.event.y 鼠标纵轴 3.event.keycode 键盘值 4.events.button==0 默认.没有按任何按 ...
- Linux实战教学笔记01:计算机硬件组成与基本原理
标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...
- ubuntu入门
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
- Ubuntu完全教程,让你成为Ubuntu高手!
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
随机推荐
- 字符编码:ASCII,Unicode,UTF-8
1.ASCII码美国制定的一套字符编码,对英语字符和二进制位之间的关系,做了统一规定.ASCII码一共规定了128个字符(包括32个不能打印出来的控制符号)的编码,占用一个字节,字节的最前面1位统一为 ...
- nyoj138 哈希的简单应用(查找)
找球号(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=1 ...
- 中文转Punycode
package cn.cnnic.ops.udf; public class GetPunycodeFromChinese { static int TMIN = 1; static int TMAX ...
- 【转】Oozie4.2.0配置安装实战
什么是Oozie? Oozie是一种Java Web应用程序,它运行在Java servlet容器——即Tomcat——中,并使用数据库来存储以下内容: 工作流定义 当前运行的工作流实例,包括实例的状 ...
- macOS Sierra 10.12.4 (16E195) - Clover [ 20170403 ]
原文:https://user.qzone.qq.com/753313822/blog/1424460141?_t_=0.48652242555134495 建议使用 1920 * 1080 屏幕分辨 ...
- tomcat架构分析(概览)
出处:http://gearever.iteye.com Tomcat是目前应用比较多的servlet容器.关于tomcat本身的特点及介绍,网上已经有很多描述了,这里不再赘述.Tomcat除了能够支 ...
- html5 canvas实现图片玻璃碎片特效
今天要为大家带来一款html5 canvas实现的图片玻璃碎片特效.图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息.效果图如下: 在线预览 源码下载 实现代码: html代码: & ...
- 汇编入门学习笔记 (九)—— call和ret
疯狂的暑假学习之 汇编入门学习笔记 (九)-- call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据 ...
- kubernetes 调度相关
nodeAffinity(主机亲和性),podAffinity(POD亲和性)以及podAntiAffinity(POD反亲和性) nodeAffinity使用场景 : ● 将S1服务的所有Pod部署 ...
- jquery方法操作iframe元素
操作iframe父元素 $("#rolesCtl",parent.document).find( 'button' ).trigger( 'click' ); 在父页面获取ifra ...