如何在callback 函數中訪問類的成員變數,今天遇到了這個問題,半天才解決,
由於callback函數必須為static函數,而static函數 不能訪問非static變數
其實很簡單,只需要聲明一個類的指標,將指標指向該類,並將該指標傳入callback函數即可以對該類中的任何成員進行操作了
例如
class CGPS_zzDlg : public CDialog
{
// Construction
public:
CGPS_zzDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CGPS_zzDlg)
enum { IDD = IDD_GPS_ZZ_DIALOG };
CButton m_ButOpen;
CButton m_ButClose;
CString m_time;
CString m_lati;
CString m_longi;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CGPS_zzDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CGPS_zzDlg)
virtual BOOL OnInitDialog();
afx_msg void OnBtnOpencom();
afx_msg void OnBtnClosecom();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
DCB dcb; /* 串口參數結構體 */
HANDLE m_hComm; /* 串口操作控制代碼 */
HANDLE m_ExitThreadEvent; /* 串口接收線程退出事件 */
CString m_strRecDisp; /* 接收區顯示字元 */
BOOL ClosePort(void); /* 關閉串口 */
// 開啟串口
BOOL OpenPort(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity);
// 串口接收線程
static DWORD CommRecvTread(LPVOID lparam);
// 串口接收資料成功回呼函數
typedef void (CALLBACK *ONCOMMRECV)(CWnd* pWnd, char *buf, int buflen);
static void CALLBACK OnCommRecv(CWnd* pWnd, char *buf, int buflen );
};
只需在callback函數中聲明指向類的指標pDlg即可
void CALLBACK CGPSDlg::OnCommRecv(CWnd* pWnd, char *buf, int buflen )
{
CGPSDlg * pDlg = (CGPS_zzDlg*)pWnd;
}