【正文】
用 COLORONCOLOR 的參數值調用 CDC:: SetStretchBltMo 降使得不太好看的位圖變得更好看一些。如果映射模式是MWLOENGLISH,那么位圖大小將是 英寸,或 5292 像素(對于 Windows95),為了使位圖合適, GDI 必須作一些位處理。當然,你千萬不能忘記在完成之后清除內存設備上下文。然后,你必須使用 CDC 成 員函數 StretchBit 或BitBit 來從內存設備上下文中向 “ 真正 ” 設備上下文中復制位。 盡管如此,仍有一些問題,原因是顯示或打印機設備的 “ 位圖 ” 是有效的顯示表面或打印的頁面本身。你必須先創(chuàng)建一個位圖,然后選中它進入設備上下文。你可以用 Windows RGB 宏來指定這些純色。每個像素用一個單一位來代表,該位或者是 0或 者是 1。 Windows 不在位圖中使用抖動的顏色。當創(chuàng)建位圖的時候,設置 4 位顏色值。一個標準的 VGA 板具有四個連續(xù)的彩色平面。正如你將在本章中所看到的那樣, Windows 處理彩色位圖的方式與處理畫刷顏色略有不同。另外還可以提供其他圖形交換格式,例如 TIFF、GIF 和 JPEG,但是只有 DIB 格式是直接 由 Win32 API 支持的。監(jiān)視器上的墻紙背景是在你啟動 Windows 的時候從 BMP 文件中讀取的。 DIB 還使得在打印時更加易于控制陰影。 與 GDI 位圖相比, DIB 提供了許多編 程方面的優(yōu)點。 GDI 位圖可以自由地在單一計算機上的程序之間進行傳輸,但是由于它們是依賴于設備的,所以通過磁盤或調制解調器來傳輸位圖是沒有意義的。 GDI 位圖對象有一個與之關聯的 Windows 數據結構 ,它在 Windows GDI模塊內進行維護,它是依賴于設備的。 GDI 位圖和設備無關的位圖 有兩種類型的 Windows 位圖: GDI 位圖和 DIB。在某些情況中,將獲得更好的性能, Win32 函數 CreatDIBSection 提供了與 GDI位圖的所有特征結合起來的 DIB 為圖所帶來的好處。 下一步將涉及到為位圖編成的現代方法:創(chuàng)建與設備無關的位圖( DIB)。 本章以位圖編程的 “ 老 ” 方法做為開始,創(chuàng)建使用于內存設備相關的依靠設備的 GDI 位圖。 Windows 位圖是映射到顯示像素的位數組。基于 Microsoft Windows 的應用程序就會變得十分單調。使用 Visual C++的 16 位版本, MFC 程序員很大程度上不接觸這些應用程序編程接口的區(qū)別,因為它們按照 MFC 標準編寫程序,這個標準是在 Win16 或者 Win32 環(huán)境下面設計的。比如說, 16 位參數通常被 32 位參數所取代。今天,如果需要編寫 32 位應用程序,必須直接地或間接地使用新的Win32 應用程序編程接口。第 22 章包括有關創(chuàng)建 MFC 擴充動態(tài)鏈接庫和常規(guī)動態(tài)鏈接庫。這意味著可以靜態(tài)或者動態(tài)把應用程序框架類連接到應用程序。 設計者最初使用 C 語言創(chuàng)建動態(tài)鏈接庫,并且 C++增加了一些復雜性。多個應用程序可以共享動態(tài)鏈接庫( DLLs),它節(jié)省內存和磁盤空間。 動態(tài)鏈接庫 在 MSDOS 環(huán)境下,一個程序的所有對象模塊在建立過程中是靜態(tài)鏈接的。今天簡單地分配所需要的內存,而 Windows 處理細節(jié)問題。如果所說過關于鎖定內存句柄、形實轉換程序和伯格氏管理器( burgermaster)的恐怖故事 ,不要擔心。 Microsoft Visual C++有全部標準資源格式的圖形資源編輯器。 使用一個文本編譯器來編譯一個程序,但是一般使用外語 siwyg(所見即所得)工具來編譯資源。資源文件可以包括位圖、圖標、 菜單定義、對話框外觀和字符串。進行 Windows 編程時,使用大量已經確立的格式在資源文件中存儲數據。圖形設備接口幾乎與直接視頻訪問一樣快,并且它允許不同的 Windows 應用程序來共享顯示。程序不是尋址硬件,而是調用( GDI)函數,這些函數引用名為 設備上下文( device context)的數據結構。 Windows 引入了一個名為圖形設備接口( GDI)的抽象化外層。 Windows 圖形設備接口 許多 MSDOS 程序直接寫顯存和打印機接口。應當清楚的是, Windows 消息處理要求在程序上強加了許多結構。 但是,不要擔心 這些消息怎樣與代碼相關。命令消息參數隨著窗口菜單的布局而有所不同。所有消息具有兩個 32 位參數,他們傳送諸如光標坐標、鍵代碼這樣的信息。 Windows 中的大部 分消息是嚴格定義的,而且適用于所有的程序。 注意:許多 Windows的開發(fā)環(huán)境,包括帶有 MFC庫 Microsoft Visual C++ ,通過隱藏 WinMain 函數和結構化消息處理過程來簡化編成。它最重要的任務是創(chuàng)建應用程序 的主窗口,它必須有自己的代碼來處理 Windows 發(fā)送給它的信息。 當 Windows 操作系統(tǒng)啟動一個程序時,他調用程序的 WinMain 函數。當用戶運行程序時,操作系統(tǒng)調用 main, 并且,從這里開始,可以使用任何需要的編程結構。我們將使 用眾所周知的 MSDOS 程序,也可能熟悉它。在開始前,需要了解一些 Windows 基本知識。t forget to clean up the memory device context when you39。t select a bitmap into a display device context or a printer device context. You have to create a special memory device context for your bitmaps, using the CDC::CreateCompatibleDC function. You must then use the CDC member function StretchBlt or BitBlt to copy the bits from the memory device context to the real device context. These bitblitting functions are generally called in your view class39。re finished with the object, you must deselect it and delete it. You know the drill. There39。s EXE or DLL file. The wallpaper background on your monitor is read from a BMP file when you start Windows. The primary storage format for Microsoft Paint is the BMP file, and Visual C++ uses BMP files for toolbar buttons and other images. Other graphic interchange formats are available, such as TIFF, GIF, and JPEG, but only the DIB format is directly supported by the Win32 API. Color Bitmaps and Monochrome Bitmaps Now might be a good time to reread the Windows Color Mapping section in Chapter 5. As you39。re allowed to put a GDI bitmap handle on the clipboard for transfer t