【正文】
SelectObject(hDC,hBrush)。PtStr)。 //定義畫刷的句柄 3… HPEN hPen。Message)。 12… while(GetMessage(amp。 6… BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)。 return RegisterClass(amp。 =WndProc。 =(HBRUSH)(GetStockObject(WHITE_BRUSH))。 return TRUE。 hWnd=CreateWindow(WinFill, //生成窗口 填充示例程序 , WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL)。 case WM_DESTROY: //結束應用程序 PostQuitMessage(0)。 //選擇畫刷 Pie(hDC,250,50,300,100,250,50,300,50)。 //采用亮灰色畫刷 下面只改變畫刷,不改變筆 SelectObject(hDC,hBrush)。 //畫刷 SelectObject(hDC,hBrush)。PtStr)。 //定義指向設備的句柄 HBRUSH hBrush。 DispatchMessage(amp。 if(!InitWindows(hInstance,nCmdShow)) return FALSE。 使用虛畫刷填充時,看不出填充效果 !!! BOOL InitWindowsClass(HINSTANCE hInstance)。刪除畫刷,釋放內(nèi)存 hBr=CreateHatchBrush (int nHctchStyle, COLORREF rgbColor )。 (1) 畫刷的創(chuàng)建 使用畫刷需事先定義一個畫刷句柄。 創(chuàng)建畫筆后,必須調(diào)用 SelectObject函數(shù)將其選入設備環(huán)境。 只有在映射模式為 MM_ANISOTROPIC 和 MM_ISOTROPIC 時才有意義 二、繪圖工具與顏色 1. 畫筆 (1) 畫筆的創(chuàng)建 使用畫筆之前必須事先定義一個畫筆句柄。 視口 區(qū)域的定義由 SetViewportExtEx函數(shù)完成,函數(shù)原型為: BOOL SetViewportExtEx ( HDC hdc, int nHeight,nWidth,//以 物理 設備單位表示的新視口區(qū)域高寬度 LPSIZE lpSize )。 B e g in P a in t 與 G e t D C 的區(qū)別項目 函數(shù) B e g i n P a i n t 函數(shù) G e tD c 函數(shù)使用環(huán)境只用于圖形刷新時獲取設備環(huán)境使用較為廣泛操作區(qū)域使用 B e g i n P a i n t 函數(shù)獲取設備環(huán)境后,操作區(qū)域為無效區(qū)域使用 G e tD C 函數(shù)獲取設備環(huán)境后,操作區(qū)域為整個用戶區(qū)釋 放設 備環(huán)境所用函數(shù)由 E n d P a i n t 函數(shù)釋放由 R e l e a s e D C 函數(shù)釋放4. 映像模式 映像模式定義了將邏輯單位轉化為設備的度量單位以及設備的 x方向和 y方向,程序員可在一個統(tǒng)一的邏輯坐標系中操作而不必考慮輸出設備的坐標系情況 窗口 :對應邏輯坐標系上程序員設定的區(qū)域 視口 :對應實際輸出設備上程序員設定的區(qū)域 窗口和視口 如何映射? 映像模式將一個邏輯單位映射為坐標系設定M M _ A N I S O T R O P I C 系統(tǒng)確定 O p ti o n a lM M _ H I E N G L I S H 0 . 0 0 1 英寸 Y 上, X 右M M _ H I M E T R I C 0 . 0 1 毫米 Y 上, X 右M M _ I S O T R O P I C 系統(tǒng)確定O p ti o n a l ,但 x軸和 y 軸的單位此例為 1 : 1M M _ L O E N G L I S H 0 . 0 1 英寸 Y 上, X 右M M _ L O M E T R I C 0 . 1 毫米 Y 上, X 右M M _ T E X T 一個像素 Y 下, X 右M M _ T W I P S 1 / 1 4 4 0 英寸 Y 上, X 右缺省的映射模式 將窗口中的對稱圖形映射到視口時仍為對稱圖形 按照窗口和視口的坐標比例進行映射 坐標系統(tǒng) 邏輯坐標系統(tǒng) 設備坐標系統(tǒng) 屏幕坐標系統(tǒng) 窗口坐標系統(tǒng) 用戶區(qū)坐標系統(tǒng) 應用程序可獲取設備環(huán)境的當前映像模式,并根據(jù)需要設置映像模式。 系統(tǒng)獲取設備環(huán)境的 同時填寫 ps結構,以 標識無效矩形區(qū) 由 BeginPaint函數(shù)獲取的設備環(huán)境要用 EndPaint函數(shù)釋放 BOOL EndPaint(HWND hwnd, PAINTSTRUCT amp。刷新時將副本拷貝到相應的窗口中 記錄事件。 //無效矩形標識 BOOL fRestore。 Windows系統(tǒng)為每個窗口建立了一個 PAINTSTRUCT結構 , 該結構中包含了包圍 無效區(qū)域 的一個最小矩形的結構 RECT, 應用程序可以根據(jù)這個無效矩形執(zhí)行刷新操作。所謂設備的無關性,就是操作系統(tǒng)屏蔽了硬件設備的差異,因而設備無關性能使用戶編程時無需考慮特殊的硬件設置 一、圖形設備按口 (GDI) GDI負責系統(tǒng)與用戶或繪圖程序之間的信息交換,并控制在輸出設備上 顯示圖形 或 文字 , 是 Windows系統(tǒng)的重要組成部分 Windows 支持與設備無關的圖形 利用 GDI和Windows設備驅動程序 開發(fā)人員只要建 立與輸出設備的 關聯(lián),讓系統(tǒng)加 載相應的設備驅 動程序即可 1. GDI的一些基本概念 設備描述表 即為 設備環(huán)境 的屬性的集合 應用程序 與輸出設備 之間的橋梁 Win系統(tǒng) 外設 直接訪問 不允許 統(tǒng)一的設備環(huán)境 (DC) 提供 使應用程序與設備相連 用戶 為確保圖形輸出 的設備無關性 應用程序 設備描述表及其屬性 應用程序每一次圖形操作均參照設備描述表中的屬性執(zhí)行 圖形刷新 是繪圖過程中必須考慮的重要問題 刷新請求 對刷新請求的響應 刷新方法 包括 (1) 刷新請求 應用程序在窗口中 繪制了一個橢圓, 顏色列表框覆蓋了 橢圓的一部分 關閉顏色選框后, 應用程序需要恢 復被覆蓋部分的顏色和形狀 窗口大小的調(diào)整 窗口移動 被覆蓋后的恢復 (2) 系統(tǒng)對刷新請求的響應 當用戶區(qū)的內(nèi)容需要刷新時,系統(tǒng)向應用程序消息隊列發(fā)送 WM_PAINT消息,系統(tǒng)在應用程序的消息隊列中加入該消息,以通知窗口函數(shù)執(zhí)行刷新處理 三種 刷新 窗口移動后的刷新 被覆蓋區(qū)域的刷新 對象穿越后的刷新 (系統(tǒng)自動完成 ) 用戶區(qū)移動或顯示 用戶窗口大小改變 程序通過滾動條滾動窗口 窗口被另一個窗口覆蓋的 恢復如下拉式菜單關閉等 光標穿過用戶區(qū) 圖標拖過用戶區(qū) 窗口被另一個窗口覆蓋的區(qū)域稱為 無效區(qū)域 。 //一般取真值,表示擦除無效矩形的背景 RECT rcPaint。 rcPaint 為標準的 RECT數(shù)據(jù)結構,其作用是標識無效矩形,它包含了無效矩形的左上角和右下角的坐標 常用的 Windows應用程序刷新窗口的方法 保存副本。ps); //ps為 PAINTSTRUCT類型結構 定義方式為: PAINTSTRUCT ps。 由 GetDC函數(shù)獲取的設備環(huán)境必須用 ReleaseDC函數(shù)釋放 void ReleaseDC(HWND hwnd)。 窗口 區(qū)域的定義由 SetWindowExtEx函數(shù)完成,其函數(shù)原型形為 :BOOL SetWindowExtEx ( HDC hdc, int nHeight,nWidth, //以 邏輯 單位表示的窗口區(qū)域高寬度 LPSIZE lpSize, //函數(shù)調(diào)用前窗口區(qū)域尺寸的 SIZE結構地址 )。 SetWindowOrgEx函數(shù)的原形為 : BOOL SetWindowOrgEx ( HDC hdc, int X,Y, //以 邏輯 單位表示的窗口原點坐標 LPPOINT lpPoint //函數(shù)調(diào)用前原點坐標的 POINT結構的地址 )。 WHITE_PEN BLACK_PEN DC_PEN NULL_PEN 畫筆的操作 創(chuàng)建畫筆 將畫筆選入設備環(huán)境 刪除畫筆 (2) 創(chuàng)建 新 畫筆,形式如下 : hP=CreatePen ( int nPenStyle, //確定 畫筆樣式 int