程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【vc】1_Windows程序內部運行機制,1_windows運行機制

【vc】1_Windows程序內部運行機制,1_windows運行機制

編輯:C++入門知識

【vc】1_Windows程序內部運行機制,1_windows運行機制


 

創建一個Win32應用程序步驟:

  1、編寫WinMain函數;

  2、創建窗口(步驟如下):

    a、設計(一個)窗口類(WNDCLASS)

    b、注冊(該)窗口類

    c、創建窗口

    d、顯示並更新窗口

  3、編寫消息循環

 

  4、編寫窗口過程函數

 1 //WinMain.cpp
 2 #include <windows.h>
 3 #include <stdio.h>
 4 
 5 LRESULT CALLBACK WinAzeProc(
 6                             HWND hwnd,      // handle to window
 7                             UINT uMsg,      // message identifier
 8                             WPARAM wParam,  // first message parameter
 9                             LPARAM lParam   // second message parameter
10                             );
11 
12 int WINAPI WinMain(
13                    HINSTANCE hInstance,      // handle to current instance
14                    HINSTANCE hPrevInstance,  // handle to previous instance
15                    LPSTR lpCmdLine,          // command line
16                    int nCmdShow              // show state
17                    )
18 {
19     //設計一個窗口類
20     WNDCLASS wndcls;
21     wndcls.cbClsExtra = 0;
22     wndcls.cbWndExtra = 0;
23     wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
24     wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
25     wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);
26     wndcls.hInstance = hInstance;    //應用程序實例句柄由WinMain函數傳進來
27     wndcls.lpfnWndProc = WinAzeProc;
28     wndcls.lpszClassName = "aze_003";
29     wndcls.lpszMenuName = NULL;
30     wndcls.style = CS_HREDRAW | CS_VREDRAW;
31 
32     RegisterClass(&wndcls);    //注冊窗口類
33     
34     //創建窗口,定義一個變量用來保存成功創建後返回的句柄
35     HWND hwnd;    
36     hwnd = CreateWindow("aze_003", "first Application", WS_OVERLAPPEDWINDOW, 0, 0, 600, 500, NULL, NULL,hInstance, NULL);
37 
38     ShowWindow(hwnd, SW_SHOWNORMAL);    //顯示窗口
39     UpdateWindow(hwnd);        //刷新窗口
40 
41     //定義消息結構體,開始消息循環
42     MSG msg;
43     while( GetMessage(&msg, NULL, 0, 0) )
44     {
45         TranslateMessage(&msg);
46         DispatchMessage(&msg);
47     }
48     return msg.wParam;
49 }
50 
51 //編寫窗口過程函數
52 LRESULT CALLBACK WinAzeProc(
53                             HWND hwnd,      // handle to window
54                             UINT uMsg,      // message identifier
55                             WPARAM wParam,  // first message parameter
56                             LPARAM lParam   // second message parameter
57                             )
58 {
59     switch(uMsg)
60     {
61     case WM_CHAR:
62         char szChar[20];
63         sprintf(szChar, "char code is %d", wParam);
64         MessageBox(hwnd, szChar, "char", 0);
65         break;
66     case WM_LBUTTONDOWN:
67         MessageBox(hwnd, "mouse clicked", "message", 0);
68         HDC hdc;
69         hdc = GetDC(hwnd);        //不能在響應WM_PAINT消息時調用
70         TextOut( hdc, 0, 50, "程序員之家!",strlen("程序員之家!") );
71         ReleaseDC(hwnd, hdc);
72         break;
73     case WM_PAINT:
74         HDC hDC;
75         PAINTSTRUCT ps;
76         hDC = BeginPaint(hwnd, &ps);    //BeginPaint只能在響應WM_PAINT消息是調用
77         TextOut(hDC, 0, 0, "http://www.sunxin.org", strlen("http://www.sunxin.org"));
78         EndPaint(hwnd, &ps);
79         break;
80     case WM_CLOSE:
81         if( IDYES == MessageBox(hwnd, "是否真的退出?", "message", MB_YESNO) )
82         {
83             DestroyWindow(hwnd);
84         }
85         break;
86     case WM_DESTROY:
87         PostQuitMessage(0);
88         break;
89     default:
90         return DefWindowProc(hwnd, uMsg, wParam, lParam);
91     }
92     return 0;
93 }

 

 

