飞鸽传书源码分析-程序启动过程
2014-09-26 15:49
507 查看
转载请注明出处:/article/8273909.html
本文章是在飞鸽传书的2.06源码基础上分析
飞鸽传书源码运行流程如下,本篇文章只说明了飞鸽传书的启动过程,对于飞鸽伟书的消息机制及菜单加载等功能都不在本篇文章范围之内。
![](http://img.blog.csdn.net/20140926154634078?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXh3YXk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
1. WinMain函数
2.TApp类定义的部分源码
3. TMsgApp类的定义
在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部分源码
4.Twin类定义的部分源码
5.TMainWin类定义的部分源码
该方法中调用了Windows API函数CreateWindowEx方法,调用该方法后将会触发一条WM_CREATE消息。该消息的处理函数是EvCreate(后面再详解飞鸽传书的消息机制)
在TMainWin中定义重写了父类Twin中的EvCreate方法,所以下面调用的是TMainWin中的EvCreate方法。EvCreate方法部分源码如下
此方法的功能是如果操作系统允许应用程序托盘到任务就以托盘方式运行,否则窗口就以就小化方式运行。至此,飞鸽传书的主界面启动完成。
本文章是在飞鸽传书的2.06源码基础上分析
飞鸽传书源码运行流程如下,本篇文章只说明了飞鸽传书的启动过程,对于飞鸽伟书的消息机制及菜单加载等功能都不在本篇文章范围之内。
1. WinMain函数
int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int nCmdShow) { TMsgApp app(hI, cmdLine, nCmdShow); return app.Run(); }
2.TApp类定义的部分源码
class TApp{ protected: <span style="white-space:pre"> </span>virtual BOOL InitApp(void); <span style="white-space:pre"> </span>TWin *mainWnd; public: virtual void InitWindow() = 0; virtual int Run(); };
3. TMsgApp类的定义
class TMsgApp : public TApp { <span style="white-space:pre"> </span>public: <span style="white-space:pre"> </span>TMsgApp(HINSTANCE _hI, LPSTR _cmdLine, int _nCmdShow); virtual ~TMsgApp(); virtual void InitWindow(void); };
在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部分源码
void TMsgApp::InitWindow(void) { <span style="white-space:pre"> </span>mainWnd = new TMainWin(nicAddr, port_no); mainWnd->Create(class_name, IP_MSG, WS_OVERLAPPEDWINDOW | (IsNewShell() ? WS_MINIMIZE : 0)); }
4.Twin类定义的部分源码
class TWin { public: virtual BOOL Create(LPCSTR className=NULL, LPCSTR title="", DWORD style=(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN), DWORD exStyle=0, HMENU hMenu=NULL); virtual BOOL EvCreate(LPARAM lParam); };
5.TMainWin类定义的部分源码
class TMainWin : public TWin { virtual BOOL EvCreate(LPARAM lParam); };InitWindow中执行mainWnd->Create()方法,TMainWin继承Twin,由于TMainWin没有重写Create方法,所以此Create方法调用的是TWin中的Create,Twin::Create源码如下
BOOL TWin::Create(LPCSTR className, LPCSTR title, DWORD style, DWORD exStyle, HMENU hMenu) { if (className == NULL) className = TApp::defaultClass; TApp::AddWin(this); if ((hWnd = ::CreateWindowEx(exStyle, className, title, style, rect.left, rect.top, rect.right, rect.bottom, parent ? parent->hWnd : NULL, hMenu, TApp::hI, NULL)) == NULL) return TApp::DelWin(this), FALSE; else return TRUE; }
该方法中调用了Windows API函数CreateWindowEx方法,调用该方法后将会触发一条WM_CREATE消息。该消息的处理函数是EvCreate(后面再详解飞鸽传书的消息机制)
在TMainWin中定义重写了父类Twin中的EvCreate方法,所以下面调用的是TMainWin中的EvCreate方法。EvCreate方法部分源码如下
BOOL TMainWin::EvCreate(LPARAM lParam) { if (IsNewShell()) { Show(SW_HIDE); while (TaskBar(NIM_ADD, hMainIcon, IPMSG_MSGSTR) != TRUE) Sleep(1000); // for logon script } else Show(SW_MINIMIZE); }
此方法的功能是如果操作系统允许应用程序托盘到任务就以托盘方式运行,否则窗口就以就小化方式运行。至此,飞鸽传书的主界面启动完成。
相关文章推荐
- 飞鸽传书源码分析-程序启动过程
- 飞鸽传书源码分析-程序启动过程
- TOMCAT源码分析及启动过程
- u-boot启动过程分析(源码)
- Nginx源码分析-启动初始化过程(二)
- Android 4.0 Launcher2源码分析——启动过程分析
- GRUB启动过程分析 & GRUB 引导程序配置
- Nginx源码分析---Nginx启动初始化过程(一)
- Amoeba源码分析一:启动过程分析
- Android 源码分析 -- (一) Android启动过程
- Hbase 源码分析5--Master启动过程
- GRUB启动过程分析 & GRUB 引导程序配置
- tomcat 4.1.30启动过程的源码分析
- Nginx源码分析-启动初始化过程(一)
- nginx源码分析(10)-启动过程分析
- U-Boot的启动过程源码分析(只有思路)
- 源码分析vxWorks6.x的ARM板BSP启动过程(上)
- nginx源码分析(10)-启动过程分析
- nginx源码分析(1)——启动过程
- uboot内核启动过程源码分析