从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]MFC的BUTTON控件响应鼠标按下和抬起

有效方法:BOOL CButtontestDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here a...
  • hicoder
  • hicoder
  • 2010年05月26日 19:36
  • 7412

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

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

VC/MFC按钮(CButton)控件

1如何在按钮控件上显示图片  首先确定你要显示在按钮控件的图片类型是什么,这里我是ico图标,由于要在按钮里显示ico图标,所以要把按钮控件的属性改一下, 方法是右击按钮控件,选择属性,单...
  • zyrr159487
  • zyrr159487
  • 2011年12月19日 16:45
  • 3114

MFC按钮控件Button按下和弹起事件实现示例

MFC按钮控件Button按下和弹起事件实现示例
  • m0_37901643
  • m0_37901643
  • 2017年07月20日 11:15
  • 2018

【Unity3D】【NGUI】处理Button的按下状态?

提供一个脚本,会不会用就看各位的造化了。 MonoBehaviour SZUIPressedButton: using UnityEngine; using System.Collections.G...
  • u012091672
  • u012091672
  • 2013年11月28日 23:04
  • 3841

学习笔记(七):MFC中按钮的抬起和按下

在MFC中添加按钮的按下的事件很方便,在控件菜单中Add Event Handler Wizard添加BN_CLICKED消息响应函数即可。 但按钮的抬起却没有现成的消息函数可添加,我们可以重写(ov...
  • qq_22671705
  • qq_22671705
  • 2015年10月13日 09:11
  • 2240

VC++中独立捕获按钮按下和抬起两个动作

1 由来 现实世界中的按钮的动作为:按下后只要不松手就一直处于被按下状态,此时会执行开关闭合等类似的行为;松开手后,按钮抬起,执行开关断开等类似行为。VC++中默认的按钮的外观行为与物理按钮类似,也是...
  • smstong
  • smstong
  • 2014年02月12日 00:53
  • 12142

MFC 为按钮(CButton )添加位图

MFC 为按钮(CButton )添加位图 具体步骤如下: 1.  在对话框上拖放一个按钮(CButton)控件,并修改ID(如:IDC_BUTTON_REMOVEWAVHEAD); 2.  在对话框...
  • lsk1124981644
  • lsk1124981644
  • 2015年02月13日 08:56
  • 1125

MFC-自绘控件(CButton篇)

一、CButton-自绘按钮 头文件 #pragma once #include "afxwin.h" class CMyButton : public CButton { public: C...
  • wyansai
  • wyansai
  • 2016年03月24日 15:12
  • 1895

MFC重绘控件篇---按钮CButton

讲解地址:    【按钮CButton】控件应用第二课    【按钮CButton】控件应用第三课    【按钮CButton】控件应用第四课    【按钮CButton】...
  • gym1039
  • gym1039
  • 2013年10月04日 09:02
  • 2515
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从CButton派生一个可检测按下状态和定时重复发送消息的按钮控件
举报原因:
原因补充:

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