Windows客户端开发简介(三)

之前的一篇文章里,我简单概要的介绍了一下界面库的知识。既然是跟界面有关,那么必然少不了很多关于绘制的内容。对于Windows开发而言,界面绘制使用的一类API就是所谓的“GDI”。

GDI这个东西可有历史了,但是我们就不去追根朔源了。首先,我不能免俗的要先介绍一下它的全称:“Graphic Device Interface”,即“图形设备接口”,从这个名称我们可以大略吸收到的信息就是:GDI是个跟图形绘制有关的接口,对的,正是这样!

先让我们来看看GDI函数大致包括了哪些内容,哪些分类,因为我的这系列文章偏实用而且希望能给想进入Windows开发的程序员们提供一些捷径,所以我不做过多的理论陈述,而是打算重点介绍API的使用方法以及一些基本功能应该如何实现,当然还包括在实际开发过程中可能会遇到的坑,如何避免这些坑,还有如何提高绘制效率,如何让界面的各种行为变的流畅。

首先来介绍一下:“DC”,DC就是“设备上下文”,初学者不要去硬抠这个词的字面含义作何解释,你需要知道的是所谓设备上下文实际是一种抽象,那么它抽象出了什么呢?答案是:设备上下文抽象出了绘制设备,包括打印机,显示器等等,对于我们Windows开发人员而言,我们不需要去关注特定的绘制设备如何通信,如何调用最底层的接口来复杂的在设备上进行绘制,有了设备上下文,一切都变的透明,高效,简单。当然,在GDI上一层还有更高层的抽象,绘制更为简单,但是对于我们Windows
C++开发人员而言,那不是我们立刻需要知道的东西。我们所有对绘制设备的绘制行为,都是通过设备上下文进行的。

DC在Windows程序中的表现形式,是一个被称作“设备上下文句柄”的东西,也即HDC,HDC在代码中是一种数据类型,它是一个32位的值。我们可以通过创建一个设备上下文句柄,也即HDC类型的对象来获取对绘制设备的抽象,之后所有的绘制操作都是施加于这个HDC之上,也就是对应的设备上。也就是说,如果你的HDC代表你的当前显示区域,那么调用一个GDI函数画一条线,这条线就会出现在你的屏幕上。而如果HDC代表的是一台打印机,这条线就会绘制到打印机上,这样讲是否明白了呢?我用两段文字来解释DC和HDC,是因为这是GDI绘制图形的基础,如果没有DC和HDC,GDI的一切行为都无从谈起。

在介绍完设备上下文这个基础以后,我要讲讲GDI对象,就是说什么是GDI对象?GDI对象大概有哪些类型?每一种类型的GDI对象是做什么用的?

我这篇文章并不想写的大而全,因而我只罗列一下常见的GDI对象,比如:

Bitmap

位图对象,表征了一副位图,在内存中的组织实际是一个二进制矩阵,标识了位图每个点的位置以及相应的色彩。代码中位图用HBITMAP,即位图句柄来表示。

Font

字体对象,代表了设备上下文中的字体属性,什么字体?多大的字体?是否带下划线?是否粗体“。代码中用HFONT,字体句柄表示。

Brush

画刷对象,代表了图形的填充色,代码中用HBRUSH表示。

Pen

画笔对象,代表了线条绘制的颜色以及字体的颜色,用HPEN表示。

我们可以看出,所谓的GDI对象,实际上是设备上下文的一些属性或者说参数,它们决定了最终的绘制效果。

在介绍了这些基础概念之后,下篇文章我会把基本的GDI函数的使用方法简单介绍一下,当然,还是那些常用的,我还会说一下调用这些函数常见的容易出现的问题,如何应付以及避免这些问题。

OK!

时间: 2024-10-14 15:02:19

Windows客户端开发简介(三)的相关文章

Windows客户端开发简介(一)

在这样一个移动当道的年代,我跟大家讨论Windows客户端开发,似乎有些倚老卖老的意思了.然而我却觉得无论什么时候,Windows客户端开发其实还是有着不少实用经典的技术的.对了,确切说我是要说说Windows C++客户端开发,什么WinForm,WPF,并不在讨论范围之内,我承认用.NET ,C#做Windows客户端对开发人员来说确实是件轻松愉快的事,但是因为这些技术由于种种原因(主要还是效率问题)在经典的Windows客户端程序采用的少之又少,所以我打算把他们略过. 我并不是什么微软技术

Windows客户端开发简介(二)

