首页 > 应用 > EDA
[导读]Windows 程序在屏幕、打印机或其它设备上画图时,它并不是将像素直接输出到设备上,而是将图绘制到由设备描述表表示的逻辑意义上的"显示平面"上去。设备描述表(DC)是Windows中的一种数据结构,它包含GDI需要的所有

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; 释放指针。



来源:ks990次

本文引用地址: http://www.21ic.com/app/eda/201806/769785.htm

换一批

延伸阅读

[图酷] 英特尔展示居里:专供可穿戴设备 纽扣大小

英特尔展示居里:专供可穿戴设备 纽扣大小

英特尔在CES期间披露了有关Curie(居里)模块的信息,这一基于Quark(夸克)SE SoC的模块让开发者可以更容易地设计并制造出各式各样的可穿戴设备。 英特尔Curie模块是英......

关键字:

[新鲜事] Cyborg Nest想要创造和拓展人类的感觉,能行么?

Cyborg Nest想要创造和拓展人类的感觉,能行么?

North Sense 是个小型的感应设备。把它嵌入身体,你就拥有了一个全新的感觉。每次你面向北面,都会感觉到短促的震动。目前,这件产品的用户仅有两人:Cyborg Nest 的两位创始人 Liviu Babitz 和 Scott Cohe......

关键字:Cyborg Nest North Sense 感应设备

[新鲜事] 苹果正在全力打造 AR 设备,以便在未来保住领导地位

苹果正在全力打造 AR 设备,以便在未来保住领导地位

眼看着 AR 产品开始崭露头角,很多科技巨头已经在这个领域布局,苹果做为智能硬件消费领域的领头羊,一点都不敢怠慢。而根据市场数据判断,全球 AR 产品产值将在 2024 年时增长 80% 达到 1650 亿美元。......

关键字:苹果 AR 设备

[真心话] 医院里联网设备越来越多,但安全问题并未引起足够重视

医院里联网设备越来越多,但安全问题并未引起足够重视

由于物联网设备安全措施缺乏,它们很容易成为黑客的攻击目标,而联网的医疗设备更是风险巨大。一方面,医疗设备常常关系到病人的人身安全,另一方面,由于医疗设备连接着医院的网络,黑客能够盗取私密的医疗信息。......

关键字:医院 联网设备 安全问题
条评论

我 要 评 论

网友评论

技术子站

更多

人才招聘

更多

项目外包

更多

推荐博客