第四章 輸出文字part1

NO IMAGE

4.1繪製和更新

以下情況下視窗訊息處理程式會接收到一個WM_PAINT訊息:
1.在使用者移動視窗或顯示視窗時,視窗中先前被隱藏的區域重新可見。
2.使用者改變視窗的大小(如果視窗類別樣式有著CS_HREDRAW和CS_VREDRAW位旗標的設定)。
3.程式使用ScrollWindow或ScrollDC函式滾動顯示區域的一部分。
4.程式使用InvalidateRect或InvalidateRgn函式刻意產生WM_PAINT訊息。
以下情況下,Windows可能傳送WM_PAINT訊息
1.Windows擦除覆蓋了部分視窗的對話方塊或訊息框。
2.選單下拉出來,然後被釋放。
3.顯示工具提示訊息。

有效矩形和無效矩形:

視窗訊息處理程式一旦接收到WM_PAINT訊息之後,就準備更新整個顯示區域,但它經常只需要更新一個較小的區域。只有在顯示區域的某一部分失效時,視窗才會接受WM_PAINT訊息。

無效矩形:包含了包圍無效區域的最小矩形的座標以及其它資訊。視窗訊息處理程式可以通過呼叫InvalidateRect使顯示區域內的矩形無效。GetUpdateRect:可以在任何時候取得無效矩形的座標。

在處理WM_PAINT訊息處理期間,視窗訊息處理程式在呼叫了BeginPaint之後,整個顯示區域即變為有效。程式也可以通過呼叫ValidateRect函式使顯示區域內的任意矩形區域變為有效。如果這呼叫具有令整個無效區域變為有效的效果,則目前佇列中的任何WM_PAINT訊息都將被刪除。

 

4.2GDI 簡介

要在視窗的顯示區域繪圖,可以使用Windows的圖形裝置介面(GDI)函式。TextOut (hdc, x, y, psText, iLength) ;//最為普遍的文字輸出函式。每個GDI函式都需要將裝置內容控制代碼作為函式的第一個引數。裝置內容控制代碼是GDI函式的視窗。

取得裝置內容控制代碼:方法一

在處理WM_PAINT訊息時,使用BeginPaint和EndPaint兩個函式,這兩個函式需要視窗控制代碼(作為引數傳給視窗訊息處理程式)和PAINTSTRUCT結構的變數(在WINUSER.H表標頭檔案中定義)的地址為引數。
繪圖資訊結構
typedef struct tagPAINTSTRUCT
{
  HDC hdc ;//裝置內容控制代碼
  BOOL fErase ;//FALSE(0),意味著Windows已經擦除了無效矩形的背景
  RECT rcPaint ;//rcPaint矩形不僅是無效矩形,它還是一個「剪取」矩形
  BOOL fRestore ;
  BOOL fIncUpdate ;
  BYTE rgbReserved[32] ;
} PAINTSTRUCT ;

取得裝置內容控制代碼:方法二

hdc = GetDC (hwnd) ;
ReleaseDC (hwnd, hdc) ;
得到視窗顯示區域的裝置內容控制代碼,可以呼叫GetDC來取得控制代碼,在使用完後呼叫ReleaseDC.與從BeginPaint傳回裝置內容控制代碼不同,GetDC傳回的裝置內容控制代碼具有一個剪取矩形,它等於整個顯示區域.與BeginPaint不同,GetDC不會使任何無效區域變為有效。一般可以呼叫GetDC和ReleaseDC來對鍵盤訊息(如在字處理程式中)和滑鼠訊息(如在畫圖程式中)作出反應。此時,程式可以立刻根據使用者的鍵盤或滑鼠輸入來更新顯示區域,而不需要考慮為了視窗的無效區域而使用WM_PAINT訊息。

GetDC傳回用於寫入視窗顯示區域的裝置內容控制代碼,而GetWindowDC傳回寫入整個視窗的裝置內容控制代碼。例如,可以使用從GetWindowDC傳回的裝置內容控制代碼在視窗的標題列上寫入文字。

TextOut:細節:
TextOut (hdc,//裝置內容控制代碼
         x, y, //,x是水平位置,y是垂直位置.顯示區域內字串的開始位置
         psText,//指向字串的指標
         iLength) ;//是字串中字元的個數.如果psText指向Unicode字串,則字串中的位元組數就是iLength值的兩倍

系統字型:
內定字型為「系統字型」,或用Windows表標頭檔案中的識別符號,即SYSTEM_FONT。Windows啟動後,系統字型的大小就不會發生改變。
字元大小:
GetTextMetrics取得字型大小。要使用GetTextMetrics函式,需要先定義一個結構變數

TEXTMETRIC tm ;//TEXTMETRIC結構提供了關於目前裝置內容中選用的字型的豐富資訊
static int cxChar, cyChar ;//來儲存平均字元寬度(cxChar)和總的字元高度(cyChar)
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight tm.tmExternalLeading ;
ReleaseDC(hwnd, hdc);

GetSystemMetrics函式以取使用者介面上各類視覺元件大小的資訊。它在程式中完成與裝置無關圖形輸出的重要函式。

 

4.3滾動條:
需要在CreateWindow的第三個引數中包括視窗樣式(WS)識別符號WS_VSCROLL(垂直捲動)和/或WS_HSCROLL(水平捲動)即可。

SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw);引數iBar為SB_VERT或者SB_HORZ,iMin和iMax分別是範圍的最小值和最大值。如果想要Windows根據新範圍重畫滾動條,則設定bRedraw為TRUE。iPos是新位置,它必須在iMin至iMax的範圍內。

Windows提供了類似的函式(GetScrollRange和GetScrollPos)來取得滾動條的目前範圍和位置。SetScrollPos來改變捲動方塊的位置。

在用滑鼠單擊滾動條或者拖動捲動方塊時,Windows給視窗訊息處理程式傳送WM_VSCROLL(供上下移動)和WM_HSCROLL(供左右移動)訊息。在滾動條上的每個滑鼠動作都至少產生兩個訊息,一條在按下滑鼠按鈕時產生,一條在釋放按鈕時產生。當釋放滑鼠鍵後,程式會收到一個帶有SB_ENDSCROLL通知碼的訊息。當把滑鼠的游標放在捲動方塊上並按住滑鼠鍵時,就產生了帶有SB_THUMBTRACK和SB_THUMBPOSITION通知碼的滾動條訊息。

SYSMETS.h

SYSMETS1.cpp