更新时间:2024-02-25 19:23
该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在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 Sub Form_Load()
Me.AutoRedraw = True
BitBlt Form1.hDC, 0, 0, Screen.Width, _
Screen.Height, GetDC(0), 0, 0, vbSrcCopy
rem 截屏到当前窗口显示
End Sub
------------------------------------------------------
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; 释放指针。就说到这吧,希望能对您有所帮助。不足之处,还望指正。