GetDC()函數

  函數功能:該函數檢索一指定窗口的客戶區域或整個屏幕的顯示設備上下文環境的句柄,以後可以在GDI函數中使用該句柄來在設備上下文環境中繪圖。
  GetDCEx函數是GetDC的一個擴展,它能使應用程序更多地控制在客戶區域內如何或是否發生剪切。
  函數原型:HDC GetDC(HWND hWnd);
  參數:
  hWnd:設備上下文環境被檢索的窗口的句柄,如果該值爲NULL,GetDC則檢索整個屏幕的設備上下文環境。
  Windows 98,WindowsNT 5.0或以後版本:如果該參數爲Null,GetDC檢索首要顯示器的設備上下文環境,要得到其他顯示器的設備上下文環境,可使用EnumDisplayMonitors和CreateDc函數。
  返回值:如果成功,返回指定窗口客戶區的設備上下文環境;如果失敗,返回值爲Null。
  Windows NT:若想獲得更多錯誤信息,可調用GetLastError函數。
  註釋:GetDC函數根據指定的等級類型檢索指定窗口普通的、典型的或特有的設備上下文環境。
  對於普通設備上下文環境,GetDC在每次檢索的時候部分分配給它缺省特性,對於典型和特有的設備上下文環境,GetDC不改變先前設置的特性。
  在使用普通設備上下文環境繪圖之後,必須調用ReleaseDc函數釋放該設備上下文環境,典型和特有設備上下文環境不需要釋放,設備上下文環境的個數僅受有效內存的限制。
  速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;頭文件:winuser.h;庫文件:user32.lib。
  Delphi例子:
  Var
  dc: HDC;
  begin
  dc := getdc(0); //0表示得到屏幕場景
  end;
  vb下的例子:
  ----------------------------------------------------------
  Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long ‘聲明api函數
  Private Sub Form_Load()
  Me.AutoRedraw = True
  BitBlt Form1.hDC, 0, 0, Screen.Width, _
  Screen.Height, GetDC(0), 0, 0, vbSrcCopy
  rem 截屏到當前窗口顯示
  End Sub
  ------------------------------------------------------
  Windows 程序在屏幕、打印機或其它設備上畫圖時,它並不是將像素直接輸出到設備上,而是將圖繪製到由設備描述表表示的邏輯意義上的"顯示平面"上去。設備描述表(DC)是Windows中的一種數據結構,它包含GDI需要的所有關於顯示界面情況的描述字段,包括相連的物理設備和各種各樣的狀態信息。在Windows畫圖之前,Windows程序從GDI獲取設備描述表句柄(HDC),並在每次調用完GDI輸出函數後將句柄返回給GDI。本文將對如何獲得和釋放 HDC以及 CDC及其派生類的使用方法進行演示說明。
  下載示例工程 DCDemo 具體說明:
  1、按鈕 IDC_GETDC_APINULL的函數
  void CDCDemoDlg::OnGetdcApinull()
  {
  HDC hDC=::GetDC(NULL);
  ::MoveToEx(hDC,0,0,NULL);
  LineTo(hDC,200,20);
  ::ReleaseDC(NULL,hDC);
  }
  該段代碼具體演示瞭如何使用API 函數GetDC(NULL),取得屏幕的HDC.並進行畫圖。 HDC GetDC(HWND hWnd); //功能:取得hWnd窗口的設備描述表句柄。當hWnd參數爲NULL時,取得整個屏幕的設備描述表句柄。 MoveToEx和LineTo演示在DC上畫一條直線記住,最後調用ReleaseDC釋放HDC資源。 int ReleaseDC (
  HWND hWnd,//你要控制的那個窗口的句柄,如果你在GetDC函數傳遞的是NULL,現在還要傳遞NULL。
  HDC hDC //DC的句柄
  );
  編譯運行程序,按下按鈕,發現屏幕的左上角處畫了一條直線。
  2、按鈕 IDC_GETDC_API的函數
  void CDCDemoDlg::OnGetdcApi()
  {
  HDC hDC=::GetDC(m_hWnd);
  ::MoveToEx(hDC,0,0,NULL);
  LineTo(hDC,200,50);
  ::ReleaseDC(m_hWnd,hDC);
  }
  這段代碼與前一段代碼唯一的區別是GetDC的參數不再是NULL,而改爲CWnd的成員變量m_hWnd,即對話框窗口的句柄。對比兩段代碼運行結果,深入體會API函數 GetDC。
  3、按鈕IDC_GETDC_CWND的函數
  void CDCDemoDlg::OnGetdcCwnd()
  {
  CDC *pDC=GetDC();
  pDC->MoveTo(0,0);
  pDC->LineTo(200,100);
  ReleaseDC(pDC);
  }
  該段代碼演示使用MFC CWnd類的 GetDC函數和ReleaseDC的方法,使用該方法在程序窗口中畫圖非常方便。爲了避免獲取和釋放設備描述表所帶來的麻煩,MFC提供了一些CDC派生類,如CPaintDC,CClientDC,CWindowDC,這些類被設計爲可直接進行實例化。各個類的構造函數和析構函數調用相應的函數捕獲和釋放設備描述表,從而使得更加方便簡捷。
  4、按鈕IDC_CCLIENTDC的函數
  void CDCDemoDlg::OnCclientdc()
  {
  CClientDC dc(this);
  CBrush brush(RGB(255,0,0));
  dc.FillRect(CRect(0,0,100,100),&brush);
  }
  該段代碼演示了 CClientDC的具體使用方法,通過測試可以看出和 CClientDC對象相對應的設備描述表是窗口的客戶區 。 CPaintDC類是從CDC類派生出來的,在構造時自動調用CWnd::BeginPaint,析構時調用CWnd::EndPaint。通常CPaintDC用來響應WM_PAINT消息,一般應用在OnPaint函數,對窗口的客戶區進行操作。
  5、按鈕IDC_CWINDOWDC的函數
  void CDCDemoDlg::OnCwindowdc()
  {
  CWindowDC dc(this);
  CPen pen(PS_SOLID,3,RGB(0,255,0));
  CPen *pOldPen=dc.SelectObject(&pen);
  dc.MoveTo(0,0);
  dc.LineTo(200,200);
  dc.SelectObject(pOldPen);
  }
  運行並觀察畫線的起始位置。可以看出CWindowDC對象和整個窗口相對應。
  6、按鈕IDC_POINTER的函數
  void CDCDemoDlg::OnPointer()
  {
  CWindowDC *pDC;
  pDC=new CWindowDC(this);
  pDC->MoveTo(0,0);
  pDC->LineTo(200,250);
  delete pDC;
  }
  這段代碼演示瞭如何在堆中創建指向CDC派生類的指針,再利用該指針進行畫圖,最後請使用delete pDC; 釋放指針。就說到這吧,希望能對您有所幫助。不足之處,還望指正。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章