1. Can’t open include feli:。。 。。。
2. CDialog 中响应键盘消息的 OnKeyDown 函数没反应。结论是 CDialog 不响应 OnKeyDown, 相应的解决方法是: BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN) { switch (pMsg->wParam) { case VK_LEFT: break; case VK_RIGHT:
break; case VK_UP: break; case VK_DOWN: break; } } return CDialog::PreTranslateMessage(pMsg); } 经过仔细研究发现 CDialog 是相应对应消息的 OnKeyDown 函数的,只是这个消息在到达窗 体之前,已经被它的子控件捕获了,如果将窗体中的所有控件都删除,窗体就会捕获到这个
消息,但要注意的是,MFC 为了实现在窗体上切换子控件的焦点,已经将 VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN 进行了处理,同时 VK_RETURN 也被
系统捕获用来处理相应的确定事件,所以即使窗体中没控件,这几个键还是无法捕获,暂时 只能用 PreTranslateMessage 解决。 一个窗体仅在它没有可视和有效的控件时。响应 OnKeyDown。
下面是一个将 TAB 键的功能用 Enter 键实现的函数
void Myedit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default if (nChar= = VK_RETURN)
{ CDialog* Pwnd=(CDialog*)GetParent() ;//取得对话框指针 Pwnd->NextDlgCtrl( ); //切换到下一个输入焦点 } CEditView::OnKeyDown(nChar, nRepCnt, nFlags); }
UINT nChar 指定被给键的虚拟键,例如 VK_RETURN
UINT nRepCnt : 重复计数是该消息所表示的击键次数,大多数情况下,重复计数是 1.不过,如果按下一个键之 后,您的窗口过程不够快,以致不能处理自动重复速率下的按键消息,windows 就把几个 wm_keydown 或者 wm_syskeydown 消息组合到单个消息中,并相应的增加重复计
数.wm_keyup 或 wm_keysysup 的重复计数总是为 1 UINT nFlags 用于传递按键的其它一些信息,如扫描码,上一次按键状态等。具体如下: 字节 说明 0-7 键盘扫描码 8 此按键为扩充按键,如 F1,F12 等功能键,此字节等于 1 时为真 9-12 保留 13 此字节为 1 表示按下键的同时,ALT 键也被按住了 14 前一个按键状态。此字节为 1 代表信息在按键被按下之前就送出来了 15 此字节为 1 表示这个按键已经被放开了,反之就表示还被按着
3. Can’t open precompiled header file:。。 。。。pch