《Windows 程式設計》學習筆記(四) (轉)

gugu99發表於2008-07-27
《Windows 程式設計》學習筆記(四) (轉)[@more@]

第四章 輸出文字

  需要非常清楚一個概念----視窗的客戶區(Client Area):整個應用視窗中未被標題欄,視窗邊框以及可選的選單欄,工具欄,狀態列和捲軸佔據的部分。
  在中,我們能在視窗的客戶區繪製文字和圖形,而當視窗的客戶區被變動時,Windows不能保留原來繪製的文字和圖形,如果要恢復原來的文字和圖形就必須進行重新繪製,這個過程叫重新整理。如果當Windows向視窗過程傳送WM_PAINT訊息,視窗的客戶區就需要‘重新整理’。
  Windows什麼時候向視窗過程傳送WM_PAINT訊息,或者說什麼時候視窗的客戶區被變動呢?主要是一下幾種情況:
  1) 在移動視窗或顯示視窗時,視窗中先前隱藏的區域重新可見;
  2) 使用者改變視窗的大小。
  3) 程式使用ScrollWindow或ScrollDC滾動客戶區的一部分;
  4) 程式使用InvalidateRect或InvalidateRgn函式顯式產生WM_PAINT訊息
  5) 覆蓋了部分視窗的對話方塊或訊息框被移開;
  6) 選單下拉出來,然後被釋放;
  7) 顯示工具提示;
  8) 滑鼠游標在客戶區移動;
  9) 圖示在客戶區中託動。
  上面的各種情況實際上都是使視窗客戶區的全部或一部分原有的文字和圖形資訊被‘覆蓋’,變為‘無效’的視窗客戶區,當視窗客戶區的全部或一部分‘無效’時,Windows就向視窗過程傳送WM_PAINT訊息,是視窗‘有效’,再重新繪製視窗。
  在視窗的客戶區繪製,要使用Windows的圖形裝置介面(GDI)函式,上一章用到的DrawText就是一個GDI函式,它可以在視窗中繪製相應的一行文字。幾乎每個圖形裝置介面函式都需要裝置環境(DC:Device Context)控制程式碼作為引數,DC是一個儲存繪製時所需各種屬性(比如文字字型,文字顏色,線的粗細等)的資料結構,我們可以用一些GDI函式改變這些屬性。
  我們只有獲得DC的控制程式碼才能在螢幕上繪製文字或圖形。獲得DC控制程式碼的方法有兩個。
  一種是在處理WM_PAINT訊息時(出現無效矩形(視窗)的情況),使用BeginPaint和EndPaint兩個函式:
  case WM_PAINT:
  HCD hdc;//定義一個DC控制程式碼變數
  PAINTSTRUCT ps;
  hdc = BeginPaint(hwnd, &ps);使無效視窗變為有效,並獲得一個DC控制程式碼
  [使用 GDI 函式 ]
  EndPaint(hwnd, &ps); 釋放DC控制程式碼
  在處理WM_PAINT訊息必須按上面的方法進行,否則程式將出錯!這是因為BeginPaint函式是視窗‘有效’,然後可以繪製視窗。如果沒有BeginPaint函式,則視窗還是‘無效’的,Windows將不斷向視窗過程傳送WM_PAINT訊息,有可能造成崩潰!
  另一種方法可以隨時獲得一個DC控制程式碼:
  DHC hdc;
  hdc = GetDC(hwnd);  獲得一個DC控制程式碼
  [使用GDI函式]
  ReleaseDC(hwnd, hdc); 釋放DC控制程式碼
  現在我們就可以用GDI函式在視窗的客戶區繪製文字或圖形了,本章舉了一個例子:輸出文字。
  書中的例子運用GetSystemMetrics函式取得使用者介面構件大小的資訊(比如:螢幕寬度和高度,視窗中標題欄的高度等),並用TextOut這個GDI函式把這些資訊按行顯示在視窗的客戶區中。書中透過三個步驟逐漸的把這個程式的功能擴充加強,最後得到一個比較完美而有意義的程式。這個過程在我們的實際工作中是非常有用的,開發一個可以先實現軟體的主要功能,然後再根據需要把這個軟體的功能逐步擴充,同時也是我們的知識和能力不斷增加的過程。
  捲軸(Scroll Bars)是圖形使用者介面最好的功能之一,當顯示的文字,圖形等所需的空間超出了視窗的客戶區所能提供的空間,就可以使用捲軸。在應用程式中包含水平或垂直捲軸,只需在CreateWindow函式的第三個引數中包含視窗風格WS_VSCROLL(垂直)或WS_HSCROLL(水平)即可。用滑鼠單擊捲軸或託動滾動小塊時,Windows向視窗過程傳送WM_VSCROLL和WM_HSCROLL訊息,在訊息引數wParam中的低16位位元組中儲存指示滑鼠操作的“通知碼”(Notification Code)。透過通知碼,我們就可以對滑鼠的各種操作進行相應的處理。
  ....
  case WM_VSCROLL:
  switch(LO(wParam))  取得wParam中的低16位位元組的值
  {
  case SB_LINEUP:  “通知碼”通知我們滑鼠讓捲軸向上滾動一行
  ...  相應的處理
  case SB_LINEDOWN:  “通知碼”通知我們滑鼠讓捲軸向下滾動一行
  ...  相應的處理

    }
  return 0;


  如何對捲軸進行相應的處理呢?利用SetScrollInfo,GetScrollInfo和ScrollWindow三個函式可以對捲軸進行各種處理,這些函式的意義和使用方法可以參照書中的第三個例子以及MSDN。
  值得注意的是:Windows自動處理捲軸的所有滑鼠操作,但不處理鍵盤的操作,這就需要加入相應的程式碼來支援鍵盤的操作,在下一章會學到。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1007903/,如需轉載,請註明出處,否則將追究法律責任。

相關文章