窗口分:客戶區(是窗口的一部分) 和 非客戶區。

  標題欄、菜單欄、系統菜單、最小(大)化框、可調邊框統稱為窗口的非客戶區,由Windows系統管理;應用程序主要管理客戶區的外觀及操作(顯示文字、繪制圖形)。

  對話框、消息框也是一種窗口;對話框上還包括許多子窗口:按鈕、單選按鈕、復選框、組狂、文本編輯框等。

 

2、窗口與句柄:

  在Windows應用程序中,窗口是通過窗口句柄(HWND)來標識的;要對某個窗口進行操作,就必須要得到這個窗口的句柄

  句柄是Windows程序中一個重要的概念(圖標句柄(HICON)、光標句柄(HCURSOR)、畫刷句柄(HBRUSH))。

 

3、消息與消息隊列:

  Windows程序設計模式是一種事件驅動方式的程序設計模式,主要是基於消息的。(當系統感知到一事件時(如點擊鼠標),系統會將這個事件包裝成一個消息,投遞到應用程序的消息隊列中,然後應用程序從消息隊列中取出消息並進行響應。在這個處理過程中,操作系統也會給應用程序“發送消息”。“發送消息”:實際指:操作系統調用程序中一個負責處理消息的窗口過程函數)

  (1)消息:Windows中,消息由MSG結構體表示,如下:  

//The MSG structure contains message information from a thread's message queue. 

typedef struct tagMSG {
  HWND   hwnd;         //消息所屬的窗口,消息都是與窗口相關聯的
  UINT   message;      //the message identifier
  WPARAM wParam;       //指定消息的附加消息
  LPARAM lParam;       //指定消息的附加消息
  DWORD  time;         //消息投遞到隊列中的時間
  POINT  pt;           //鼠標的當前位置
} MSG, *PMSG; 

      Windows中,消息是由一個個數值表示的;Windows將消息對應的數值定義為WM_XXX宏(WM:Window Message)的形式,XXX對應某種消息的英文拼寫的大寫形式。如:WM_LBUTTONDOWN:鼠標左鍵按下消息、WM_KEYDOWN:鍵盤按下消息、WM_CHAR:字符消息···

  (2)消息隊列:每一個Windows應用程序開始執行後,系統都會為改程序創建一個消息隊列,這個消息隊列用來存放改程序創建的窗口的消息。

  (3)進隊消息不進隊消息

      進隊的消息將由系統放入到應用程序的消息隊列中,然後由應用程序取出並發送;

      不進隊消息在系統調用窗口過程時,直接發送給窗口;

      兩者最終都是有系統調用窗口過程函數對消息進行處理。

 

4、WinMain函數

  (一)

//The WinMain function is called by the system as the initial entry point for a Windows-based application. 

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line 指定傳遞給應用程序的*命令行*參數
  int nCmdShow              // show state 指定窗口應該如何顯示,如:最大(小)化、隱藏等
);

 

  (二)窗口類的結構體的定義

  (1)

