一.映射表

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. 再看Scrapy(1) 基本概念

    再看Scrapy(1) 基本概念 1 准备 安装scrapy: 国内镜像源(官方的pypi不稳定)安装 pip3 install -i https://pypi.douban.com/simple/ ...

  2. 机器人研发十大热门编程语言:不死 Java、不朽 C/C ++、新贵 Python

    流水的编程语言,铁打的 Java.C/C++. 进行人工智能机器人研发,应该选择哪种编程语言? 这是很多机器人专家在自身的职业生涯中都会存在的一个入门级思考.毕竟,在学习一门编程语言时,需要花费大量的 ...

  3. linux学习 XShell上传、下载本地文件到linux服务器

    (一)通过命令行的方式 1.linux服务器端设置 在linux主机上,安装上传下载工具包rz及sz; 如果不知道你要安装包的具体名称,可以使用yum provides */name 进行查找系统自带 ...

  4. Maven无法上传到到私服

    在pom.xml中插入如下代码: <distributionManagement> <repository> <id>nexus</id> <ur ...

  5. 解决ubantu中sublime不支持中文的方法

    更新然后将系统升级到最新版本,在linux终端输入 sudo apt-get update && sudo apt-get 在本地目录中克隆此repo:    如果你没有git的话就安 ...

  6. hdu 5730 Shell Necklace——多项式求逆+拆系数FFT

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5730 可以用分治FFT.但自己只写了多项式求逆. 和COGS2259几乎很像.设A(x),指数是长度,系数 ...

  7. 读写另一EXE的内存

    procedure TfrmMain.tmrChangeServerNameTimer(Sender: TObject); function GetProcessID(FileName: string ...

  8. LVS+Keepalived搭建

    LVS+Keepalived搭建 原理说明 (推荐): http://www.cnblogs.com/likehua/archive/2014/06/19/3796849.html http://ou ...

  9. yum安装报错“rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID 1e5e0159”

    Do not forget to set gpgkey when installing the oracle-validated rpm Read more: http://oracletoday.b ...

  10. (转)oracle - type

    本文转载自:http://www.cnblogs.com/o-andy-o/archive/2012/05/25/2517741.html type定义: oracle中自定义数据类型oracle中有 ...