一.映射表

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. 2017.10.26 ECN + product spec+ cypress ble module test+

    1 ECN Ecn  should be issued when modifying drawing,Copy children BOM of subassembly from BIL if one ...

  2. 【python】numpy pandas 特性(随时更新)

    [value map] 用df.replace(dict)可以解决.但是如果dict太大,会非常非常慢. [array相加的维度规律][广播] (2,3) 能和 (3,) 相加,不能和(2,)相加 ( ...

  3. 采用Spring管理Bean和依赖注入

    1. 实例化spring容器和从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] ApplicationContext ctx ...

  4. 旧书重温:0day2【4】动态获取函数地址

    通过以上3篇文章的学习,我们已经可以获取到kernel32.dll的地址了下一步 我们就是获取几个重要的函数 1.GetProcAddress 2.LoadLibrary 有了这两个函数很多函数都可以 ...

  5. 进程(并发,并行) join start 进程池 (同步异步)

    一.背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象.进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有 ...

  6. 【MFC】CDC::BitBlt介绍

    CDC::BitBlt介绍 2011-11-04 08:25 19576人阅读 评论(6) 收藏 举报 摘自: http://blog.csdn.net/bberdong/article/detail ...

  7. make命令和makefile文件

    make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具,它不仅常被用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录. makefile文件由一组依赖关系 ...

  8. 11.7noip模拟赛

     题解:广义斐波那契数列 矩阵乘法 #include<iostream> #include<cstdio> #include<cstring> #define LL ...

  9. JUnit测试,获取Spring MVC环境

    @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(locations = { &qu ...

  10. file_put_contents以及file_get_contents的用法与在使用过程中遇到的问题(PHP学习)

    对数据的操作最基本的是增删改查,file_put_contents以及file_get_contents是对文件里的数据进行存入与取出. 先上代码: <?php $str = 'hello wo ...