欢迎使用CSDN-markdown编辑器

来源:互联网 发布:计量经济学软件 编辑:程序博客网 时间:2024/06/01 10:26

窗口退出了 但是 再次编译 链接时提示错误 在资源管理器中找到发现 进程没有关闭 解决方法 是在 onclose中加了exit(1); 网上有很多解法 但是这个最好用
另外 this->SetFocus ();的问题也解决了 使用exit(1); 这样 按键就不会再程序界面中输入了
原因应该是进程 线程这样的问题 C++ 太博大精深了 操作系统一定要学习一下

另外 按键事件的响应 是继承了 基础类
BOOL CJStickConDlg::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_UP:         //按下前键            break;    case VK_DOWN:       //按下后键            break;    case VK_LEFT:       //按下左键            break;    case VK_RIGHT:      //按下右键            break;    case VK_SHIFT:        OnBrake();            break;        case 87:            /*/AfxMessageBox(_T("w按下"));            break;*/        case 83:            //AfxMessageBox(_T("s按下"));            break;        case 65:            //AfxMessageBox(_T("a按下"));            break;        case 68:            /*/AfxMessageBox(_T("d按下"));            break;*/        case 81:            break;    default:        break;    }}return CDialog::PreTranslateMessage(pMsg);

}
WM_KEYDOWN VM_KEYUP VM_KEYPRESS 三个事件

WM_KEYDOWN、WM_KEYUP等他们分别对应OnChar、OnKeyDown、OnKeyUp消息处理函数;当然在有些时候我们也可能需要用到对PreTranslateMessage函数的重载。从这些事件的名称我们可以看出WM_CHAR表示字符事件,WM_KEYDOWN表示键盘的键被按下时事件,而WM_KEYUP则表示键盘的键被放开时的事件;我们在键盘上按
下某个键时系统先调用OnKeyDown函数接着调用OnChar函数最后调用OnKeyUp函数;
这些消息函数的原形如下:

afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);

afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);

nChar代表虚拟键,nRepCnt代表重复次数;而对于nFlags则有点麻烦但大多数时候我们不管这个参数,nFlags的具体意义请参考MSDN相关文档。在大多数时候我们只要用到OnChar、OnKeyDown、OnKeyUp这些消息处理函数就够了,但有时候我们会发理这些函数并不会被调用(特别是对话框程序)这时我们就必需去重载PreTranslateMessage函数;些函数的使用也比较简单但在处理组合按键时我们必需用到相键盘消息被拦截而得不到正常响应,其中的关键就是Run函数对消息的预处理。在Run函数中,调用了函数CWinThread::PumpMessage,就是利用这一函数,MFC实现了对消息的分流,使得消息沿着MFC对各种消息规定的路线流动,直到被正确响应。
函数PumpMessage调用了函数CWinThread::PreTranslateMessage对消息进行处理,如果该函数不对消息进行处理,则调用API函数TranslateMessage函数将虚拟键消息转换为字符消息并调用DispatchMessage分发消息给窗口处理程序。在对话框中,程序用CWinThread::PreTranslateMessage函数处理了键盘消息,所以对话框程序是否要响应键盘消
息,将完全由CWinThread::PreTranslateMessage函数来决定了。

在CWnd及其派生类的成员函数PreTranslateMessage函数是一个虚函数,可以通过重

载来改变其处理过程。在默认情况下,没有重载这一函数。

0 0
原创粉丝点击