typedef struct _WNDCLASS { 
    UINT       style;        //指定*這一類型*窗口的樣式,如:CS_HREDRAW、CS_VREDRAW、CS_NOCLOSE、CS_DBLCLKS
    WNDPROC    lpfnWndProc;     //函數指針,指向窗口過程函數(窗口過程函數是一回調函數)
    int        cbClsExtra;     //一般為0
    int        cbWndExtra;     //同上
    HINSTANCE  hInstance;     //指定包含窗口過程的程序的實例句柄
    HICON      hIcon;         //指定窗口類的圖標句柄
    HCURSOR    hCursor;     //指定窗口類的光標句柄
    HBRUSH     hbrBackground;     //指定窗口類的背景畫刷句柄;當窗口發生重繪值,系統使用這裡指定的畫刷來查處窗口的背景
    LPCTSTR    lpszMenuName;     //指定菜單資源的名字  **菜單並不是一個窗口**
    LPCTSTR    lpszClassName;     //指定窗口類的名字
} WNDCLASS, *PWNDCLASS; 

 

 

  回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時有另一方調用的,用於該事件或條件進行響應。

  *回調函數的實現機制是:

    ①定義一個回調函數。

    ②提供函數實現的一方在初始化的時候,將回調函數的函數指針注冊給調用者。

    ③當特定的事件或條件發生的時候,調用者使用函數指針調用回調函數對事件進行處理。

  **針對Windows的消息處理機制,窗口過程函數被調用的過程如下:

    ①在設計窗口類的時候,將窗口過程函數的地址賦值給lpfnWndProc成員變量;

    ②調用RegisterClass(&wndclass)注冊窗口類,那麼系統就有了我們所編寫的窗口過程函數的地址。

    ③當應用程序接收到某一窗口的消息時,調用DispatchMessage(&msg)將對消息回傳給系統。系統則利用先前注冊窗口類時得到的函數指針,調用窗口過程函數對消息進行處理。

  

  提示:一個Windows程序可以包含多個窗口過程函數,一個窗口過程總是與某一個特定的窗口類相關聯(通過WNDCLASS結構體中的lpfnWndProc成員變量指定),基於該窗口類創建的窗口使用同一個窗口過程。

  lpfnWndProc成員變量的類型是WNDPROC,定義如下: typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); //LRESULT=long, CALLBACK=_stdcall WNDPROC是函數指針類型。

  注意:WNDPROC被定義為指向窗口過程函數的指針類型,窗口過程函數的格式必須與WNDPROC相同。

 

  在VC++中,資源是通過標識符(ID)來標識的,同一個ID可以標識多個不同的資源(資源的ID本質上是一個整數)。如:菜單資源:IDM_XXX(M表示Menu)、圖標資源:IDI_XXX(I表示圖標)、按鈕資源:IDB_XXX(B表示Button)

 

  可以調用GetStockObject(int fnObject) 來得到系統的標准畫刷。聲明如下:

//The GetStockObject function retrieves a handle to one of the stock pens, brushes, fonts, or palettes. 

HGDIOBJ GetStockObject(
  int fnObject   // stock object type
);

  ·GetStockObject函數:返回多種資源對象的句柄,如:畫刷、畫筆、字體、調色板等;

  ·函數返回時,需進行類型轉換。如: wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 

 

  (2)注冊窗口類:設計窗口類(WNDCLASS)後,需要調用RegisterClass函數對其進行注冊,注冊成功後,才可以創建該類型的窗口。聲明如下:

ATOM RegisterClass(
  CONST WNDCLASS *lpWndClass  // class data, 窗口類對象的指針
                              // Pointer to a WNDCLASS structure. You must fill the structure with the appropriate class attributes before passing it to the function. 
);

 

 

 

 

  (3)創建窗口:CreateWindow函數聲明如下:

HWND CreateWindow(
  LPCTSTR lpClassName,  // registered class name 即:窗口類WNDCLASS的lpszClassName成員指定的名稱(必須先注冊)
  LPCTSTR lpWindowName, // window name    指定窗口的名字
  DWORD dwStyle,        // window style 指定創建窗口的樣式 如:WS_OVERLAPPEDWINDOW
  int x,                // horizontal position of window
  int y,                // vertical position of window
  int nWidth,           // window width
  int nHeight,          // window height
  HWND hWndParent,      // handle to parent or owner window 指定被創建窗口的父窗口句柄
  HMENU hMenu,          // menu handle or child identifier
  HINSTANCE hInstance,  // handle to application instance
  LPVOID lpParam        // window-creation data 作為WM_CREATE消息的附加參數lParam傳入的數據指針(一般為:NULL)
);

  ·如果窗口創建成功,CreateWindow函數將返回系統為該窗口分配的句柄;否則,返回NULL。

  ·注意:在創建窗口之前應先定義一個窗口句柄變量來接收創建窗口之後的句柄值。

顯示及更新窗口:

  (4)顯示窗口:ShowWindow聲明如下:

BOOL ShowWindow(
  HWND hWnd,     // handle to window  該參數為成功創建窗口後返回的那個窗口句柄
  int nCmdShow   // show state 如:SW_HIDE、SW_SHOW、SW_SHOWNORMAL、SW_SHOWMINIMIZED、SW_SHOWMAXIMIZED··
);

  (5)更新(刷新)窗口:UpdateWindow函數聲明原型如下:

BOOL UpdateWindow(
  HWND hWnd   // handle to window  創建成功後的窗口句柄
);

  ·UpdateWindow函數通過發送一個WM_PAINT消息來刷新窗口,UpdateWindow將WM_PAINT消息直接發送給了窗口過程函數進行處理,而沒有放到消息隊列裡面(不進隊消息?)。

 

