现在的位置: 首页 > 综合 > 正文

飞鸽传书源码分析-程序启动过程

2017年06月19日 ⁄ 综合 ⁄ 共 2354字 ⁄ 字号 评论关闭

转载请注明出处:http://blog.csdn.net/mxway/article/details/39581119

本文章是在飞鸽传书的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);
}

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

抱歉!评论已关闭.