C++基礎(十五)C++ 的訊息處理:afx_msg
阿新 • • 發佈:2019-01-06
一、簡介
最近用到了獲取,串列埠訊息,訊息處理主要用到了微軟的<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(雖然不知道串列埠怎麼關聯訊息)