zoukankan      html  css  js  c++  java
  • 1.1. chromium源代码分析

    本人能力有效,面对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 }
  • 相关阅读:
    【HDU 2874】Connections between cities(LCA)
    【Gym 100947C】Rotate It !!
    【CodeForces 615E】Hexagons
    Course Selection CodeChef
    UVA 10779 Collectors Problem[最大流]
    1855: [Scoi2010]股票交易[单调队列优化DP]
    1854: [Scoi2010]游戏[并查集]
    1853: [Scoi2010]幸运数字[容斥原理]
    poj3233 Matrix Power Series
    3969 [Mz]平方和【斐波那契平方和】
  • 原文地址:https://www.cnblogs.com/mfcjck/p/chromium001.html
Copyright © 2011-2022 走看看