首先声明,本人在学习阶段,所以所讲之处!难免会出错且啰嗦,本文旨在跟大家分享近期对iocp(window高并发服务器编程)之 MFC界面程序消息传送的几点心得。大神欢迎大家喷我。
先为大家介绍一个c++高并发的大神群!
群主非常热情,而且技术实力雄厚。只要大家能虚心学习,群主每天群里分享面试以及编程经验。欢迎加入QQ群49114021 名字是高性能服务器开发 群主 范蠡³² 教授级大神。 本人仅仅群内潜水小鸟一个。请勿见笑。
本人两年前,开始接触MFC 一般人可能很难理解一个新手的苦恼,所有控件数值改变以及窗体,本人全部都是通过窗口或者控件指针完成!我想刚入门的朋友可能都跟我一样 有这样的苦恼!
消息的用处!
1,首先说指针,(非常复杂)的用法
假设我在某某自定义类 产生数据 int x=123456;我想把x传给窗口的list控件
这TM就麻烦了,先获取窗口指针,然后获取控件指针,然后操作控件的某部位显示x。。假设你要是窗口类也定义了一个这个自定义类 那就悲剧了,涉及两个类的相互引用,当然相互引用有办法解决(一个定义普通对象 一个定义指针对象,这里点到为止,不做细述) 曾经我被这个问题整折腾一个多星期之后不得已放弃,(这也许是自学C++无人指导的新人经常不得已而放弃的原因)不过还好我没放弃(最终我们群主收留了我)。在我的坚持不懈下终于琢磨出了 使用消息的方法。
2,说牛叉的消息传递,
同理 当自定义类产生消息的时候。
首先我们就瞎JB定义一个消息就行 一般在
// rom.h : PROJECT_NAME 应用程序的主头文件
//
pragma once
ifndef AFXWIN_H
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
endif
include “resource.h” // 主符号
define WM_ONLINE (WM_USER+100)
// CromApp:
// 有关此类的实现,请参阅 rom.cpp
//
class CromApp : public CWinApp
{
public:
CromApp();
// 重写
public:
virtual BOOL InitInstance();
// 实现
DECLARE_MESSAGE_MAP()
};
extern CromApp theApp;
这个文件里面定义
define WM_ONLINE (WM_USER+100)
使我们自己定义的消息
WM_ONLINE消息名称 WM_USER+100 其实就是为了避开系统消息 避免跟系统消息重复!+100之后就行一般不要小于+100
这是我们定义了一个消息
然后我们关联消息
BEGIN_MESSAGE_MAP(CromDlg, CDialog)
主窗口类 直接查找这个
中间添加
ON_MESSAGE(WM_ONLINE,&CromDlg::MyOnLine)
前面那个宏是自定义消息的意思 参数是1我们的消息宏 后面是我们的消息处理函数 因为是我们定义到了主窗口类所以&CromDlg:: 至于为啥用&号
抱歉我也不知道为啥,现在不去纠结这个 或许以后学到了自然就领悟了
所谓消息处理函数就是我们收到消息了 怎么处理的函数
这个函数可以附带两个参数 就是这两个参数其中一个定义为x即可
处理函数原型
这时候有人要问了 怎么传递呢。这就要看产生消息了
CromDlg pFram = (CromDlg)AfxGetApp()->m_pMainWnd;
主窗口指针(并不是一定要之窗口指针)
比方说如果你要给某个控件发消息就用这个控件的指针就行了
pFram->SendMessage(WM_ONLINE, (WPARAM)&m_ClientInfo.GetAt(idx), (LPARAM)idx);
这句就是发送消息
第一个参数
(WPARAM)&m_ClientInfo.GetAt(idx),
这是啥呢第一个很好理解强制转换 取地址(先符合消息参数的格式,到处理函数可以强制转回去)
第二个
(LPARAM)idx
同上,假设idx是上文说的x话
处理函数里面写上 int x=(int)idx
就可以恢复x了
LRESULT MyOnLine(WPARAM wp, LPARAM lp);(注意是类里面定义)
LRESULT CromDlg::MyOnLine(WPARAM wp, LPARAM lp)
{
这直线写上你要处理的代码的代码
int x=(int)idx
然后某某控件给我显示这个x就行了
}
到此为止 我们完整的实现了一个消息的传递。
是不是感觉超简单!
可是我学会这个经历了很久很久!希望大家都能快点领悟
赶紧行动起来,学C++不要放弃。加油!