本文通过回调函数为组件添加了一个鼠标左键抬起时事件函数 用于给窗体使用,同时也可使用消息机制实现这个功能。
.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();
}
......................