工序打扎流程(自定义按钮移动、群响应。)

代码
一、自定义按钮RFMSStepButton :
//////////////RFMSStepButton.h

#pragma once
class RFMSStepButton : public CButton
{
DECLARE_DYNAMIC(RFMSStepButton)

public:
RFMSStepButton();
virtual ~RFMSStepButton();

protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg
void OnLButtonDown(UINT nFlags, CPoint point);
public:
afx_msg
void OnLButtonUp(UINT nFlags, CPoint point);
public:
afx_msg
void OnMouseMove(UINT nFlags, CPoint point);
public:
bool m_bStartMove;
public:
afx_msg
void OnLButtonDblClk(UINT nFlags, CPoint point);
public:
CPoint m_oldpoint;
};


/////////////////RFMSStepButton.cpp
#include "stdafx.h"
#include
"ButtonTest.h"
#include
"RFMSStepButton.h"
#include
"MyDialog.h"

// RFMSStepButton

IMPLEMENT_DYNAMIC(RFMSStepButton, CButton)

RFMSStepButton::RFMSStepButton()
: m_bStartMove(
false)
, m_oldpoint(
0)
{

}

RFMSStepButton::
~RFMSStepButton()
{
}


BEGIN_MESSAGE_MAP(RFMSStepButton, CButton)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()



// RFMSStepButton 消息处理程序


void RFMSStepButton::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bStartMove = TRUE;
m_oldpoint
= point;
ClientToScreen(
&m_oldpoint);
CButton::OnLButtonDown(nFlags, point);
}

void RFMSStepButton::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bStartMove = FALSE;
CButton::OnLButtonUp(nFlags, point);;
}

void RFMSStepButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bStartMove)
{
/*
此方法优点,代码简单,但有个问题没解决,就是鼠标在其他地方按下左键,拖动到按钮上去后,按钮就又会移动了。
ReleaseCapture();
SendMessage(WM_NCLBUTTONDOWN, (WPARAM)HTCAPTION, 0);
*/

CRect rect;
GetClientRect(
&rect);
ClientToScreen(
&rect);
GetParent()
->ScreenToClient(&rect);
ClientToScreen(
&point);

SetWindowPos(NULL,rect.left
+ point.x - m_oldpoint.x ,
rect.top
+ point.y - m_oldpoint.y ,0, 0, SWP_NOZORDER|SWP_NOSIZE);
m_oldpoint
= point;

Invalidate();

}
CButton::OnMouseMove(nFlags, point);
}

void RFMSStepButton::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// 重载按钮双击事件。
MyDialog dialog;
dialog.DoModal();
CButton::OnLButtonDblClk(nFlags, point);
}

/*
备注:响应函数要用WM_CLICK之类的,而不能用=BN_CLICKED=之类的。
*/


二、调用处及群响应:

// ButtonTestDlg.cpp : 实现文件

#define ID1 120
#define ID2 140

BEGIN_MESSAGE_MAP(CButtonTestDlg, CDialog)
ON_COMMAND_RANGE(ID1,ID2, OnMyButton)
// 从ID1到ID2的所有控件都响应OnMyButton函数
END_MESSAGE_MAP()

BOOL CButtonTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();

RFMSStepButton
* button11 = new RFMSStepButton;
CRect rect1(
200,0,300,100);
button11
->Create(L"124", WS_CHILD | WS_VISIBLE | WS_TABSTOP , rect1, this, 124 );

RFMSStepButton
* button12 = new RFMSStepButton;
CRect rect3(
200,200,300,300);
button12
->Create(L"125", WS_CHILD | WS_VISIBLE | WS_TABSTOP , rect3, this, 125 );

return TRUE;
}


void CButtonTestDlg::OnMyButton(UINT nID)
{
//MessageBox(L"this");
}
原文地址:https://www.cnblogs.com/aoyihuashao/p/1623711.html