模仿WIN32程序处理消息

xiaoxiao2021-02-27  438

#include "stdafx.h" #include "MyMessage.h" #include <conio.h> using namespace std; #ifdef _DEBUG #define new DEBUG_NEW #define DBUG_LOG(st) printf("%s\r\n",st); #else #define DBUG_LOG(st) #endif #define MSG_KEY 0X1224 //有键盘输入 #define MSG_CHAR 0X1225 //有字符输入 #define MSG_QUIT 0X0001 //退出 #define MSG_CLOSE 0X0002 //关闭 //定义消息 struct _MSG { int msg; //消息 int param; //消息参数 }; //消息队列 CList<_MSG> _MsgQueue; //消息处理函数 typedef void (*MessageProc)(int msg,int param); MessageProc _MessageHandler; void MyMessageProc(int msg,int param); //发送消息---投递消息 void _PostMessage(int msg,int param) { _MSG NewMsg; NewMsg.msg = msg; NewMsg.param = param; _MsgQueue.AddTail(NewMsg); } //读取消息队列中的新消息 bool _GetMessage(_MSG* pMsg) { while (_MsgQueue.IsEmpty()); _MSG LastMsg = _MsgQueue.RemoveHead(); *pMsg = LastMsg; if (pMsg->msg == MSG_QUIT) { return false; } return true; } //转换消息 void _TranslateMessage(_MSG *pMsg) { //x键为系统键 if (pMsg->msg == MSG_KEY && pMsg->param == _T('x')) { pMsg->msg = MSG_CLOSE; return; } //将键盘消息转换成字符消息 if (pMsg->msg == MSG_KEY) { pMsg->msg = MSG_CHAR; } } //分发消息 void _DispatchMessage(_MSG *pMsg) { _MessageHandler = MyMessageProc; //直接调用消息处理函数---MyMessageProc (*_MessageHandler)(pMsg->msg,pMsg->param); } //消息大循环,负责读取消息-》分发消息 void MessageLoop(/*MessageProc handler*/) { //_MessageHandler = handler; _MSG msg; while (_GetMessage(&msg)) { _TranslateMessage(&msg); _DispatchMessage(&msg); } } //对MSG_CHAR的响应 void OnChar(int charInput) { DBUG_LOG("进入OnChar函数") if (charInput == _T('q')) { _PostMessage(MSG_QUIT,0); } cout<<"输入:"<<(char)charInput<<endl; } //对MSG_CLOSE的响应 void OnClose(int charInput) { _PostMessage(MSG_QUIT,0); } //相似于WIN32编程里的消息处理回调函数 void MyMessageProc(int msg,int param) { switch (msg) { case MSG_CHAR: { OnChar(param); break; } case MSG_CLOSE: { OnClose(param); break; } } } //消息发生器 UINT GatherMessage(LPVOID pParam) { while (*(bool*)pParam) { //键盘输入 if (_kbhit()) { int ch = _getch(); _PostMessage(MSG_KEY,ch); } } return 0; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { bool flag = true; //打开消息发生器 AfxBeginThread(GatherMessage,&flag); //开始消息处理循环 MessageLoop(/*MyMessageProc*/); flag = false; AfxEndThread(0); return 0; }

流程图如下

转载请注明原文地址: https://www.6miu.com/read-646.html

最新回复(0)