視窗的無效區域 演示程式 (轉)

worldblog發表於2008-01-22
視窗的無效區域 演示程式 (轉)[@more@]

視窗的無效區域

作者: 姜學哲(tosail0@163.net">netsail0@163.net)

教材: 設計(第五版)北京大學出版社
 [美]Charles Petzold 著
 北京博彥科技發展有限公司 譯  ¥:160

環境: Pro sp4 + Internet Explorer 6.0 sp1 + Visual C++ 6.0

圖們江程式編制小組()版權所有,轉載請說明出處
----------------------------------------------------------------
當視窗客戶區的一部分或者全部變為“無效”,以致於必須重新整理時,將給視窗過程傳送WM_PAINT訊息。

收到WM_PAINT訊息後必須繪製客戶區。在很多時候我們只需要很小的一個區域就可以了。當對話方塊覆蓋了部分客戶區的時候情況就是如此。關閉對話方塊後,需要重畫的只是先前被對話方塊遮住的矩形區域。這個區域就是“無效區域”或“更新區域”。

為了讓你更好地理解什麼是無效區域,我寫了一個程式。該程式的功能是獲取最新的無效區域的座標。執行該程式後你可以用另一個較小的視窗遮住該視窗的全部或一小部分。然後再移走。又或者改變視窗的尺寸。客戶區出現的四個數就是最新的無效區域座標。以下是WndProc部分的程式碼:

===========================================================
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  static int  cxChar, cxCaps, cyChar ;
  HDC  hdc ;
static int  t[4] ;
int  i ;
  PAINTSTRUCT ps ;
  TCHAR  szBuffer [10] ;

  switch (message)
  {
  case WM_PAINT :
  hdc = BeginPaint (hwnd, &ps) ;
 
  t[0] = ps.rcPaint.left ;
  t[1] = ps.rcPaint.top ;
  t[2] = ps.rcPaint.bottom ;
  t[3] = ps.rcPaint.right ;

  for (i = 0 ; i < 4 ; i++)
  {
  TextOut (hdc, t[0], t[1] + i * 20, szBuffer,
  wsprintf (szBuffer, TEXT ("%5d"), t[i])) ;
  }
  EndPaint (hwnd, &ps) ;
  return 0 ;

  case WM_DESTROY :
  PostQuitMessage (0) ;
  return 0 ;
  }
  return DefWindowProc (hwnd, message, wParam, lParam) ;
}
===========================================================

BeginPaint除了獲取裝置描述表控制程式碼之外,還從系統中獲取相關資訊填充她的第二個引數,也就是PAINTSTRUCT結構。該結構包含了一個rcPaint結構。而rcPaint結構就是最新無效區域的座標。

確定無效區域的時候不需要程式設計師干預,是由系統自動完成的。是暗箱操作。我們只需要用BeginPaint函式獲取就可以了。我對的這種隱藏細節的做法很不滿。也僅限於不滿。人在屋簷下,不得不低頭。


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

相關文章