本文章是在飞鸽传书的2.06源码基础上分析

飞鸽传书源码运行流程如下,本篇文章只说明了飞鸽传书的启动过程,对于飞鸽伟书的消息机制及菜单加载等功能都不在本篇文章范围之内。

1. WinMain函数

[cpp] view plaincopy
  1. int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int nCmdShow)
  2. {
  3. TMsgApp app(hI, cmdLine, nCmdShow);
  4. return  app.Run();
  5. }

2.TApp类定义的部分源码

[cpp] view plaincopy
  1. class TApp{
  2. protected:
  3. <span style="white-space:pre">    </span>virtual BOOL       InitApp(void);
  4. <span style="white-space:pre">        </span>TWin       *mainWnd;
  5. public:
  6. virtual void        InitWindow() = 0;
  7. virtual int         Run();
  8. };

3. TMsgApp类的定义

[cpp] view plaincopy
  1. class TMsgApp : public TApp {
  2. <span style="white-space:pre">    </span>public:
  3. <span style="white-space:pre">        </span>TMsgApp(HINSTANCE _hI, LPSTR _cmdLine, int _nCmdShow);
  4. virtual ~TMsgApp();
  5. virtual void    InitWindow(void);
  6. };

在WinMain函数中定义了TMsgApp的对象app,app.Run由于TMsgApp继承TApp,而TMsgApp没有重写Run方法,所以此时调用父类TApp的Run方法,该方法中开头有如下两条语句

InitApp();

InitWindow();

这两条语句与下面的语句等价

this->InitApp();

this->InitWindow();

其意思就是调用TMsgApp的InitApp()和InitWindow()方法,由于TMsgApp没有重写InitApp()方法,所以调用的是父类的InitApp方法。TApp中定义的InitWindow是纯虚函数,所以this->InitWindow()调用的是TMsgApp中的InitWindow()方法。
InitWindow部分源码

[cpp] view plaincopy
  1. void TMsgApp::InitWindow(void)
  2. {
  3. <span style="white-space:pre">    </span>mainWnd = new TMainWin(nicAddr, port_no);
  4. mainWnd->Create(class_name, IP_MSG, WS_OVERLAPPEDWINDOW | (IsNewShell() ? WS_MINIMIZE : 0));
  5. }

4.Twin类定义的部分源码

[cpp] view plaincopy
  1. class TWin {
  2. public:
  3. virtual BOOL    Create(LPCSTR className=NULL, LPCSTR title="", DWORD style=(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN), DWORD exStyle=0, HMENU hMenu=NULL);
  4. virtual BOOL    EvCreate(LPARAM lParam);
  5. };

5.TMainWin类定义的部分源码

[cpp] view plaincopy
  1. class TMainWin : public TWin {
  2. virtual BOOL    EvCreate(LPARAM lParam);
  3. };

InitWindow中执行mainWnd->Create()方法,TMainWin继承Twin,由于TMainWin没有重写Create方法,所以此Create方法调用的是TWin中的Create,Twin::Create源码如下

[cpp] view plaincopy
  1. BOOL TWin::Create(LPCSTR className, LPCSTR title, DWORD style, DWORD exStyle, HMENU hMenu)
  2. {
  3. if (className == NULL)
  4. className = TApp::defaultClass;
  5. TApp::AddWin(this);
  6. if ((hWnd = ::CreateWindowEx(exStyle, className, title, style, rect.left, rect.top, rect.right, rect.bottom, parent ? parent->hWnd : NULL, hMenu, TApp::hI, NULL)) == NULL)
  7. return  TApp::DelWin(this), FALSE;
  8. else
  9. return  TRUE;
  10. }

该方法中调用了Windows API函数CreateWindowEx方法,调用该方法后将会触发一条WM_CREATE消息。该消息的处理函数是EvCreate(后面再详解飞鸽传书的消息机制)

在TMainWin中定义重写了父类Twin中的EvCreate方法,所以下面调用的是TMainWin中的EvCreate方法。EvCreate方法部分源码如下

[cpp] view plaincopy
  1. BOOL TMainWin::EvCreate(LPARAM lParam)
  2. {
  3. if (IsNewShell())
  4. {
  5. Show(SW_HIDE);
  6. while (TaskBar(NIM_ADD, hMainIcon, IPMSG_MSGSTR) != TRUE)
  7. Sleep(1000);    // for logon script
  8. }
  9. else
  10. Show(SW_MINIMIZE);
  11. }

此方法的功能是如果操作系统允许应用程序托盘到任务就以托盘方式运行,否则窗口就以就小化方式运行。至此,飞鸽传书的主界面启动完成。

本文出处:http://blog.csdn.net/mxway/article/details/39581119