一个典型的Windows客户端程序要有哪几部分构成呢?下面我会以一个国内比较流行的互联网客户端程序的基本架构来跟大家逐步展开分析,由于涉及到知识产权的问题,请大家不要问我是什么产品,当然,如果你能猜到,那我就管不着了^_^. 某视频影音互联网PC客户端产品基本架构 如上只是个粗略的分层架构图,没有更细致的划分,但是有几个地方是需要特别关注的,比如最上层的那几个部分,音视频解码引擎,UI引擎,WebKit浏览器内核,内核通信模块,日志系统. 因为音视频解码引擎和内核通信模块只是对于视频客户端和P2

Windows客户端开发简介(四)

在上一篇文章里,我简单扼要的给大家介绍了一下GDI的基础知识,包括DC,HDC,GDI对象等等,总的来说都是些偏理论的知识,属于概念的范畴. 今天这篇文章里,我就要正式开始有点实际的东西了,我会教大家一些GDI的基本功能代码编写,基本的技巧,当然还有如何避免基本的坑,哈哈,对的,基本的坑而不是高级的. 那么我要如何说起呢,首先我要告诉大家如何创建DC,如何使用DC,如何设置DC的属性(也就是GDI对象),如何在DC上绘制简单的文字,绘制图形,绘制图片也就是位图.我还会附带的说说GDI+,说说CI

windows客户端开发调试工具

本文介绍windows常用开发与调试工具. 1.windows常用开发与调试工具 1.1 Sysinternals 内核大神打造,含大量windows系统工具,windows开发必备神器,大神被MS招安. 下载地址:http://technet.microsoft.com/en-us/sysinternals Procmon.exe 监视程序运行过程中的动作,可用于性能监控. procexp.exe 相当于升级版的任务管理器,可以查看加载模块,模块查找,线程列表(含CPU百分比), 创建dump

windows客户端开发--也许是一条不归路

如今的Windows客户端开发,已经被同行嘲笑为鸡肋,甚至有些人认识做Windows客户端就是一个笑柄. 食之无味,弃之可惜. 不可否认,PC端没落的很快. 但是想说的是,任何一门技术都有存在的道理. 微软就是所有Windows客户端开发人员的大腿,虽然这个大腿让人捉摸不定,主方向总是变化. 换言之,Windows客户端开发难度不小.如果你能轻松的驾驭指针.内存.类等等,即使有一个Windows客户端彻底完蛋了,你也许只用一个星期或是一个月就掌握了另一种编程语言开发. 重要的是思想~ 我个人认为

Windows移动开发(三)——闭关修炼

上一次,我们了解了委托,委托和Lambda表达式结合是一件灰常灰常爽的事情,这也是只有.Net才有,自己偷着笑去吧.几天这次,我要介绍一下继承和多态,这是进行面向对象编程必须熟练掌握的技术和思想. 1.1 类 继承,儿子继承父亲的遗产,这是生活中的体现,在面向对象的编程中,父亲和儿子都是对象的抽象集合,也就是类.什么是类呢?就是一些具有共同特征的对象集合,例如:狗都有四条腿,一条尾巴,两只眼睛,狗都会游泳,都爱吃骨头,所以我们把具有以上特征的动物抽象成狗,我们进行面向对象编程也是这样,面向对象的

windows客户端开发--客户端国际化中特殊处理(日期等)

之前介绍了windows客户端使用xml进行国际化. 我们更多的时候关注的是显示,比如中文是关闭,英文系统显示为close. 但是在国际化过程中,还有一些其他地方不要处理的.不只是简单的翻译而已,有时候需要改变规则. 时间就是一个例子. 从学习英语我们就知道,老外时间.地址等表达方式跟我们不同. 所以这篇博客就是与您探讨探讨客户端国际化过程中对日期的特殊处理. 现在的前提是,你拿到了一个时间戳,要把它进行显示. 这非常简单,使用strftime即可. 博客http://blog.csdn.net

windows客户端开发--使你的输入框具有拖拽上传的功能

今天谈一天windows客户端拖拽上传功能. 其实主要是拖拽功能,上传是自己实现的. DragAcceptFiles 函数 最重要的就是这个函数了,看看作用: Registers whether a window accepts dropped files 原型: VOID DragAcceptFiles( HWND hWnd, BOOL fAccept ); 参数: hWnd Type: HWND The identifier of the window that is registering

windows客户端开发--根据可下载url另存为文件(微信windows客户端这样做的)

可以我的blog的标题会让你误解,那么好,没图说了xx: 比如微信windows客户端发送了一张图片,我们可以预览这张图片,还可以保存到本地: 那么windows程序是如何下载这张图片的呢? 是这样,别人给你发了一张图片,这张图片的原图会存在微信的服务器上,这样这个文件就对应了一个可下载的url. 如果你拿到了这个url,用浏览器访问,你就可以通过下载这个原图了. 但是,在浏览器下载是我们客户端控制不了的,下载路径也要在浏览器中设置,也不能方便的重命名. 那么这时候问题来了: 我们怎么样从一个u