(三)、消息循環

    窗口 創建、顯示、更新後;需要編寫一個消息循環,不斷的從消息隊列中取出消息,並進行響應。

  GetMessage()函數:從消息隊列中取出消息

BOOL GetMessage(
  LPMSG lpMsg,         // message information 指向一個消息(MSG)結構體,GetMessage從線程的消息隊列中取出的消息信息將保存在該結構體對象中
  HWND hWnd,           // handle to window 指定接收屬於哪一個窗口的消息;NULL:用於接收屬於調用線程的所有窗口的窗口消息
  UINT wMsgFilterMin,  // first message 指定獲取打的消息的最小值
  UINT wMsgFilterMax   // last message 如果wMsgFilterMin=0和wMsgFilterMax=0,則接收所有消息
);

  ·**GetMessage函數接收到除WM_QUIT外的消息均返回非零值。

//消息循環代碼,一般形式
    MSG msg;
    while( GetMessage(&msg, NULL, 0, 0) )
    {
        TranslateMessage(&msg);  //TranslateMessage函數將虛擬鍵消息*轉換*為字符消息,被投遞到調用線程的消息隊列中,當下一次調用GetMessage函數時被取出
        DispatchMessage(&msg);   //DispatchMessage函數分派一個消息到窗口過程,有窗口過程函數對消息進行處理
                           //DispatchMessage實際上是將消息會傳給操作系統,有操作系統調用窗口過程函數對消息進行處理(響應)
    }

 

 

 

  Windows應用程序的消息處理機制

  Windows應用程序的消息處理過程

    (1)操作系統就收到應用程序的窗口消息,將消息投遞到該應用程序的消息隊列中。

    (2)應用程序在消息循環匯總調用GetMessage函數從消息隊列中取出一條一條的消息。取出消息後,應用程序可以對消息進行一些預處理,如:放棄對某些消息的響應,或者調用TranslateMessage產生新的消息。

    (3)應用程序調用DisPatchMessage,將消息回傳給操作系統。消息是由MSG結構體對象來表示的,其中就包含了接收消息的窗口的句柄。故:DisPatchMessage函數總能進行正確的傳遞。

    (4)操作利用WNDCLASS結構體的lpfnWndProc成員保存的窗口過程函數的指針調用窗口過程,對消息進行處理(即“系統給應用程序發送了消息”)。

提示:

  (1)從消息隊列中獲取消息還可以調用PeekMessage函數,函數原型如下:

BOOL PeekMessage(
  LPMSG lpMsg,         // message information
  HWND hWnd,           // handle to window
  UINT wMsgFilterMin,  // first message
  UINT wMsgFilterMax,  // last message
  UINT wRemoveMsg      // removal options
);

    ·前四個參數與GetMessage函數的參數作用相同;

    ·最後一個參數指定消息獲取的方式;如果設為PM_NOREMOVE, 那麼消息將不會從消息隊列中被移除;如果設為PM_REMOVE, 那麼消息將從消息隊列中被移除(與GetMessage函數的行為一致)

  (2)發送消息可以使用SendMessage和PostMessage函數。

      ·SendMessage將消息直接發送給窗口,並調用該窗口的窗口過程進行處理;在窗口過程對消息處理完畢後,該函數才返回(SendMessage發送的消息為不進隊消息)。

      ·PostMessage函數將消息放入與創建窗口的線程相關聯的消息隊列後立即返回。

      ·PostThreadMessage函數,用於向線程發送消息。

      ·對於線程消息,MSG結構體中的hwnd成員為NULL。

 

(四)、編寫窗口過程函數:用於處理發送給窗口的消息

LRESULT CALLBACK WindowProc(    //窗口過程函數的名字可以隨便取,如:WinAzeProc,但函數聲明與定義要一致;
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier  消息代碼
  WPARAM wParam,  // first message parameter  消息代碼的兩個附加值
  LPARAM lParam   // second message parameter
);

 

