本人能力有效,面对chromium庞大的代码就头大。还是先由前辈的chromiumFrame入手。
1. chromeFrame概貌
chromiumFrame是前辈的心血之作,以最小化的方式抽出chromium界面部分的代码,并以demo的方式展现给我。让我可以不用直接面对chromium这样的庞然大物。
先看看chromiumFrame目录结构,
animation,静态库,动画类。
base,基础静态库,一些logging,只能指针等基础的东东。
gfx,画图的基础库,对windows上的GDIPlus做了不少封装。
message_framework,消息静态库,windows的消息都封装在里面,对外部暴露出delegate类,也是设计模式上常见的delegate模式。
rfc_algorithm,算法静态库,base64,CRC,还有JSON等的封装都在里面。
third_party,第三方库的静态库,集合多个三方库而成。
view_framework,是关键所在的view静态库,重要的view,控件以及UI处理都在这里,这里也将是我所要看的重点。
test_view:是可执行程序的工程。
library.sln:直接用vs打开就能加载所有项目。
以下是打开library工程的样子:
这里要设置test_view为主工程,编译所有就可以得到可执行程序了。
看看效果图:
下图是编译后的chromiumFrame截图:
chromium方面有用到WTL的东西,学习chromium之前需要了解WTL的原理,其中最主要的是父类模板,子类来实例化模板参数的使用技巧。从而在不使用虚函数的前提下,达到多态的效果。关于WTL,推荐星轨工作室翻译的文章http://www.winmsg.com/cn/orbit.htm (文章链接在星轨网页的最后一项)。
2.win32基础
winAPI创建一个win32程序的核心代码也比较重要,chromium就是在这个上面进行扩展出优美UI界面。
win32程序核心代码分两部分:
1.入口函数WinMain
1 int WINAPI WinMain( 2 HINSTANCE hInstance, // handle to current instance 3 HINSTANCE hPrevInstance, // handle to previous instance 4 LPSTR lpCmdLine, // command line 5 int nCmdShow // show state 6 ) 7 { 8 // 1. WNDCLASS注册 9 WNDCLASS wndcls; 10 wndcls.cbClsExtra=0; 11 wndcls.cbWndExtra=0; 12 wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); 13 wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); 14 wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); 15 wndcls.hInstance=hInstance; 16 wndcls.lpfnWndProc=WinProc; 17 wndcls.lpszClassName="win_class"; 18 wndcls.lpszMenuName=NULL; 19 wndcls.style=CS_HREDRAW | CS_VREDRAW; 20 RegisterClass(&wndcls); 21 22 // 2. 窗口的创建 23 HWND hwnd=CreateWindow("win_class","title",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL); 24 ShowWindow(hwnd,SW_SHOWNORMAL); 25 UpdateWindow(hwnd); 26 27 // 3. 启动消息循环 28 MSG msg; 29 while(GetMessage(&msg,NULL,0,0)) 30 { 31 TranslateMessage(&msg); 32 DispatchMessage(&msg); 33 } 34 return msg.wParam; 35 }
2. 消息处理函数
1 LRESULT CALLBACK WinProc( 2 HWND hwnd, // handle to window 3 UINT uMsg, // message identifier 4 WPARAM wParam, // first message parameter 5 LPARAM lParam // second message parameter 6 ) 7 { 8 switch(uMsg) 9 { 10 case WM_PAINT: 11 HDC hDC; 12 PAINTSTRUCT ps; 13 hDC=BeginPaint(hwnd,&ps); 14 TextOut(hDC,0,0,"mfcjck",strlen("mfcjck")); 15 EndPaint(hwnd,&ps); 16 break; 17 case WM_DESTROY: 18 PostQuitMessage(0); 19 break; 20 default: 21 return DefWindowProc(hwnd,uMsg,wParam,lParam); 22 } 23 return 0; 24 }