从CButton派生一个可检测按下状态和定时重复发送消息的按钮控件

原创 2017年05月09日 00:03:59



// PressButton.h : header file
//
#pragma once

/////////////////////////////////////////////////////////////////////////////
// CPressButton window

class CPressButton : public CButton
{
  // Construction
public:
  CPressButton();
  
  // Attributes
public:
  UINT m_RepeateIntTick; //重复间隔ms =0时不重复
  BOOL m_bIsPressedFlag; //按下标记?

  // Operations
public:
  
  // Overrides
  // ClassWizard generated virtual function overrides
  //{{AFX_VIRTUAL(CPressButton)
  //}}AFX_VIRTUAL
  
  // Implementation
public:
  virtual ~CPressButton();
  
  // Generated message map functions
protected:
  //{{AFX_MSG(CPressButton)
  afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  afx_msg void OnTimer(UINT nIDEvent);
  afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
  //}}AFX_MSG
  
  DECLARE_MESSAGE_MAP()
    
protected:
  BOOL m_bTimeStarted; //定时器已启动?  
  void BeginClickEvent(); //处理按下事件
  void EndClickEvent(); //处理抬起事件
  void PostClickMsg(); //发送消息
};

/////////////////////////////////////////////////////////////////////////////


// PressButton.cpp : implementation file

#include "stdafx.h"
#include "PressButton.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPressButton

CPressButton::CPressButton()
{
  m_bIsPressedFlag = FALSE;
  m_bTimeStarted = FALSE;
  m_RepeateIntTick = 1000; //重复间隔ms
}

CPressButton::~CPressButton()
{
}


BEGIN_MESSAGE_MAP(CPressButton, CButton)
//{{AFX_MSG_MAP(CPressButton)
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDOWN()
ON_WM_TIMER()
ON_WM_KEYDOWN()
ON_WM_KEYUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPressButton message handlers

void CPressButton::OnLButtonUp(UINT nFlags, CPoint point) 
{
  // TODO: Add your message handler code here and/or call default
  EndClickEvent();
  CButton::OnLButtonUp(nFlags, point);
}

void CPressButton::OnLButtonDown(UINT nFlags, CPoint point) 
{
  // TODO: Add your message handler code here and/or call default
  BeginClickEvent();  
  CButton::OnLButtonDown(nFlags, point);
}

void CPressButton::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
  // TODO: Add your message handler code here and/or call default
  BeginClickEvent();
  CButton::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CPressButton::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
  // TODO: Add your message handler code here and/or call default
  EndClickEvent();
  CButton::OnKeyUp(nChar, nRepCnt, nFlags);
}

void CPressButton::OnTimer(UINT nIDEvent) 
{
  // TODO: Add your message handler code here and/or call default
  if(nIDEvent == 1)
  {
    PostClickMsg();
  }
  
  CButton::OnTimer(nIDEvent);
}

void CPressButton::BeginClickEvent()
{
  if(!m_bIsPressedFlag)    
  {
    PostClickMsg();
    SetCapture();
    m_bIsPressedFlag = TRUE;
  }
  
  if((!m_bTimeStarted) && m_RepeateIntTick > 0)
  {    
    SetTimer(1, m_RepeateIntTick, NULL);
    m_bTimeStarted = TRUE;
  }  
}

void CPressButton::EndClickEvent()
{
  if(m_bTimeStarted)
  {
    KillTimer(1);
    m_bTimeStarted = FALSE;
  }
  
  if(m_bIsPressedFlag)
  {    
    ReleaseCapture();
    m_bIsPressedFlag = FALSE;
  }
}

void CPressButton::PostClickMsg()
{
  GetParent()->PostMessage(WM_COMMAND, 
    MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd);
}



相关文章推荐

使用MFC 发送消息模拟按钮按下事件

有时我们需要这么做, 手动模拟按钮按下的事件, 让程序做出与按钮真的按下时一样的响应.    设按钮ID为ID_BTN_OK, 当前Dialog窗口.    实际上系统并不能区分按钮是真的按下了(...

使用MFC 发送消息模拟按钮按下事件

有时我们需要这么做, 手动模拟按钮按下的事件, 让程序做出与按钮真的按下时一样的响应.    设按钮ID为ID_BTN_OK, 当前Dialog窗口.    实际上系统并不能区分按...

使用MFC 发送消息模拟按钮按下事件

有时我们需要这么做, 手动模拟按钮按下的事件, 让程序做出与按钮真的按下时一样的响应.    设按钮ID为ID_BTN_OK, 当前Dialog窗口.    实际上系统并不能区分按钮是真的...

使用MFC 发送消息模拟按钮按下事件

有时我们需要这么做, 手动模拟按钮按下的事件, 让程序做出与按钮真的按下时一样的响应.    设按钮ID为ID_BTN_OK, 当前Dialog窗口.    实际上系统并不能区分按钮是真的按下了(...

使用MFC 发送消息模拟按钮按下事件

有时我们需要这么做, 手动模拟按钮按下的事件, 让程序做出与按钮真的按下时一样的响应.    设按钮ID为ID_BTN_OK, 当前Dialog窗口.   实际上系统并不能区分按钮是真的按下了(如用...

使用MFC 发送消息模拟按钮按下事件

有时我们需要这么做, 手动模拟按钮按下的事件, 让程序做出与按钮真的按下时一样的响应.    设按钮ID为ID_BTN_OK, 当前Dialog窗口.    实际上系统并不能区分按钮是真的...

vc 按钮控件数组按下弹起消息响应

  • 2017年03月10日 09:32
  • 21.3MB
  • 下载

CButton控件:MFC如何给按钮添加图片,显示三种状态,分别是点击、盘旋、初始状态(不点击也不盘旋状态)。

如何给按钮添加图片,显示三种状态,点击、盘旋、初状态。 首先准备好3张不同状态的bmp格式图片。 例如:           以下我利用vs2013示范一下。 1.创建MFC工程(基本对话框),点击...

VC下利用Picture控件实现png图片按钮(鼠标初始、按下、松开、获得焦点四种状态)

http://www.chinadev.cn 工程源码:http://download.csdn.net/detail/zzzili/4186684     /****************...
  • zzzili
  • zzzili
  • 2012年03月30日 14:41
  • 2620

[MFC]传统控件介绍、CButton按钮类

1. 控件的概念:     1) 控件是一类特殊的窗口,如按钮、文本框之类的,用来将信息传送给用户或获取用户的输入;     2) 控件都是一些高度封装好的对象,有自己的WM_PAINT处理代码,不必...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从CButton派生一个可检测按下状态和定时重复发送消息的按钮控件
举报原因:
原因补充:

(最多只允许输入30个字)