类似股软(大智慧)之键盘精灵的 vc2008--UNICODE 环境实现
2013-07-26 01:14
417 查看
键盘精灵是指,当按下键盘上任意一个数字、字母或符号的时候,都会弹出“键盘精灵”,其类似于股票软件(如大智慧)中的。可以在这里面输入中英文和数字搜索您想要的东西。可以通过输入代码、名称或名称的汉语拼音首字母来搜索对应的商品(股票、基金、债券、指数等),按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中的代码,在此向作者致意!
个人理解,实现键盘精灵的几个关键点是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 环境实现
- Win7环境使用VC2008编写DLL实现键盘钩子
- VC2008以资源形式实现多语言版本(非Unicode)
- 第一个wxWidgets Demo简单实现,及VC2008下的环境设置!
- VC2008环境下编译CPPUNIT单元测试工具
- 嵌入式SQL程序的VC+SQL server 2000实现的环境配置
- 备忘: 貌似安装vc2008以后,装sql2005会出现安装不了sql的开发环境的情况 TODO
- VC2008下多线程环境中AfxGetMainWnd()返回空指针问题及解决方法
- 键盘记录及自动发送VC++实现(上)
- 键盘记录及自动发送VC++实现(下)
- 利用《双缓冲技术及其在VC的GDI环境下的实现》理解armv7计数器中的双缓冲技术
- 【转】VC2008 配置OpenGL环境
- vc++实现Inline hook KeyboardClassServiceCallback实现键盘记录
- VC 程序员的阵痛--将多字节环境移植到Unicode环境
- VC环境中调用TeeChart控件实现数据曲线分析
- VC.net环境下轻松实现DLL编程
- VC++实现监视系统的键盘操作 创建记录键盘动作的全局钩子DLL
- windows环境下unicode编程总结c++/vc
- VC++环境下利用管道和线程实现进程间通信
- 单链表的实现(VC2008下通过测试)