想要实现长按键的一些控制,查了查可以通过捕获键盘事件,然后处理按键时需要进行的操作。下面简单的实现左右按键界面更新数值加减。

 1. 重载PreTranslateMessage(MSG* pMsg)函数,在函数中捕获键盘事件并处理响应:

BOOL CEditTestDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_RIGHT)
{
tmp++;
m_value.Format(_T("%d"),tmp);
GetDlgItem(IDC_EDIT1)->SetWindowText(m_value);
return TRUE;
}
if (pMsg->wParam == VK_LEFT)
{
tmp--;
m_value.Format(_T("%d"),tmp);
GetDlgItem(IDC_EDIT1)->SetWindowText(m_value);
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}

以前一直使用UpdateData()函数更新,但是这次发现GetDlgItem()更适合现在的情况,只更新该控件而不会刷新其他数据。

2. 以上已经可以实现,但是如果想调整多久算长按,那可以通过定时器来实现:

重载PreTranslateMessage(MSG* pMsg)函数

BOOL CEditTestDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
this->SetTimer(,,NULL);
m_bKeyDown = TRUE;
if (pMsg->wParam == VK_RIGHT)
{
m_bRight = TRUE;
return TRUE;
}
if (pMsg->wParam == VK_LEFT)
{
m_bLeft = TRUE;
return TRUE;
}
}
else if (pMsg->message == WM_KEYUP)
{
m_bRight = FALSE;
m_bLeft = FALSE;
m_bKeyDown = FALSE;
KillTimer();
}
return CDialog::PreTranslateMessage(pMsg);
}

定时器处理:

void CEditTestDlg::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent)
{
case :
……
case :
if (m_bKeyDown)
{
if (m_bLeft)
{
tmp--;
m_value.Format(_T("%d"),tmp);
GetDlgItem(IDC_EDIT1)->SetWindowText(m_value);
//UpdateData(FALSE);
}
if (m_bRight)
{
tmp++;
m_value.Format(_T("%d"),tmp);
GetDlgItem(IDC_EDIT1)->SetWindowText(m_value);
//UpdateData(FALSE);
}
}
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}

这样按键响应会更快,但是自带的定时器精度不够高,也可以通过自己实现高精度定时器来控制。

注意:处理按键消息时间以后,需要返回TRUE,不然对话框任然会响应该按键消息,至于PreTranslateMessage(MSG* pMsg)对消息的捕获和屏蔽以及返回值的意义见:

MFC之CToolTipCtrl按钮提示(消息捕获和消息传递)

MFC之按键消息(长按处理)的更多相关文章

  1. Android通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS监听Home按键消息

    Android对屏幕下方经常使用的四个按键消息处理是不一致的: 1.搜索按键的消息在onKeyDown或者onKeyUp中接收: 2.菜单按键的消息在onCreateOptionsMenu.onKey ...

  2. 学习windows编程 day5 之按键消息

    case WM_KEYDOWN://带sys的按键消息大多是系统需要自己处理的,我们一般不需要,默认处理 //wParam 指定按键的虚拟键代码 //lParam 指定技术,扫描码,闲钱状态,转换状态 ...

  3. MFC 三种消息

    在MFC应用程序中传输的消息有三种类型:窗口消息.命令消息和控件通知. (1)窗口消息:WM_XXX 窗口消息(Window Message)一般与窗口的内部运作有关,如:创建窗口.绘制窗口和销毁窗口 ...

  4. 【CC2530强化实训02】普通延时函数实现按键的长按与短按

    [CC2530强化实训02]普通延时函数实现按键的长按与短按 [题目要求]      用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法.使用定时器的间隔定时来计算按键按下的时间是通用的做法 ...

  5. 【CC2530强化实训01】普通延时函数实现按键的长按与短按

    [CC2530强化实训01]普通延时函数实现按键的长按与短按 [题目要求]     用一个按键实现长按与短按的功能已经是很多嵌入式产品的常用手法.使用定时器的间隔定时来进行按键按下的时间是通用的做法, ...

  6. SDK_按键消息的拦截

    按键消息的拦截 拦截是为了在原有功能的基础上增加自己的操作 扩展:当按钮接收到点击消息的时候,响应的是WM_LBUTTONDOWN消息,按钮的会被这个消息打包成一个WM_COMMAND 消息发送给父窗 ...

  7. Formview单文档或对话框项目接受不到按键消息的解决办法

    当对话框或formview界面上有控件时,由于焦点在控件上,因此wm_char,wm_keydown等按键消息会被控件捕获,而导致对话框或formview无法接受该类按键消息.这时候通常的解决方法是在 ...

  8. PreTranslateMessage()函数捕获键盘按键消息

    01. PreTranslateMessage函数,常用于屏蔽MFC对话框中默认的Enter和ESC消息 函数原型:BOOL PreTranslateMessage(MSG* pMsg) 用法举例: ...

  9. MFC中添加消息响应函数

    转自:http://blog.csdn.net/eddy_liu/article/details/8474677 目前,用MFC设计的Windows应用程序几乎都采用文档/视图结构.这种程序框架与简单 ...

随机推荐

  1. 针对Yii框架的nginx配置

    我曾经针对yii制作了 个nginx配置,其中包括了以下几项内容: rewrite规则(try_file),需要nginx0.8.6版本以上支持. 针对于icon, robots.txt文件的日志优化 ...

  2. 数据结构 - 求二叉树中结点的最大距离(C++)

    // ------BTreeMaxNodeLength.cpp------ #include <iostream> using namespace std; template <cl ...

  3. 再探Java基础——String.format(String format, Object… args)的使用

    最近看到类似这样的一些代码:String.format("参数%s不能为空", "birthday"); 以前还没用过这功能不知咐意思,后研究了一下,详细讲解如 ...

  4. 多重背包之 HDU -1171Big Event in HDU &HDU -2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    这两道题都是多重背包的基础题,前面的安格题意是:给出每个物体的价值和物体的数量,如何分使得A,B所得价值最接近并且A的价值不能小于B,就类似于NYOJ上的那个邮票分你一半那个意思,只不过这里不是一个而 ...

  5. poj 2823 Sliding Window(单调队列)

    /* 裸地单调队列.. 第一次写 写的好丑.... */ #include<iostream> #include<cstdio> #include<cstring> ...

  6. JS类百度的动态提示框思路及完成

    参考的代码来自这里: http://www.jb51.net/article/28075.htm 不过说实话,这个网站太烂了,不适合看代码,另外写代码的人是个大牛,但是却没有模块化思想,所以朕不高兴直 ...

  7. (转)DevExpress GridView属性设置

    GirdControl是数据的容器,它包含多种显示方式,GridView则是一种二维表格视图. 绑定数据源: List<Student> list = new List<Studen ...

  8. (转)解析php中die(),exit(),return的区别

    本篇文章是对php中die(),exit(),return的区别进行了详细的分析介绍,需要的朋友参考下     die()停止程序运行,输出内容exit是停止程序运行,不输出内容return是返回值d ...

  9. HTML5 microdata

    schema.org 测试地址 http://www.google.com/webmasters/tools/richsnippets

  10. CentOS安装JDK7

    1.下载jdk-7-linux-x64.rpm(http://www.Oracle.com/technetwork/java/javase/downloads/java-se-jdk-7-downlo ...