飞鸽传书源码分析-程序启动过程相关推荐

  1. 飞鸽传书源码分析三-网络

    转载请注明出处:http://blog.csdn.net/mxway/article/details/44195099 本文是在飞鸽传书2.06源码基础之上进行分析的. 一.网络的初始化 飞鸽传书主窗 ...

  2. android版本飞鸽传书源码

    2019独角兽企业重金招聘Python工程师标准>>> 说明 第一次在eoe论坛发帖.去年11月份开始自学android开发, 长期混迹在eoe里潜水.今天来点贡献.贡献出我自己写的 ...

  3. 东风来了的飞鸽传书源码

    摘要:飞鸽传书源码 2012年07月13日浏览器支持IE,刁杨与小孽双双扮靓你的桌面,Mac等,由内地版瑶瑶刁杨,让她们与你日夜相伴,想要,对飞鸽传书2007访客而言,不能养宠物,最震撼的独家特权大礼 ...

  4. 表示深深的感谢飞鸽传书源码

    摘要:飞鸽传书源码 2012年07月13日最后找到旅馆订房资料,才紧急联络上当事人,就有机会获得抢鲜体验星辰变游戏的资格和游戏下次测试线上礼包等,如果一定要在公司上网,不止一次的表示希望游戏尽快推出, ...

  5. Linux飞鸽传书源码,Ubuntu 7.10下源码安装飞鸽传书IpMsg

    IPMsg 是一款局域网内即时通信软件, 基于 TCP/IP(UDP),可运行于多种操作平台(Win/Mac/UNIX/Java), 并实现跨平台信息交流. 不需要服务器支持,支持文件/文件夹的传送, ...

  6. Nimbus三Storm源码分析--Nimbus启动过程

    Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus"来启动 看下源码, 此处和上面client不同, jvmtype=" ...

  7. Linux飞鸽传书源码,图解Ubuntu下编译安装飞鸽传书IPMsg步骤

    因为IPMsg官方网站发布的Unix/Linux版本都是源代码包,需要在Ubuntu中编译,因此,需要在本机安装开发环境. 我下载的g2ipmsg-0.9.5.tar,下载地址见http://www. ...

  8. Linux飞鸽传书源码,Linux下的飞鸽传书

    202.106.74.* 于 2007-07-25 17:25:33发表: [root@DevHost g2ipmsg-0.8.6]# make make all-recursive make[1]: ...

  9. elasticSearch6源码分析(1)启动过程

    1.找到bin目录,下面有elasticSearch的sh文件,查看执行过程 exec \"$JAVA" \$ES_JAVA_OPTS \-Des.path.home=" ...

最新文章

  1. R语言ggplot2可视化:ggplot2可视化分组散点图并使用geom_smooth函数在散点图图中为不同的散点簇添加对应的回归曲线
  2. 图像滤镜艺术---(Nostalgla Filter)老照片滤镜
  3. 另类vs2015+xamarin 的android界面乱码 解决
  4. matlab计算函数区域面积,matlab 中函数regionprops 求解区域面积的原理
  5. 北京武耀科技cocos2dx面试题
  6. 【渝粤教育】广东开放大学 数据采集技术 形成性考核 (29)
  7. mysql 执行查询_MySQL查询的执行过程
  8. nginx文件系统大小_详解Nginx系列
  9. [Android] Context应该怎么写?
  10. display 隐藏css,CSS-元素的显示与隐藏
  11. java xml 解析 列表_用Java解析高级XML
  12. SpringBoot 集成ElasticSearch(二)分页查询
  13. 设计模式之GOF23中介者模式
  14. 腾讯云TStack与IBM LinuxONE互认证
  15. 8psk信号的载波调制 matlab,EDGE系统中GMSK和8psk调制的应用原理
  16. 微信小程序样式大全(一)
  17. php与jpython-在python中复数怎么表示
  18. 报The requested URL / was not found on thisserver. 网站打开出现404
  19. request 和 response 对象的具体介绍
  20. CAJ格式文档转PDF格式文档的办法(不需要下载杂七杂八的软件或者充会员)

热门文章

  1. Myeclipse10完美破解过程
  2. 2008春晚,赵本山之《火炬手》(现场版最新完整台词)
  3. 3.5折怎么用计算机算,论几十块钱的小主机能干什么?手把手教你改造神器!(32位黑裙晖安...
  4. 配置微信公众号业务域名,解决“非微信官方网页,请确认是否继续访问”问题
  5. Go的安装及环境变量的配置
  6. 《Journal of Building Engineering》期刊介绍(SCI 3区)
  7. 《孩子抓紧妈妈的手》----泪流满面。。。操他妈的豆腐渣工程!
  8. 求助大佬,python类的问题
  9. 微信支付宝付款码code
  10. 百度数据实习生面试经历—2019.4.15