飞鸽传书源码分析-程序启动过程
2015-04-27 00:05
471 查看
本文章是在飞鸽传书的2.06源码基础上分析
飞鸽传书源码运行流程如下,本篇文章只说明了飞鸽传书的启动过程,对于飞鸽伟书的消息机制及菜单加载等功能都不在本篇文章范围之内。
![](http://img.blog.csdn.net/20150427000755065)
1. WinMain函数
[cpp]
view plaincopy
int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int nCmdShow)
{
TMsgApp app(hI, cmdLine, nCmdShow);
return app.Run();
}
2.TApp类定义的部分源码
[cpp]
view plaincopy
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类的定义
[cpp]
view plaincopy
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部分源码
[cpp]
view plaincopy
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类定义的部分源码
[cpp]
view plaincopy
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类定义的部分源码
[cpp]
view plaincopy
class TMainWin : public TWin {
virtual BOOL EvCreate(LPARAM lParam);
};
InitWindow中执行mainWnd->Create()方法,TMainWin继承Twin,由于TMainWin没有重写Create方法,所以此Create方法调用的是TWin中的Create,Twin::Create源码如下
[cpp]
view plaincopy
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方法部分源码如下
[cpp]
view plaincopy
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);
}
此方法的功能是如果操作系统允许应用程序托盘到任务就以托盘方式运行,否则窗口就以就小化方式运行。至此,飞鸽传书的主界面启动完成。
本文出处:/article/8273909.html
飞鸽传书源码运行流程如下,本篇文章只说明了飞鸽传书的启动过程,对于飞鸽伟书的消息机制及菜单加载等功能都不在本篇文章范围之内。
1. WinMain函数
[cpp]
view plaincopy
int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int nCmdShow)
{
TMsgApp app(hI, cmdLine, nCmdShow);
return app.Run();
}
2.TApp类定义的部分源码
[cpp]
view plaincopy
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类的定义
[cpp]
view plaincopy
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部分源码
[cpp]
view plaincopy
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类定义的部分源码
[cpp]
view plaincopy
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类定义的部分源码
[cpp]
view plaincopy
class TMainWin : public TWin {
virtual BOOL EvCreate(LPARAM lParam);
};
InitWindow中执行mainWnd->Create()方法,TMainWin继承Twin,由于TMainWin没有重写Create方法,所以此Create方法调用的是TWin中的Create,Twin::Create源码如下
[cpp]
view plaincopy
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方法部分源码如下
[cpp]
view plaincopy
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);
}
此方法的功能是如果操作系统允许应用程序托盘到任务就以托盘方式运行,否则窗口就以就小化方式运行。至此,飞鸽传书的主界面启动完成。
本文出处:/article/8273909.html
相关文章推荐
- 飞鸽传书源码分析-程序启动过程
- 飞鸽传书源码分析-程序启动过程
- Netty 4.0源码分析1:服务端启动过程中的Channel与EventLoopGroup的注册
- 【一】Uboot-2017.11源码分析启动过程之汇编部分
- U-Boot 启动过程和源码分析(第二阶段)
- Linux内核源码分析--内核启动之(1)zImage自解压过程(Linux-3.0 ARMv7) 【转】
- SystemServer进程启动过程源码分析
- spring启动component-scan类扫描加载过程---源码分析
- spring启动加载过程源码分析
- Spring原理与源码分析系列(三)- Spring IoC容器启动过程分析(下)
- Android 4.0 Launcher2源码分析——启动过程分析
- Android系统默认Home应用程序(Launcher)的启动过程源码分析
- 分析一个android程序从建立到启动的过程
- Android源码解析之Zygote启动过程的源代码分析
- MINA源码分析1:服务器端的启动过程
- Android 8.0系统源码分析--startService启动过程源码分析
- tinypy源码笔记(三)——虚拟机启动过程以及字节码分析
- 【转】Android 4.0 Launcher2源码分析——启动过程分析
- Hyperledger fabric0.6 peer启动过程源码分析
- Nginx源码分析-启动初始化过程(二)