在上一篇文章里,我简单扼要的给大家介绍了一下GDI的基础知识,包含DC,HDC。GDI对象等等,总的来说都是些偏理论的知识,属于概念的范畴。

今天这篇文章里,我就要正式開始有点实际的东西了。我会教大家一些GDI的基本功能代码编写。主要的技巧,当然还有怎样避免主要的坑。哈哈,对的,主要的坑而不是高级的。

那么我要怎样说起呢。首先我要告诉大家怎样创建DC。怎样使用DC,怎样设置DC的属性(也就是GDI对象),怎样在DC上绘制简单的文字,绘制图形,绘制图片也就是位图。

我还会附带的说说GDI+,说说CImage这个画图超级方便的类(我在我过去的项目中大量的使用了这个类)。还要说说圆角窗体的实现。包含用蒙板色的办法和用层叠窗体的办法。当然这么多的内容在这样一篇文章里肯定是写不完的,所以我将在后面的文章里逐一介绍,有兴趣的朋友能够等我一篇一篇婉婉道来。

首先来谈谈DC的使用

获取DC的方式有好几种。一般而言有例如以下几种

CreateDC,查阅MSDN可知其參数例如以下:

HDC CreateDC(LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR lpszOutput,constDEVMODE* lpInitData)

这个函数的第一个參数lpszDriver。表示你要创建DC的设备。也就是表示你想进行抽象的设备,一般而言能够是显示器或者打印机,由于用于打印的情况比較少,我们这里仅仅讨论“DISPLAY”这个參数的情况。

当第一个參数为“DISPLAY”时,lpszDevice决定了你要在哪一个显示设备上进行绘制,假设你要在主显示设备上进行绘制,能够这样调用CreateDC

CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)

这个函数的HDC类型返回值,就代表了这个显示设备,有了这个HDC,我们就能够在屏幕上进行绘制了。

以下再说第二种获取DC的方式GetDC

GetDC是基于窗体的,它仅仅有一个HWND类型參数,代表了你想进行绘制的窗体,由于它的使用方法比較简单。我这里不做多说

讲到这里,是不是认为这两个函数还挺简单。可是在使用CreateDC和GetDC创建的DC之后,GDI的对象和资源在使用完成后都是须要释放的,这里有个常见的坑,我在网上非常多的技术博客上看到不少作者都犯了这个错误。

释放DC有两种函数

DeleteDC。ReleaseDC

那么它二者有什么差别呢?

查阅MSDN对二者的Remark可知

An application must not delete a DC whose handle was obtained bycalling the GetDC function.
Instead, it mustcall the ReleaseDC function
to free the DC.

An applicationcannot use the ReleaseDC functionto release
a DC that was created by calling the CreateDC function;
instead, it must usethe DeleteDC function. ReleaseDC mustbe
called from the same thread that called GetDC.

换句话说:CreateDC与DeleteDC配对使用,而GetDC与ReleaseDC配对使用,二者不可替换,用错了释放方法。这是刚開始学习的人,甚至非常多有经验的老鸟都会犯的错误。

并且在最后。还须要有一点要注意的,RelaseDC必须在与GetDC同样的线程中进行调用。

看到这里,大家可能认为真的细节还是不少的,但这些正是区分一个Windows开发老手和菜鸟的标志,所以对于我们这些Windows开发者而言,须要注意得到地方的确非常多,我们必须一丝不苟的抠每个API的參数。含义以及坑。这大概也是一种乐趣吧。

Windowsclient开发简单介绍(四)的更多相关文章

  1. iOS-iOS开发简单介绍

    概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...

  2. iOS开发简单介绍

    概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的iOS程序.但是这里我想强调一下,前面的 ...

  3. 在线支付接口之PHP支付宝接口开发简单介绍

    php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财 ...

  4. Flask web开发 简单介绍

    Flask是一个基于python的轻量级web框架.当安装好后Flask后 (pip install flask),就可以开始使用了. 一.最简单的例子 1.新建目录,作为web应用的目录,如: mk ...

  5. iPad开发简单介绍

    iPad开发最大的不同在于iPhone的就是屏幕控件的适配,以及横竖屏的旋转. Storyboard中得SizeClass的横竖屏配置,也不支持iPad开发. 1.在控制器中得到设备的旋转方向 在 i ...

  6. web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 规范 HTML结构详解 {前端之前端初识}

    前端之前端初识   前端初识 本节目录 一 web标准 二 浏览器介绍 三 开发工具介绍 四 HTML介绍 五 HTML颜色介绍 六 规范 七 HTML结构详解 一 web标准 web准备介绍: 1. ...

  7. 下一代Asp.net开发规范OWIN(1)—— OWIN产生的背景以及简单介绍

    随着VS2013的发布,微软在Asp.Net中引入了很多新的特性,比如使用新的权限验证模块Identity, 使用Async来提高Web服务器的吞吐量和效率等.其中一个不得不提的是OWIN和Katan ...

  8. Android开发自学笔记(Android Studio)—4.界面编程与View组件简单介绍

    一.引言 Android应用开发最重要的一份内容就是界面的开发,无论你程序包含的内容多么优秀,如若没有一个良好的用户交互界面,最终也只是会被用户所遗弃.Android SDK提供了大量功能丰富的UI组 ...

  9. iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

    UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...

随机推荐

  1. JAVA JNI

    jni非常好的一篇文章 http://m.blog.csdn.net/article/details?id=22827307 JAVA JNI介绍 http://blog.csdn.net/cyg08 ...

  2. JNI的替代者—使用JNA访问Java外部功能接口

    摘自:http://www.cnblogs.com/lanxuezaipiao/p/3635556.html JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Ja ...

  3. nsinteger 与 int 区别

    在苹果的api实现中,NSInteger是一个封装,它会识别当前操作系统的位数,自动返回最大的类型.   当你不知道你的操作系统是什么类型的时候,你通常会想要使用NSInteger,所以或许你想要你的 ...

  4. Innobackupex 全备数据库

    对于MySQL数据库的热备.xtrabackup是除了MySQL enterprise backup之外的不二之选. 该工具提供了基于innodb存储引擎的热备.支持全量,增量备份,部分备份,时点恢复 ...

  5. Android开发中一些常见的问题解决方案

    分享一下自己开发中遇到的一些常见问题及解决方案,方面以后快速开发少走弯路,也可以供大家一起学习. 1.开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listvie ...

  6. 解决升级Xcode后插件不能使用的问题

    从Xcode 5开始,苹果要求加入UUID证书从而保证插件的稳定性.因此Xcode版本更新之后需要在插件的Info.plist文件中添加当前Xcode的UUID. 具体步骤如下: 1.获取Xcode的 ...

  7. Android之日期及时间选择对话框

    转:http://www.cnblogs.com/linjiqin/archive/2011/03/10/1980215.html main.xml布局文件 <?xml version=&quo ...

  8. 从汇编看c++中的虚拟继承及内存布局(二)

    下面是c++源码: class Top {//虚基类 public: int i; Top(int ii) { i = ii; } virtual int getTop() { cout <&l ...

  9. 获取mssqlserver与access数据库插入的当前行的id

    //mssqlserver public static int GetInsertId(string sql) { try { SqlCommand cmd = new SqlCommand(); u ...

  10. java性能优化技巧

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1. 尽量使用final修饰符. 带有final修饰符的类是不可派生的. ...