参见:http://www.vccode.com/file_show.php?id=2226
以前我自己也做过类似的程序,原理与此相同,所不同的是我的每个数组元素间的进制是10,而这个程序用1,000,000做进制,好!!
下面是初级的讨论,不要见笑,我不太懂MFC。
我想使得这个程序在文本框中敲回车与按下按钮作用相同。这个很自然的想法。按照VB的思路,我找到此文本框的可用事件,根本没有onkeypress之类的东西。心想:这么基本的东西都不会,岂不太那啥了。
找到半天材料,才知道有两条路可走:
1、重写OnOK(),因为在当前窗体上在任何文本框(?有个别例外)上按下回车时都会执行这个方法。因为这个例子中只有一个能接收回车的文本框,自然可直接调用方法即可。但如果有多个呢,用什么区分呢?答案是:GetFocus()会返回当前的焦点元素,做判别就行了,代码:
void CBigDateDlg::OnOK()
{
if (GetFocus() == GetDlgItem(IDC_VALUE))
this->OnCalculate();
}
2、上一个方法不通用,所以不推荐使用,最好用下面的方法:重写PreTranslateMessage(MSG* pMsg)!! 不再表述,代码如下:
BOOL CBigDateDlg::PreTranslateMessage(MSG* pMsg)
{
// 处理IDC_VALUE的消息
if (pMsg->hwnd == GetDlgItem(IDC_VALUE)->GetSafeHwnd())
{
// 避免右键菜单
if (pMsg->message == WM_RBUTTONUP || pMsg->message == WM_CONTEXTMENU)
return true;
// 考虑用户在该文本框中按回车的情况
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
{
CWnd* aw = this->GetFocus();
((CEdit*)aw)->SetSel(0, -1); // 同时,选中文本框中所有的文本,更方便于使用!!
this->OnCalculate();
}
}
return CDialog::PreTranslateMessage(pMsg);
}
通过这个例子,我开始有点理解消息循环的含义了。
Good luck!!