#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;
}

流程图如下

模仿WIN32程序处理消息的更多相关文章

  1. 实现 Win32 程序的消息映射宏(类似 MFC )

    对于消息映射宏,不用多说了,用过 MFC 的人都很清楚.但目前有不少程序由于各种原因并没有使用 MFC,所以本帖讨论一下如何在 Win32 程序中实现类似MFC的消息映射宏.其实 Windows 的头 ...

  2. win32编程中消息循环和WndProc()窗口过程函数

    原文地址:https://blog.csdn.net/zxxSsdsd/article/details/45504383 在win32程序的消息循环函数中  while (GetMessage (&a ...

  3. win32程序之窗口程序,以及消息机制

    win32程序值窗口程序,以及消息机制 一丶简介 通过上一讲.我们了解了窗口其实是绘制出来的.而且是不断绘制的过程. 所以窗口的本质是绘制. 但是我们现在看到的窗口程序.都可以点击关闭按钮. 使用鼠标 ...

  4. 什么是消息循环,一个简单的win32程序如何运行?

    预备知识 1.什么是句柄? (HANDLE) 在win32编程中有各种句柄,那么什么是句柄呢? #define DECLARE_HANDLE(name) struct name##_ { int un ...

  5. WPF中嵌入普通Win32程序的方法

    公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系 ...

  6. win32程序之子窗口编程

    win32程序之子窗口编程 一丶简介.什么是子窗口 在前边我们已经讲解了窗口的本质.以及如何注册窗口类跟创建窗口. 还讲了消息循环. 那么有很多窗口其实Windows已经帮我们创建出来了.我们直接使用 ...

  7. 深入浅出MFC——Win32程序基本概念(一)

    1. Windows程序分为“程序代码”和“UI资源”,下图所示: 2. Windows支持动态链接(应用程序所调用的Windows API函数是在“执行时期”才链接上的).Windows程序调用的函 ...

  8. win32程序显示网页

    说是win32,实际程序中使用了atl的东西.所以新建win32程序时,记得勾选使用atl: 代码如下: #include "stdafx.h" #include "Wi ...

  9. Win32 程序开发:创建一个应用程序窗口

    一.创建一个应用程序窗口 代码如下: // 头文件 #include <windows.h> // 全局变量 WCHAR g_lpszClassName[] = L"CLASSN ...

随机推荐

  1. CentOS 安装Passenger

    gem install passenger 查看路径 passenger-config --root passenger-install-apache2-module ps auxw | grep f ...

  2. Android 使用MediaPlayer 播放 视频

    http://pan.baidu.com/s/1lgKLS package cn.bgxt.surfaceviewdemo; import java.io.File; import android.m ...

  3. Android ActivityManager与WindowManager

    <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission ...

  4. dhroid - Perference

    SharedPreferences 是我们开发android使用很多的工具通常我们是这样使用的 SharedPreferences share=getSharedPreferences("n ...

  5. thinkphp---模糊查询详解

    最近做项目,在做搜索模块的时候,模糊查询肯定少不了. 今天就详细的看一下模糊查询: $where['title'] = array('like','%'.$words.'%'); $where['ti ...

  6. MapReduce分组

     分组:相同key的value进行分组  例子:如下输入输出,右边的第一列没有重复值,第二列取得是当第一列相同时第二例取最大值 分析:首先确定<k3,v3>,k3的选择两种方式, 方法1. ...

  7. 线段树(Segment Tree)总结

    0 写在前面 怎么说呢,其实从入坑线段树一来,经历过两个阶段,第一个阶段是初学阶段,那个时候看网上的一些教学博文和模板入门了线段树, 然后挑选了一个线段树模板作为自己的模板,经过了一点自己的修改,然后 ...

  8. Chainer的初步学习

    人们都说Chainer是一块非常灵活you要用的框架,今天接着项目里面的应用,初步接触一下,涨涨姿势,直接上源码吧,看着好理解.其实跟Tensorflow等其他框架都是一个套路,个人感觉更简洁了. & ...

  9. python数据结构之树(概述)

    树 在计算机科学中,树是分层结构的抽象模型 .本篇学习笔记记录树的内容如下: 树的基本功能:定义.术语.ADT 树的遍历方法:前序.中序.后序 树的定义 第一种:树由一组节点和一组连接节点的边组成.树 ...

  10. It is not based on WSGI, and it is typically run with only one thread per process.

    Tornado Web Server — Tornado 5.1.1 documentation http://www.tornadoweb.org/en/stable/