Ⅰ Windows核心編程的目錄
譯者序
前言
作譯者簡介
第一部分 程序員必讀
第1章 錯誤處理
1.1 自定義錯誤處理的實現
1.2 錯誤顯示常式
第2章 Unicode
2.1字元集
2.1.1 單位元組和雙位元組字元集
2.1.2 Unicode:寬位元組字元集
2.2 為何需要Unicode
2.3 Windows 2000和Unicode
2.4 Windows 98和Unicode
2.5 Windows CE和Unicode
2.6 評論
2.7 關於COM
2.8 如何編寫Unicode源代碼
2.8.1 C運行庫的Unicode支持
2.8.2 Windows定義的Unicode數據類型
2.8.3 Windows系統中的Unicode函數和ANSI函數
2.8.4 Windows字元串函數
2.9 讓應用程序符合ANSI和Unicode規范
2.9.1 Windows字元串函數
2.9.2 資源
2.9.3 確定文本是ANSI型還是Unicode型
2.9.4 在Unicode和ANSI間轉換字元串
第3章內核對象
3.1內核對象的概念
3.1.1 使用計數
3.1.2 安全性
3.2內核對象句柄表
3.2.1 創建內核對象
3.2.2 關閉內核對象
3.3 進程間內核對象的共享
3.3.1 對象句柄的繼承性
3.3.2 改變句柄標志
3.3.3 命名對象
3.3.4終端伺服器命名空間
3.3.5 復制對象句柄
第二部分 完成編程任務
第4章 進程
4.1 編寫第一個Windows應用程序
4.1.1 進程的實例句柄
4.1.2 進程的前一個實例句柄
4.1.3 進程的命令行
4.1.4 進程的環境變數
4.1.5 親緣性
4.1.6 進程的錯誤模式
4.1.7 當前驅動器和目錄
4.1.8當前目錄
4.1.9 系統版本
4.2 CreateProcess函數
4.2.1 pszApplicationName和pszCommandLine
4.2.2 psaProcess、psaThread和bInheritHandles
4.2.3 fdwCreate
4.2.4 pvEnvironment
4.2.5 pszCurDir
4.2.6 psiStartInfo
4.2.7 ppiProcInfo
4.3 進程的終止
4.3.1主線程的入口函數返回
4.3.2 ExitProcess函數
4.3.3 TerminateProcess函數
4.3.4 進程中所有線程的運行終止
4.3.5 進程的運行終止
4.4 子進程
4.5 枚舉系統中運行的進程
第5章 作業
5.1 對作業進程的限制
5.2 把進程放入作業
5.3 終止作業中所有進程的運行
5.4 查詢作業統計信息
5.5 作業通知信息
5.6 JobLab示例應用程序
第6章 線程的基本知識
6.1 創建線程的時機
6.2 何時不能創建線程
6.3 編寫第一個線程函數
6.4 CreateThread函數
6.4.1 psa
6.4.2 cbStack
6.4.3 pfnStartAddr和pvParam
6.4.4 fdwCreate
6.4.5 pdwThreadID
6.5 終止線程
6.5.1 線程函數返回
6.5.2 ExitThread函數
6.5.3TerminateThread函數
6.5.4 在進程終止運行時終止線程
6.5.5 線程終止運行時發生的操作
6.6 線程的一些內部細節
6.7 對於C/C++運行時庫的考慮
6.7.1 Oops—錯誤地調用了CreateThread
6.7.2 不該調用的C/C++運行時庫函數
6.8 線程的身份標識
第7章 線程的調度、優先順序和親緣性
7.1 掛起和恢復線程的運行
7.2 進程的掛起和喚醒
7.3 睡眠
7.4 線程切換
7.5 線程的運行時間
7.6 上下文環境切換
7.7 線程優先順序
7.8 優先順序的抽象說明
7.9 編程優先順序
7.9.1 動態提高線程的優先順序等級
7.9.2 為前台進程調整調度程序
7.9.3 Scheling Lab示例應用程序
7.10 親緣性
第8章 用戶模式下的線程同步
8.1 原子訪問:互鎖函數族
8.2 高速緩存行
8.3 高級線程同步
8.4臨界區
8.4.1臨界區准確的描述
8.4.2臨界區與循環鎖
8.4.3臨界區與錯誤處理
8.4.4 有用的提示和技巧
第9章 線程與內核對象的同步
9.1等待函數
9.2 成功等待的副作用
9.3 事件內核對象
9.4 等待定時器內核對象
9.4.1 用等待定時器給APC項排隊
9.4.2定時器的鬆散特性
9.5信號量內核對象
9.6 互斥內核對象
9.6.1 釋放問題
9.6.2互斥對象與臨界區的比較
9.6.3 Queue應用程序示例
9.7線程同步對象表
9.8 其他線程同步函數
9.8.1 非同步設備I/O
9.8.2WaitForInputIdle
9.8.3 MsgWaitForMultipleObjects(Ex)
9.8.4 WaitForDebugEvent
9.8.5SignalObjectAndWait
第10章線程同步工具包
10.1臨界區的實現:Optex
10.2 創建線程安全的數據類型和反信號量
10.3 單寫入多讀出程序的保護
10.4 WaitForMultipleExpressions函數的實現
第11章線程池
11.1 場景1:非同步調用函數
11.2 場景2:按規定的時間間隔調用函數
11.3 場景3:在某個內核對象變為已通知狀態時調用函數
11.4 場景4:非同步I/O請求運行完成時調用函數
第12章纖程
12.1 使用纖程
12.2 Counter示例應用程序
第三部分內存管理
第13章 Windows內存結構
13.1 進程的虛擬地址空間
13.2 虛擬地址空間分區
13.2.1 無效斷點分配分區(適於Windows 2000和Windows 98)
13.2.2MS-DOS/16位Windows應用程序兼容分區(僅適於Windows 98)
13.2.3 用戶模式分區(適用Windows 2000和Windows 98)
13.2.4 64KB禁止進入分區(僅適用於Windows 2000)
13.2.5 共享的MMF分區(僅適用於Windows 98)
13.2.6 內核模式分區(使用於Windows 2000和Windows 98)
13.3地址空間區域
13.4 在地址空間區域中提交物理存儲器
13.5 物理存儲器和頁面文件
13.6 保護屬性
13.6.1 Copy-On-Write訪問
13.6.2 特殊訪問保護屬性標志
13.7 綜合使用所有元素
13.7.1 區域的內部詳情
13.7.2 Windows 98上地址空間的差異
13.8 數據對齊的重要性
第14章虛擬內存
14.1系統信息
14.2虛擬內存的狀態
14.3 確定地址空間狀態
14.3.1 VMQery函數
14.3.2虛擬內存表應用程序示例
第15章應用程序中虛擬內存的使用
15.1地址空間中保留區域
15.2 在保留區域中提交存儲器
15.3 同時進行保留區域並提交內存
15.4 何時提交物理存儲器
15.5 物理存儲器的回收和地址空間區域的釋放
15.5.1 何時回收物理存儲器
15.5.2虛擬內存分配示例應用程序
15.6 改變保護屬性
15.7 清除物理存儲器內容
15.8 地址窗口擴展(僅使用於Windows 2000)
第16章 線程棧
16.1 Windows 98下的線程棧
16.2 C/C++運行時庫中的棧檢測函數
16.3 Summation示例應用程序
第17章內存映射文件
17.1 內存映射的可執行文件和DLL文件
17.1.1可執行文件或DLL的多個實例之間無法共享的靜態數據
17.1.2 在可執行文件或DLL的多個實例之間共享靜態數據
17.1.3 AppInst示例應用程序
17.2 內存映射數據文件
17.2.1 方法1:一個文件,一個緩存
17.2.2 方法2:兩個文件,一個緩存
17.2.3 方法3:一個文件,兩個緩存
17.2.4 方法4:一個文件,零個緩存
17.3 使用內存映射文件
17.3.1 步驟1:創建或打開文件內核對象
17.3.2 步驟2:創建文件映射內核對象
17.3.3 步驟3:將文件數據映射到進程地址空間
17.3.4 步驟4:進程地址空間中撤銷文件數據的映像
17.3.5 步驟5和步驟6:關閉文件映射對象和文件對象
17.3.6 文件倒序示例應用程序
17.4 使用內存映射文件處理大文件
17.5內存映射文件的一致性
17.6 設定內存映射文件的基地址
17.7 實現內存映射文件的具體細節
17.8 使用內存映射文件在進程之間實現數據共享
17.9 受頁面文件支持的內存映射文件
17.10 稀疏提交的內存映射文件
第18章 堆
18.1 進程的默認堆
18.2 創建輔助堆的原因
18.2.1 保護組件
18.2.2 更有效地管理內存
18.2.3 進行本地訪問
18.2.4 減少線程同步開銷
18.2.5 快速釋放
18.3 創建輔助堆的方法
18.3.1 分配堆中的內存塊
18.3.2 改變內存塊的大小
18.3.3 獲取內存塊的大小
18.3.4 釋放內存塊
18.3.5 銷毀堆
18.3.6 用C++程序使用堆
18.4 其他堆函數
第四部分動態鏈接庫
第19章 DLL基礎
19.1 DLL與進程的地址空間
19.2 DLL的總體運行情況
19.3 創建DLL模塊
19.3.1 導出的真正含義
19.3.2 使用非Visual C++工具創建DLL
19.4 創建可執行模塊
19.5 運行可執行模塊
第20章 DLL高級技術
20.1 顯式載入DLL模塊和符號鏈接
20.1.1 顯式載入DLL模塊
20.1.2 顯式卸載DLL模塊
20.1.3 顯式鏈接到導出符號
20.2 DLL的入口函數
20.2.1 DLL_PROCESS_ATTACH通知
20.2.2 DLL_PROCESS_DETACH通知
20.2.3 DLL_THREAD_ATTACH通知
20.2.4 DLL_THREAD_DETACH通知
20.2.5順序調用DllMain
20.2.6 DllMain和C/C++運行時庫
20.3延遲載入DLL
20.4 函數轉發器
20.5 已知的DLL
20.6 DLL重定向
20.7 模塊的基址重置
20.8 綁定模塊
第21章 線程本地存儲
21.1 動態TLS
21.2 靜態TLS
第22章 DLL注入以及API掛接
22.1 DLL注入:一個例子
22.2 使用注冊表注入DLL
22.3 使用Windows鉤子注入DLL
22.4 使用遠程線程注入DLL
22.4.1 Inject Library示例應用程序
22.4.2 Image Walk DLL
22.5 使用特洛伊DLL注入DLL
22.6 將DLL作為調試程序注入
22.7 在Windows 98平台上使用內存映射文件注入代碼
22.8 使用CreateProcess來注入代碼
22.9 API掛接:一個例子
22.9.1 通過覆寫代碼實現API掛接
22.9.2 通過操作模塊的導入部分來實現API掛接
22.9.3 LastMsgBoxInfo示例應用程序
第五部分結構化異常處理
第23章 終止處理常式
23.1 Funcenstein1
23.2 Funcenstein2
23.3 Funcenstein3
23.4 Funcfurter1
23.5 小測驗:FuncaDoodleDoo
23.6 Funcenstein4
23.7 Funcarama1
23.8 Funcarama2
23.9 Funcarama3
23.10 Funcarama4:最終的邊界
23.11 有關finally塊的說明
23.12 Funcfurter2
23.13 SEH終止示例應用程序
第24章 異常處理程序和軟體異常
24.1 通過例子理解異常過濾器和異常處理程序
24.1.1 Funcmeister1
24.1.2 Funcmeister2
24.2 EXCEPTION_EXECUTE_HANDLER
24.2.1 一些有用的例子
24.2.2 全局展開
24.2.3 暫停全局展開
24.3 EXCEPTION_CONTINUE_EXECUTION
24.4 EXCEPTION_CONTINUE_SEARCH
24.5GetExceptionCode
24.5.1 與內存相關的異常
24.5.2 與異常相關的異常
24.5.3 與調試相關的異常
24.5.4 與整數相關的異常
24.5.5 與浮點數相關的異常
24.6 GetExceptionInformation
24.7軟體異常
第25章 未處理異常和C++異常
25.1 即時調試
25.2 關閉異常消息框
25.2.1 強制進程終止運行
25.2.2 包裝一個線程函數
25.2.3 包裝所有的線程函數
25.2.4 自動調用調試器
25.3 自己調用UnhandledExceptionFilter
25.4 UnhandledExceptionFilter函數的內部細節
25.5 異常和調試程序
25.6 C++異常與結構化異常比較
第六部分 窗口
第26章 窗口消息
26.1 線程的消息隊列
26.2 將消息投送到一個線程的消息隊列中
26.3 向窗口發送消息
26.4 喚醒一個線程
26.4.1 隊列狀態標志
26.4.2 從線程隊列中提取消息的演算法
26.4.3 使用內核對象或者隊列狀態標志來喚醒一個線程
26.5 使用消息發送數據
26.6 Windows處理ANSI/Unicode字元和字元串的方法
第27章 硬體輸入模型與本地輸入狀態
27.1 原始輸入線程
27.2 本地輸入狀態
27.2.1 鍵盤輸入和焦點
27.2.2 滑鼠游標管理
27.3 將虛擬輸入隊列和本地輸入狀態相關聯
27.3.1 LISLab示例應用程序
27.3.2 LISWatch示例應用程序
附錄
附錄A 構建環境
附錄B 消息解析器、子控制項宏以及API宏
Ⅱ opengl在windows系統下編程,如何實現在窗口外繪圖
二、生成OpenGL程序的基本步驟和條件 本文將給出一個例子,這個例子是一個用OpenGL顯示圖像的Windows程序,通過這個程序我們也可以知道用OpenGL編程的基本要求。我們知道,GDI是通過設備句柄(Device Context以下簡稱"DC")來繪圖,而OpenGL則需要繪制環境(Rendering Context,以下簡稱"RC")。每一個GDI命令需要傳給它一個DC,與GDI不同,OpenGL使用當前繪制環境(RC)。一旦在一個線程中指定了一個當前RC,所有在此線程中的OpenGL命令都使用相同的當前RC。雖然在單一窗口中可以使用多個RC,但在單一線程中只有一個當前RC。本例將首先產生一個OpenGL RC並使之成為當前RC,分為三個步驟:設置窗口像素格式;產生RC;設置為當前RC。 一、首先創建工程 用AppWizard產生一個EXE文件,選擇工程目錄,並在工程名字中輸入"GLSample一",保持其他的不變;第一步、選單文檔(SDI);第二步、不支持資料庫;第三步、不支持OLE;第四步、不選中浮動工具條、開始狀態條、列印和預覽支持、幫助支持的復選框(選中也可以,本文只是說明最小要求),選中三維控制(三D Controls);第五步、選中產生源文件注釋並使用MFC為共享動態庫;第六步、保持預設選擇。按Finish結束,工程創建完畢。 二、將此工程所需的OpenGL文件 和庫加入到工程中 在工程菜單中,選擇"Build"下的"Settings"項。單擊"Link"標簽,選擇"General"目錄,在Object/Library Moles的編輯框中輸入"OpenGL三二.lib glu三二.lib glaux.lib"(注意,輸入雙引號中的內容,各個庫用空格分開;否則會出現鏈接錯誤),選擇"OK"結束。然後打開文件"stdafx.h",將下列語句插入到文件中(劃下劃線的語句為所加語句): #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers #include // MFC core and standard components #include // MFC extensions #include #include #ifndef _AFX_NO_AFXCMN_SUPPORT #include // MFC support for Windows 95 Common Controls #endif // _AFX_NO_AFXCMN_SUPPORT 三、改寫OnPreCreate函數並給視 類添加成員函數和成員變數 OpenGL需要窗口加上WS_CLIPCHILDREN(創建父窗口使用的Windows風格,用於重繪時裁剪子窗口所覆蓋的區域)和 WS_CLIPSIBLINGS(創建子窗口使用的Windows風格,用於重繪時剪裁其他子窗口所覆蓋的區域)風格。把OnPreCreate改寫成如下所示: BOOL CGLSample一View::PreCr- eateWindow(CREATESTRUCT& cs) { cs.style |= (WS_CLIPCHI- LDREN | WS_CLIPSIBLINGS); return CView::PreCreate- Window(cs); } 產生一個RC的第一步是定義窗口的像素格式。像素格式決定窗口著所顯示的圖形在內存中是如何表示的。由像素格式控制的參數包括:顏色深度、緩沖模式和所支持的繪畫介面。在下面將有對這些參數的設置。我們先在CGLSample一View的類中添加一個保護型的成員函數BOOL SetWindowPixel-Format(HDC hDC)(用滑鼠右鍵添加),並編輯其中的代碼,見程序一。 BOOL CGLSample一View::SetWindowPixelFormat(HDC hDC) { PIXELFORMATDESCRIPTOR pixelDesc; pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR); pixelDesc.nVersion = 一; pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OpenGL | PFD_SUPPORT_GDI | PFD_STEREO_DONTCARE; pixelDesc.iPixelType = PFD_TYPE_RGBA; pixelDesc.cColorBits = 三二; pixelDesc.cRedBits = 吧; pixelDesc.cRedShift = 一陸; pixelDesc.cGreenBits = 吧; pixelDesc.cGreenShift = 吧; pixelDesc.cBlueBits = 吧; pixelDesc.cBlueShift = 0; pixelDesc.cAlphaBits = 0; pixelDesc.cAlphaShift = 0; pixelDesc.cAccumBits = 陸四; pixelDesc.cAccumRedBits = 一陸; pixelDesc.cAccumGreenBits = 一陸; pixelDesc.cAccumBlueBits = 一陸; pixelDesc.cAccumAlphaBits = 0; pixelDesc.cDepthBits = 三二; pixelDesc.cStencilBits = 吧; pixelDesc.cAuxBuffers = 0; pixelDesc.iLayerType = PFD_MAIN_PLANE; pixelDesc.bReserved = 0; pixelDesc.dwLayerMask = 0; pixelDesc.dwVisibleMask = 0; pixelDesc.dwDamageMask = 0; m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc); if (m_GLPixelIndex==0) // Lets choose a default index. { m_GLPixelIndex = 一; if (DescribePixelFormat(hDC, m_GLPixelIndex, sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc)==0) { return FALSE; } } if (SetPixelFormat( hDC, m_GLPixelIndex, &pixelDesc)==FALSE) { return FALSE; } return TRUE; } 接著用滑鼠右鍵在CGLSample一View中添加保護型的成員變數: int m_GLPixelIndex; 四、用ClassWizard添加WM_CREATE的消息處理函數OnCreate 添加OnCreate函數後如程序一所示。 至此,OpenGL工程的基本框架就建好了。但如果你現在運行此工程,則它與一般的MFC程序看起來沒有什麼兩樣。 5、代碼解釋 現在我們可以看一看Describe-PixelFormat提供有哪幾種像素格式,並對代碼進行一些解釋: PIXELFORMATDESCRIPTOR包括了定義像素格式的全部信息。 DWFlags定義了與像素格式兼容的設備和介面。 通常的OpenGL發行版本並不包括所有的標志(flag)。wFlags能接收以下標志: PFD_DRAW_TO_WINDOW 使之能在窗口或者其他設備窗口畫圖; PFD_DRAW_TO_BITMAP 使之能在內存中的點陣圖畫圖; PFD_SUPPORT_GDI 使之能調用GDI函數(註:如果指定了PFD_DOUBLEBUFFER,這個選項將無效); PFD_SUPPORT_OpenGL 使之能調用OpenGL函數; PFD_GENERIC_FORMAT 假如這種象素格式由Windows GDI函數庫或由第三方硬體設備驅動程序支持,則需指定這一項; PFD_NEED_PALETTE 告訴緩沖區是否需要調色板,本程序假設顏色是使用二四或 三二位色,並且不會覆蓋調色板; PFD_NEED_SYSTEM_PALETTE 這個標志指明緩沖區是否把系統調色板當作它自身調色板的一部分; PFD_DOUBLEBUFFER 指明使用了雙緩沖區(註:GDI不能在使用了雙緩沖區的窗口中畫圖); PFD_STEREO 指明左、右緩沖區是否按立體圖像來組織。 PixelType定義顯示顏色的方法。PFD_TYPE_RGBA意味著每一位(bit)組代表著紅、綠、藍各分量的值。PFD_TYPE_COLORINDEX 意味著每一位組代表著在彩色查找表中的索引值。本例都是採用了PFD_TYPE_RGBA方式。 ● cColorBits定義了指定一個顏色的位數。對RGBA來說,位數是在顏色中紅、綠、藍各分量所佔的位數。對顏色的索引值來說,指的是表中的顏色數。 ● cRedBits、cGreenBits、cBlue-Bits、cAlphaBits用來表明各相應分量所使用的位數。 ● cRedShift、cGreenShift、cBlue-Shift、cAlphaShift用來表明各分量從顏色開始的偏移量所佔的位數。 一旦初始化完我們的結構,我們就想知道與要求最相近的系統象素格式。我們可以這樣做: m_hGLPixelIndex = ChoosePixelFormat(hDC, &pixelDesc); ChoosePixelFormat接受兩個參數:一個是hDc,另一個是一個指向PIXELFORMATDESCRIPTOR結構的指針&pixelDesc;該函數返回此像素格式的索引值。如果返回0則表示失敗。假如函數失敗,我們只是把索引值設為一並用DescribePixelFormat得到像素格式描述。假如你申請一個沒得到支持的像素格式,則Choose-PixelFormat將會返回與你要求的像素格式最接近的一個值。一旦我們得到一個像素格式的索引值和相應的描述,我們就可以調用SetPixelFormat設置像素格式,並且只需設置一次。 現在像素格式已經設定,我們下一步工作是產生繪制環境(RC)並使之成為當前繪制環境。在CGLSample一View中加入一個保護型的成員函數BOOL CreateViewGLContext(HDC hDC),使之如下所示: BOOL CGLSample一View::CreateView GLContext(HDC hDC) { m_hGLContext = wglCreate Context(hDC);//用當前DC產生繪制環境(RC) if (m_hGLContext == NULL) { return FALSE; } if (wglMakeCurrent(hDC, m_hGLContext)==FALSE) { return FALSE; } return TRUE; } 並加入一個保護型的成員變數HGLRC m_hGLContext;HGLRC是一個指向rendering context的句柄。 在OnCreate函數中調用此函數: int CGLSample一View::OnCreate (LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateS truct) == -一) return -一; HWND hWnd = GetSafeHwnd(); HD
Ⅲ windows 編程用vc 6.0怎樣建立一個能夠開始寫windows 編程代碼的窗口開始書寫代碼
1. 打開VC6.0
2. 打開「文件」菜單,選擇「新建」,彈出一個新建窗口。
3. 在左邊的「工程」面板裡面選擇「Win32 Application」,在右邊的「工程」編輯框里寫上工程名,假設是「Test「。
4。點擊「確定」。在彈出的窗口中選擇「空項目(An empty project)」。
5. 點擊「完成」,點擊「確定」
6.此時工程已經建好了, 在VC6界面的左邊有一個窗口,選擇「File View」標簽。
7. 右擊「Test Files」,在子菜單中選擇「添加文件(Add Files to Project)」
8. 在出來的界面的左邊面板中選擇「C++ Source File」,在右邊寫上文件名。
9.點擊「確定」,就可以 了。
Ⅳ WINDOWS游戲編程之從零開始的內容簡介
1. 如果你的編程經驗為零:
毫無編程經驗的朋友,請先閱讀介紹C++編程語言的相關書籍,再來延續我們的夢想,閱讀這本書。學習C++推薦書目: C++ Primer和C++ Primer Plus。
2. 如果你有C++編程經驗但沒有接觸過Windows 編程:
有C++編程經驗但毫無Windows編程經驗的朋友,可以從頭到尾順暢的閱讀這本書。因為這本書最准確的定位就是有一點C++編程經驗之後從零開始掌握Windows游戲編程。
3. 如果你有Windows 編程經驗,但不熟悉GDI:
有Windows編程經驗但不熟悉GDI的朋友,推薦適當閱讀第一章之後,從第4章開始您的征程。
4. 如果你想了解Windows GDI游戲繪圖技巧:
想了解Windows GDI游戲繪圖技巧的朋友,請閱讀第5章。
5. 如果你想了解Windows游戲動畫技巧:
想了解Windows游戲動畫技巧的朋友,第6章會滿足你的好奇心。
6. 如果你想了解Windows小游戲鍵盤滑鼠編程的相關知識:
需要了解Windows中小游戲對鍵盤滑鼠編程相關知識的朋友,第7章會給你答案。
7. 如果你想看看Windows GDI如何寫出好玩的程序:
想看看Windows GDI可以弄出哪些好玩的玩意兒的朋友,第8章會給你驚喜。
8. 如果你想了解一個GDI小游戲完整的開發過程:
想了解一個結構完整的小游戲的開發過程的朋友們,第9章會超出你們的期待。
9. 如果你已經准備好迎接挑戰,開始學習DirectX游戲編程:
有一定Windows編程經驗,並且了解GDI編程,想開始DirectX 3D游戲編程學習的朋友,請從第10章開始閱讀。這本書從第10章往後的內容組織起來是一個系統的DirectX游戲編程教材,其實可以單獨成書的。