类似股软(大智慧)之键盘精灵的 vc2008--UNICODE 环境实现

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

 

个人理解,实现键盘精灵的几个关键点是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 环境实现)