提示:系統通過窗口過程函數的地址(指針)來調用窗口過程函數,而不是名字(??)。

 1 //編寫窗口過程函數
 2 LRESULT CALLBACK WinAzeProc(
 3                             HWND hwnd,      // handle to window
 4                             UINT uMsg,      // message identifier
 5                             WPARAM wParam,  // first message parameter
 6                             LPARAM lParam   // second message parameter
 7                             )
 8 {
 9     switch(uMsg)
10     {
11     case WM_CHAR:    //通過調用TranslateMessage函數轉換得到
12         char szChar[20];
13         sprintf(szChar, "char code is %d", wParam);
14         MessageBox(hwnd, szChar, "char", 0);
15         break;
16     case WM_LBUTTONDOWN:
17         MessageBox(hwnd, "mouse clicked!", "message", 0);
18         HDC hdc;
19         hdc = GetDC(hwnd);        //用hdc保存GetDC函數返回的與特定窗口相關聯的DC的句柄。
20                                 //GetDC()不能在響應WM_PAINT消息時調用
21         TextOut( hdc, 0, 50, "程序員之家!",strlen("程序員之家!") );   //TextOut利用得到的DC句柄在指定的位置(0,50)出輸出一行文字
22         ReleaseDC(hwnd, hdc);    //釋放hdc
23         break;
24     case WM_PAINT:    //當窗口客服區的一部分或者全部變為“無效”時,系統會發送WM_PAINT消息,通知應用程序重新繪制窗口
25                     //窗口剛創建時,客戶區是無效狀態,當調用UpdateWindow函數時,會發送WM_PAINT消息給窗口過程,對窗口進行刷新
26                     //當窗口從無到有、改變尺寸、最小化在恢復、被其他窗口遮蓋後在顯示時,窗口的客戶區都將變為無效,此時系統會給應用程序發送WM_PAINT消息,通知應用程序重新繪制
27                     //提示:窗口大小發生變化時,是否發生重繪,取決於WNDCLASS結構體中style成員是否設置了CS_HREDRAW和CS_VREDRAW標志
28         HDC hDC;
29         PAINTSTRUCT ps;        //ps用於接收繪制的信息
30         hDC = BeginPaint(hwnd, &ps);    //BeginPaint只能在響應WM_PAINT消息是調用
31         TextOut(hDC, 0, 0, "http://www.sunxin.org", strlen("http://www.sunxin.org"));  
32         EndPaint(hwnd, &ps);
33         break;
34     case WM_CLOSE:
35         if( IDYES == MessageBox(hwnd, "是否真的退出?", "message", MB_YESNO) )
36         {
37             DestroyWindow(hwnd);
38         }
39         break;
40     case WM_DESTROY:
41         PostQuitMessage(0);
42         break;
43     default:
44         return DefWindowProc(hwnd, uMsg, wParam, lParam);  //DefWindowProc調用默認的窗口過程,對應用程序沒有處理的其他消息提供默認處理。
45                                                            //對於大多數的消息,應用程序可以直接調用DefWindowProc函數進行處理。
46                                                            //在編寫窗口過程時,應將DefWindowProc函數的調用放到default語句中,並將該函數的返回值作為窗口過程函數的返回值。
47     }
48     return 0;
49 }

 

 

 

提示:要在窗口中輸出文字或者顯示圖形,需要用到設備描述表(Device ConText)。

設備描述表(簡稱DC)

  DC是一個包含設備(物理輸出設備,如顯示器、設備驅動器)信息的結構體,在Windows平台下,所有的圖形操作都是利用DC來完成的。

 

第30、31行代碼:  在調用BeginPaint時,如果客戶區的背景還沒有被擦除,那麼BeginPaint會發送WM_ERASEBKGND消息給窗口,系統就會使用WNDCLASS結構體的hbrBackGround成員指定的畫刷來        擦除背景。如果我們想要讓某個圖形時鐘在窗口中顯示,就應該將圖形的繪制操作放到響應WM_PAINT消息的代碼中,如TextOut()的位置。

 

第34-48行代碼:  DestroyWindow函數在銷毀窗口後會向窗口過程發送WM_DESTROY消息。注意:此時窗口雖然銷毀了,但應用程序並沒有退出。故:如果自己要控制程序是否退出,應該在WM_CLOSE消        息的響應代碼中完成。

           對WM_CLOSE消息的響應並不是必須的,如果應用程序沒有對該消息進行響應,系統將把這條消息傳給DefWindowProc函數,而DefWindowProc函數則條用DestroyWindow函數來響應         這條WM_CLOSE消息。

