回调函数例子

本文通过回调函数为组件添加了一个鼠标左键抬起时事件函数 用于给窗体使用,同时也可使用消息机制实现这个功能。

.h文件

#pragma once
typedef  void (CALLBACK *FunOnClicked)(void * pOwner,WPARAM wparam);

class CBaseClient : public CStatic
{
DECLARE_DYNAMIC(CBaseClient)
public:
CBaseClient();
virtual ~CBaseClient();
private:
protected:
DECLARE_MESSAGE_MAP()
virtual void PreSubclassWindow();
public:
afx_msg void OnPaint();
afx_msg void OnDestroy();
virtual BOOL Create(LPCTSTR lpszText, DWORD dwStyle, const CPoint & point,DWORD dwMDBmpID,DWORD dwMUBmpID,CWnd* pParentWnd, UINT nID = 0xffff);
DWORD m_dwMDBmpID;
DWORD m_dwMUBmpID;
..............
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DWORD m_dwStatus;
public:
DWORD m_nID;
CWnd* m_pParentWnd;
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
FunOnClicked m_lpOnClicked;
};

.CPP文件
#include "stdafx.h"
#include "BaseClient.h"
// CBaseClient

IMPLEMENT_DYNAMIC(CBaseClient, CStatic)

CBaseClient::CBaseClient()
{
m_dwStatus = 0;
m_lpOnClicked=NULL;
}


CBaseClient::~CBaseClient()
{


}

BEGIN_MESSAGE_MAP(CBaseClient, CStatic)
ON_WM_PAINT()
ON_WM_DESTROY()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
......
void CBaseClient::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
    m_dwStatus = 1;
    SetCapture();
Invalidate();
CStatic::OnLButtonDown(nFlags, point);
}

void CBaseClient::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_dwStatus = 2;
       ReleaseCapture();
Invalidate();
::SendMessage(m_pParentWnd->m_hWnd, WM_USER+100,m_nID,0);//信息机制
if(PtInRect(&m_rtClient,point))
{
if( m_lpOnClicked != NULL )
m_lpOnClicked( m_pParentWnd , 0 );
}
CStatic::OnLButtonUp(nFlags, point);
}


使用的.h文件

#include "BaseClient.h"


// CMainDlg 对话框


class CMainDlg : public CDialog
{
DECLARE_DYNAMIC(CMainDlg)


public:
CMainDlg(CWnd* pParent = NULL);   // 标准构造函数
virtual ~CMainDlg();


// 对话框数据
enum { IDD = IDD_MAIN_DIALOG };
     ............
public:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
public:
afx_msg void OnDestroy();
CBaseClient BaseClient;
LRESULT  Onclick(WPARAM wp,LPARAM lp);//消息映射函数
    
static void CALLBACKOnClientConnect1(void* pOwner,WPARAM wparam);//回调函数
};

CPP文件

......................



BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
ON_WM_CTLCOLOR()
ON_BN_CLICKED(ID_INTEN_UP, &CMainDlg::OnBnClickedIntenUp)
ON_BN_CLICKED(ID_LASER_UP, &CMainDlg::OnBnClickedLaserUp)
ON_BN_CLICKED(ID_DEMARCATE, &CMainDlg::OnBnClickedDemarcate)
ON_WM_PAINT()
ON_BN_CLICKED(ID_INTEN_DOWN, &CMainDlg::OnBnClickedIntenDown)
ON_BN_CLICKED(ID_LASER_DOWN, &CMainDlg::OnBnClickedLaserDown)
ON_MESSAGE(WM_SHOWMESSAGE,&CMainDlg::OnShowMessage)
ON_BN_CLICKED(ID_PREPARE, &CMainDlg::OnBnClickedPrepare)
//ON_BN_CLICKED(10000, &CMainDlg::OnBnClickedDemarcate)
ON_WM_TIMER()
ON_WM_ERASEBKGND()
ON_WM_DESTROY()
ON_MESSAGE(WM_USER+100,Onclick)
END_MESSAGE_MAP()

LRESULT  CMainDlg::Onclick(WPARAM wp,LPARAM lp)
{
OnBnClickedDemarcate();
return 1;
}
BOOL CMainDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetWindowPos(NULL,0,0,800,480,SWP_SHOWWINDOW);
...

BaseClient.Create(L"",WS_CHILD|WS_VISIBLE,CPoint(40,40),IDB_BMP_SELFCHK_ERROR,IDB_BMP_SELFCHK_NOR,this,10000);
BaseClient.m_lpOnClicked=OnClientConnect1;

...........

}

void CALLBACK CMainDlg::OnClientConnect1(void* pOwner,WPARAM wparam)
{
CMainDlg *me=(CMainDlg*)pOwner;
me->OnBnClickedDemarcate();

}

......................

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值