一.映射表

UDPMeditor.h中:

typedef void (UDPMeditor::*pFunc)(char*,long);
struct ProtocolMap
{
PackdefType pack;//协议
pFunc func;//函数地址
};

UDPMeditor.cpp中:

static const ProtocolMap g_protocolmapentries[]=
{
{_DEF_PROTOCOL_ONLINE_RQ , &UDPMeditor::Online_Rq},
{_DEF_PROTOCOL_ONLINE_RS , &UDPMeditor::Online_Rs},
{_DEF_PROTOCOL_OFFLINE_RQ , &UDPMeditor::Offline_Rq},
{_DEF_PROTOCOL_DATAINFO_RQ , &UDPMeditor::Datainfo_Rq},
{,}
};

DealMessage函数:当收到一个消息,遍历数组,找出是哪个种类的消息,调用对应的处理函数

bool UDPMeditor::DealMessage(char* buf , long recvIp)
{
//处理数据
//判断这个包的类型
PackdefType *pType = (PackdefType *)buf;
int i = ;
while()
{
if(g_protocolmapentries[i].pack == *pType )
{
(this->*(g_protocolmapentries[i].func))(pType,recvIp);
break;
}
else if(g_protocolmapentries[i].pack == && g_protocolmapentries[i].func == )
break;
i++;
} return true;
}

二 . 按回车程序就退出的问题:

1.可能为按键消息

在Dlg类中添加Key Down消息

void CfeiQDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == )
return;
CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}

没效果

2.重写预处理函数

BOOL CfeiQDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_KEYDOWN && pMsg->wParam == )
{
return FALSE;
}
return CDialogEx::PreTranslateMessage(pMsg);
}

有效果

3.钩子(全局钩子和局部钩子)

局部钩子钩的是当前本线程的消息

全局钩子钩的是运行在操作系统上所有线程的消息

钩子列表

在初始化函数中

//初始化钩子
m_KeyHook = SetWindowsHookEx(WH_KEYBOARD ,KeyboardProc,NULL,GetCurrentThreadId());

钩子函数的实现KeyboardProc

LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam,  LPARAM lParam)
{
if(wParam == 0xd)
return ;
return CallNextHookEx(CfeiQDlg::m_KeyHook,code,wParam,lParam);
}

在类中声明钩子为static,并进行初始化, HHOOK CfeiQDlg::m_KeyHook = NULL;

在销毁函数中释放:

if(m_KeyHook)
{
UnhookWindowsHookEx(m_KeyHook);
m_KeyHook = NULL;
}

三 . 双击弹出窗口,进行对话

1.资源中添加一个Dlg,并创建类,

2.在feiQDlg中双击消息实现中非模态创建并显示(可以随意移动,SW_SHOW)

3.弹出窗口名称为IP, 且一个IP对应一个窗口(Map),当存在窗口时,将其位置显示在最上面(SetWindowPos)

4.在Destroy中删除创建的Dlg

双击消息实现:map<CString , MyDlgChat*> m_iptodlg;//使用map一定要加

void CfeiQDlg::OnLbnSelchangeList1()
{
CString str;
int index = m_listbox.GetCurSel();
if(index == -) return;
m_listbox.GetText(index,str);
//判断窗口是否存在
MyDlgChat* pCMydlgChat = m_iptodlg[str];
if(!pCMydlgChat)//窗口不存在
{
pCMydlgChat = new MyDlgChat;
pCMydlgChat->Create(IDD_DIALOG1);
pCMydlgChat->ShowWindow(SW_SHOW);
pCMydlgChat->SetWindowText(str);
m_iptodlg[str] = pCMydlgChat;
}
pCMydlgChat->SetWindowPos(&wndTopMost,,,,,SWP_NOSIZE|SWP_NOMOVE );
}

非模态窗口×不能销毁窗口,只是关闭

非正常退出,不发送下线消息?

答:1.维护一个上线的好友列表,没有则添加。2.心跳机制:定期发送消息

点击关闭按钮,窗口还存在?

FeiQ项目的更多相关文章

  1. Fis3前端工程化之项目实战

    Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  3. 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目

    最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...

  4. Hangfire项目实践分享

    Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...

  5. Travis CI用来持续集成你的项目

    这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  8. Angular企业级开发(5)-项目框架搭建

    1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...

  9. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

随机推荐

  1. Arcgis for Javascript之featureLayer图和属性的互操作

    说明:主要实现加载FeatureLayer与显示属性表,并实现属性表与地图的联动,首先,看看实现后的效果: 显示效果 如上图所示,本文章主要实现了以下几个功能:1.FeatureLayer属性表的分页 ...

  2. ffmpeg推送RTSP直播流到EasyDarwin报错问题的修复

    在之前的博客<ffmpeg推送,EasyDarwin转发,vlc播放 实现整个RTSP直播>中,我们介绍了如何采用ffmpeg进行RTSP推送,实现EasyDarwin直播分发的功能,近期 ...

  3. Win7系统64位环境下使用Apache——Apache2.4整合Tomcat与mod_jk

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/70398091 本文出自[我是干勾鱼的博客] 之前的几篇文章: Win7系统64位 ...

  4. HihoCoder 1158 : 质数相关 (最大独立集)

    质数相关 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关 ...

  5. 浅析Python中bytes和str区别

    本博转载自:Chown-Jane-Y的浅析Python3中的bytes和str类型 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示, ...

  6. Robot Framework接口测试(1)

    RF是做接口测试的一个非常方便的工具,我们只需要写好发送报文的脚本,就可以灵活的对接口进行测试. 做接口测试我们需要做如下工作: 1.拼接发送的报文 2.发送请求的方法 3.对结果进行判断 我们先按步 ...

  7. 剑指offer-第四章解决面试题的思路(从上往下打印二叉树)

    题目:从上往下打印二叉树的每一个节点,同一层的节点按照从左到右的顺序打印 思路:这是一个层序遍历的问题,因此要借用到队列.我们可以在打印第一个节点的同时将这个节点的左右子节点都放入队列,同样打印左右子 ...

  8. System.Web.HttpRequestValidationException: 从客户端(dbFlag=&quot;&lt;soap:Envelope xmlns...&quot;)中检测到有潜在危险的 Request.Form 值。

    System.Web.HttpRequestValidationException: 从客户端(dbFlag="<soap:Envelope xmlns...")中检测到有潜 ...

  9. 分类(类别/Category)与 类扩展(Extension)

    一.分类(类别/Category) 1.适用范围      当你已经封装好了一个类(也可能是系统类.第三方库),不想在改动这个类了,可是随着程序功能的增加需要在类中增加一个方法,这时我们不必修改主类, ...

  10. 并发问题 关于Redis

    并发问题 关于Redis [吐槽]Jimesembria 付费请人解这个BUG , 有没有php同学有兴趣,(问题原因是理论上是5分钟内不生产同样金额的订单, 但是由于并发原因没控制好) 10:34: ...