第40-42行代碼:  DestroyWindow函數在銷毀窗口後,會給窗口過程發送WM_DESTROY消息, 然後在該消息的響應代碼中調用PostQuitMessage函數。PostQuitMessage函數項應用程序的消息隊列中投        遞一條WM_QUIT消息並返回。GetMessage函數只有在收到WM_QUIT消息時才返回0,此時消息循環才結束,程序退成。

          想讓程序正常退出,我們必須響應WM_DESTROY消息,並在消息響應代碼中調用PostQuitMessage,向應用程序的消息隊列中投遞WM_QUIT消息。傳遞給PostQuitMessage函數的參數值        將作為WM_QUIT消息的wParam參數,這個值通常用做WinMain函數的返回值。


菜鳥助真正懂VC++的:VC++哪本書最經典?

《VC++深入詳解》一書由孫鑫老師和余安萍合著,此書是本套視頻的配套書籍,和視頻互為補充。大家可以將視頻和書結合在一起學習,這樣能更快、更好的掌握VC++編程。此外,本書也可以作為學完視頻後的復習用書,以及開發過程中的參考用書。本書已由電子工業出版社出版,預計在2006年4月上市。

內容簡介
本書從實際應用入手,由淺入深、循序漸進地講述了Windows程序內部運行機制、MFC框架、文本、菜單、對話框、文件操作、網絡編程、進程間通信、ActiveX控件、動態鏈接庫、HOOK編程等多個主題。
不同於一般的講述VC++使用的書籍,本書主要從程序內部運行的機制和MFC程序的組織脈絡入手,使讀者在 學習VC++編程知識時,既能夠知其然,又能知其所以然,從而幫助讀者從根本上理解和掌握Windows的程序設計。另外,全書還貫穿了作者多年來學習編程的一些經驗,以及一些學習方法的建議,這為讀者進一步的學習提供了指導。
本書內容豐富、實用性強,許多代碼可以直接應用到工程項目中。
本書適合於VC++6.0的初學者和使用VC++從事開發的程序員,對於具有一定VC++編程經驗的讀者,也具有很好的參考價值。

本書的內容組織
本書在內容的組織上循序漸進、由淺入深;在知識的介紹上,從內到外、從原理到實踐。
第1章幫助讀者掌握Windows平台下程序運行的內部機制,第2章幫助讀者復習C++中的重要知識,為後續知識的學習打下良好的基礎。第3章重點剖析MFC框架程序的運行脈絡,並與第1章的知識做對照,為讀者徹底掃清學習MFC的迷霧,相信通過這章的學習,很多以前學過MFC的讀者都會有一種恍然大悟的感覺。前三章可以歸為基礎部分,從第4章開始就是實際應用開發的講解了,包括了繪圖、文本、菜單、對話框、定制程序外觀、圖形保存和重繪、文件和注冊表操作、網絡編程、多線程、進程間通信、ActiveX控件、動態鏈接庫、HOOK編程等多個主題,並且每一章都有一個完整的例子。
本書的講解理論結合實際,選用的例子和代碼具有相當的代表性和實用價值,作者和作者的學員曾經在開發項目的時候,就直接使用過很多書中的代碼。
 

VC++深入詳解(修訂版)與老版有什不一樣

看看目錄。
《老版》
第1章 Windows程序內部運行機制
第2章 掌握C++
第3章 MFC框架程序剖析
第4章 簡單繪圖
第5章 文本編程
第6章 菜單
第7章 對話框(一)
第8章 對話框(二)
第9章 定制應用程序外觀
第10章 繪圖控制
第11章 圖形的保存和重繪
第12章 文件和注冊表操作
第13章 文檔與串行化
第14章 網絡編程
第15章 多線程
第16章 線程同步與異味步套按字編程
第17章 進程間通信
第18章 ActiveX控件
第19章 動態鏈接庫
第20章 HOOK和數據庫訪問
《修訂版》
第1章 Windows程序內部運行機制
第2章 掌握C++
第3章 MFC框架程序剖析
第4章 簡單繪圖
第5章 文本編程
第6章 菜單
第7章 對話框(一)
第8章 對話框(二)
第9章 定制應用程序外觀
第10章 繪圖控制
第11章 圖形的保存和重繪
第12章 文件和注冊表操作
第13章 文檔與串行化
第14章 網絡編程
第15章 多線程
第16章 線程同步與異步
第17章 進程間通信
第18章 ActiveX控件
第19章 動態鏈接庫
第20章 HOOK和數據庫訪問
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved