当需要在显示器上(当然包括打印机等设备上)绘图时,或者写文字的时候,需要取得设备的上下文句柄,即HDC,本文以下都称为HDC。那么,有哪些办法取得HDC呢?

1 BeginPain()和EndPaint()

在处理WM_PAINT消息时,使用

hdc = BeginPaint(hwnd, &ps);
//...
EndPaint(hwnd, &ps);

ps是类型为PAINTSTRUCT类型的变量,其中的rcPaint成员指明了显示的无效区域。该hdc只能在这个无效区域内进行绘图。同时BeginPaint会使无效区域变为有效。

2 GetDC()和ReleaseDC()

在WM_PAINT以外可以使用

hdc = GetDC(hwnd);
//...
ReleaseDC(hwnd, hdc);

GetDC返回的HDC可以在整个显示区域进行绘图,但是不会将无效区域变为有效区域。

3 GetWindowDC()和ReleaseDC()

hdc = GetWindowDC(hwnd);
//...
ReleaseDC(hwnd, hdc);

用来取得整个窗口的HDC,包括标题栏,菜单栏,状态栏,滚动条和边框(frame)。

以上三种方式取得的HDC都是与窗口相关的。当然有时还是需要使用与窗口无关的HDC。

4 CreateDC()和DeleteDC()

hdc = CreateDC(pszDriver, pszDevice, pszOutput, pData);
//...
DeleteDC(hdc);

如:

hdc = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);

取得整个屏幕的HDC。

5 CreateIC()

参数与CreateDC相同,用来创建获取信息的HDC,不能用此HDC进行绘图。

6 CreateCompatibleDC()

hdcMem = CreateCompatibleDC(hdc);
//...
DeleteDC();

创建内存DC。

7 CreateMetaFile()和CloseMetaFile()

hdcMeta = CreateMetaFile(pszFilename);
//...
hmf = CloseMetaFile(hdcMeta);

注意:所有取得HDC的函数都需要对应的关闭或者结束HDC的函数。


获取HDC的几种方法的更多相关文章

  1. PHP中获取星期的几种方法

    PHP中获取星期的几种方法   PHP星期几获取代码: 1 date(l); 2 //data就可以获取英文的星期比如Sunday 3 date(w); 4 //这个可以获取数字星期比如123,注意0 ...

  2. VC++获取IDC_EDIT的7种方法

    VC++获取IDC_EDIT的7种方法 http://blog.csdn.net/baizengfei/article/details/7997618 //第一种方法 int number1, num ...

  3. C#获取当前路径的7种方法

    总结C#获取当前路径的7种方法 C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName ...

  4. Java获取随机数的几种方法

    Java获取随机数的几种方法 .使用org.apache.commons.lang.RandomStringUtils.randomAlphanumeric()取数字字母随机10位; //取得一个3位 ...

  5. spring 获取 WebApplicationContext的几种方法

    spring 获取 WebApplicationContext的几种方法 使用ContextLoader WebApplicationContext webApplicationContext = C ...

  6. Struts2 后台获取路径的几种方法

    Struts2 后台获取路径的几种方法 package actions.app; import java.io.File; import org.apache.struts2.ServletActio ...

  7. VC获取cookies的几种方法

    方法一: CInternetSession::GetCookie This member function implements the behavior of the Win32 function  ...

  8. 体温数据上传程序开发+获取时间的三种方法+DB Browser下载及安装

    今天开始了体温上传程序的开发 今日所学: 获取时间 (21条消息) (转)安卓获取时间的三种方法_sharpeha的博客-CSDN博客_安卓获取时间 DB Browser安装教程 (20条消息) sq ...

  9. java 获取随机数的三种方法

    方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (i ...

随机推荐

  1. 2017.2.20 activiti实战--第二章--搭建Activiti开发环境及简单示例(二)简单示例

    学习资料:<Activiti实战> 第一章 搭建Activiti开发环境及简单示例 2.5 简单流程图及其执行过程 (1)leave.bpmn 后缀名必须是bpmn.安装了activiti ...

  2. mysql使用mysqldump 与 mysqlimport进行数据库迁移

    1.导入数据库 1)source source /home/platvt/product/pc2_create_tables.sql 2)mysqlimport 使用mysqlimport导入数据: ...

  3. 微信小程序 - 考试倒计时

    源码如下(csdn提供了思路 , 多谢 ,第二个小程序项目,有惊无险(_._): Page({ /** * 页面的初始数据 */ data: { timer: '', //定时器名字 countDow ...

  4. C 位域

    C 位域 如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下: struct { unsigned int widthValidated; unsigned int heightV ...

  5. java命令行

    Launches a Java application. Synopsis java [options] classname [args] java [options] -jar filename [ ...

  6. java导出excel不须要额外jar包

    眼下我知道的在java中导出Excel能够用poi或在jsp的文件头改变输出流. 以下再介绍一种就用java基础包导出的Excel.导出的格式形如: 源代码例如以下: package csvExcel ...

  7. 云数据库 RDS 版怎么创建数据库和账号MySQL 5.7版

    若要使用云数据库RDS,您需要在实例中创建数据库和账号.对于MySQL 5.7版本的实例,您需要通过RDS控制台创建一个初始账号,然后可以通过数据管理(DMS)控制台创建和管理数据库.本文将主要介绍在 ...

  8. java使用Runtime.exec()运行windwos dos或linux shell命令

    使用Runtime.exec()运行windwos dos或linux shell命令,按实际情况具体测试     实例代码: package com.bookoo.test.command; imp ...

  9. ORA-02050故障诊断一例

    http://czmmiao.iteye.com/blog/1474678昨天客户反映说在下午某时间段有几个事务失败了,让我查下当时数据库系统的负载是否正常,看了下CPU的历史负载,很正常,于是看了下 ...

  10. JVM内存最大能调多大分析【经典】

       http://hi.baidu.com/suofang/blog/item/49c637c71c0afbd0d1006028.html  上次用weblogic 把 -XmxXXXX 设成2G, ...