複製鏈接
請複製以下鏈接發送給好友

GetDC

鎖定
GetDCEx是一個計算機函數,是GetDC的一個擴展,它能使應用程序更多地控制在客户區域內如何或是否發生剪切。
中文名
GetDC
性    質
函數
功    能
檢索顯示設備上下文環境的句柄
函數原型
HDC GetDC(HWND hWnd)

目錄

GetDC函數功能

該函數檢索一指定窗口的客户區域或整個屏幕的顯示設備上下文環境的句柄,以後可以在GDI函數中使用該句柄來在設備上下文環境中繪圖。
GetDCEx函數是GetDC的一個擴展,它能使應用程序更多地控制在客户區域內如何或是否發生剪切。
函數原型:HDC GetDC(HWND hWnd);

GetDC參數

hWnd:設備上下文環境被檢索的窗口的句柄,如果該值為NULL,GetDC則檢索整個屏幕的設備上下文環境。
Windows 98,WindowsNT 5.0或以後版本:如果該參數為Null,GetDC檢索首要顯示器的設備上下文環境,要得到其他顯示器的設備上下文環境,可使用EnumDisplayMonitors和CreateDc函數。
返回值:如果成功,返回指定窗口客户區的設備上下文環境;如果失敗,返回值為Null。
Windows NT:若想獲得更多錯誤信息,可調用GetLastError函數。

GetDC註釋

GetDC函數根據指定的等級類型檢索指定窗口普通的、典型的或特有的設備上下文環境。
對於普通設備上下文環境,GetDC在每次檢索的時候部分分配給它缺省特性,對於典型和特有的設備上下文環境,GetDC不改變先前設置的特性。
在使用普通設備上下文環境繪圖之後,必須調用ReleaseDc函數釋放該設備上下文環境,典型和特有設備上下文環境不需要釋放,設備上下文環境的個數僅受有效內存的限制。
還有一點要特別注意,getdc函數對系統的相對開銷比較大,如果你的程序裏使用了幾百個getdc函數而又不通過ReleaseDC函數釋放的話,那你機器運行速度將是龜速。

GetDC示例

速查: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; 釋放指針。就説到這吧,希望能對您有所幫助。不足之處,還望指正。