FeiQ项目
一.映射表
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项目的更多相关文章
- Fis3前端工程化之项目实战
Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- Hangfire项目实践分享
Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...
- Travis CI用来持续集成你的项目
这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- Angular企业级开发(5)-项目框架搭建
1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...
- 【分享】标准springMVC+mybatis项目maven搭建最精简教程
文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...
随机推荐
- ADO.NET数据库访问技术(转)
这几天的自学,现在总结一下关于C#中连接数据库的一些知识点: 1.使用Connection连接数据库的步骤: (1).添加命名空间 System.Data.SqlClient(注意:初学者经常会忘记) ...
- Qt 出现“undefined reference to `vtable for”原因总结
http://blog.csdn.net/chenlong12580/article/details/7431104
- Windows手动安装Apache,MySql服务
绿色版的Apache,Mysql需要以服务方式运行.或者由于某种原因服务管理器里面没有服务项了,可以进行手工注册服务和启并服务. # Apache Apache进到安装目录的bin目录下,运行dos命 ...
- Weex入门篇——Mac 安装Weex
相关文档:http://blog.csdn.net/jasonblog/article/details/51863173 前言 相比较于React Native的“Learn once, write ...
- Java实现三种常用的查找算法(顺序查查找,折半查找,二叉排序树查找)
public class Search { public class BiTreeNode{ int m_nValue; BiTreeNode m_pLeft; BiTreeNode m_pRight ...
- C# 在类文件自动添加文件注释的方法
对于vs2013来讲, 步骤: 1.VS2013 中找到(安装盘符以C盘为例)C:\ProgramFiles(x86)\Microsoft VisualStudio12.0\Common7\IDE\I ...
- yarn workspace 开发示例
此为官方示例: package.json { "private": true, "workspaces": [ "workspace-a", ...
- Mysql 拿指定经纬度与数据库多条经纬度进行距离计算 (转)
公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2* ...
- JBPM的ORACLE脚本
create table JBPM4_DEPLOYMENT ( DBID_ number(19,0) not null, NAME_ clob, TIMESTAMP_ number(19,0), ST ...
- SQL语句优化方法30例
1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_I ...