1. 程式人生 > >C++基礎(十五)C++ 的訊息處理:afx_msg

C++基礎(十五)C++ 的訊息處理:afx_msg

一、簡介

最近用到了獲取,串列埠訊息,訊息處理主要用到了微軟的<afxwin.h>標頭檔案的afx_msg類。先調研一番訊息處理函式,然後舉例說明。

 

二、什麼是訊息處理函式

afx_msg主要在MFC中應用,比較古老了。訊息函式主要用到afx_msg關鍵字來定義。

https://blog.csdn.net/holandstone/article/details/7452384

https://www.cnblogs.com/linkzijun/p/6196165.html

這幾篇部落格完美的解析了afx_msg關鍵字。

三、訊息處理函式的應用

參看https://www.cnblogs.com/linkzijun/p/6196165.html

——>比如MFC中,按鈕的點選訊息。

四、工程中用的訊息

1、.h檔案中定義訊息

LRESULT——表示長整數(預設)

WPARAM——表示長整數(預設)

LPARAM——表示短整數(預設)

2、啟動訊息

BEGIN_MESSAGE_MAP——啟動訊息,KGenDel表示類。CDialogEx是系統生成了不知道啥意思。

ON_MESSAGE(WM_COMM_RXCHAR, &KGenDel::OnComm)//通過WM_COMM_RXCHAR與串列埠關聯起來,一旦接收串列埠類的指令,則響應訊息OnComm。事件上,OnComm是KGenDel.cpp的函式。

END_MESSAGE_MAP()——關閉

3、 訊息函式的實現

定時器發訊息給串列埠:

 

接收來自串列埠的訊息:

//訊息響應函式:
LRESULT KGenDel::OnComm(WPARAM ch, LPARAM port)
{
		if (16 > ch)
		{
			str.Format(_T("0%X "), ch);
		}
		else
		{
			str.Format(_T("%X "), ch);
		}
		m_RecvBuf += str;
		data[cnt] = ch;
		cnt++;
		
		BYTE *p = (BYTE*)&data;
		if (136 == data[12] && 240 == data[0]) //函式傳送短命令
		{
			m_cLogger.WriteDebugLog("KGenDel::OnComm: 命令解析開始 ", 200);
			m_cLogger.WriteDebugLog("KGenDel:: OnComm:  " + m_RecvBuf, 200);
			m_RecvBuf.ReleaseBuffer();      //第一步清空函式記憶體,保證存取上一次資料
			m_RecvBuf.Empty();              //第二步清空函式記憶體,強制設定為空
			m_cLogger.WriteDebugLog("KGenDel::OnComm:  命令結束", 200);
		}
		if (136 == data[18] && 240 == data[0]) //函式傳送長命令
		{
			m_cLogger.WriteDebugLog("KGenDel::OnComm: 命令解析開始 ", 200);
			m_cLogger.WriteDebugLog("KGenDel:: OnComm:  " + m_RecvBuf, 200);
			m_RecvBuf.ReleaseBuffer();
			m_RecvBuf.Empty();  
			m_cLogger.WriteDebugLog("KGenDel::OnComm:  命令結束", 200);
		}
		OnComm1();

	return 0;
}

4、串列埠類中,包含了WM_COMM_RXCHAR(雖然不知道串列埠怎麼關聯訊息)