转载请注明出处: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(); };
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()方法。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); }
此方法的功能是如果操作系统允许应用程序托盘到任务就以托盘方式运行,否则窗口就以就小化方式运行。至此,飞鸽传书的主界面启动完成。