GetDC

GetDC

GetDCEx是一個計算機函式,是GetDC的一個擴展,它能使應用程式更多地控制在客戶區域內如何或是否發生剪下。

基本介紹

  • 中文名:GetDC
  • 性質:函式
  • 功能:檢索顯示設備上下文環境的句柄
  • 函式原型:HDC GetDC(HWND hWnd)
函式功能,參數,注釋,示例,

函式功能

該函式檢索一指定視窗的客戶區域或整個螢幕的顯示設備上下文環境的句柄,以後可以在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函式釋放該設備上下文環境,典型和特有設備上下文環境不需要釋放,設備上下文環境的個數僅受有效記憶體的限制。
還有一點要特別注意,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; 釋放指針。就說到這吧,希望能對您有所幫助。不足之處,還望指正。

相關詞條

熱門詞條

聯絡我們