您的位置:首页 > 其它

类似股软(大智慧)之键盘精灵的 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中的代码,在此向作者致意!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: