GDI编程小结
GDI+编程小结(二)
二、GDI+编程本部分简单介绍GDI+编程中的一些概念与技巧,具体的编程细节请参考《精通GDI+编程》、陈宝楷《GDI+编程》等书籍。
1、Point、浮点数点类PointF;Size、浮点数大小类SizeF;Rect、浮点数矩形类RectF等。
浮点数版的几何对象和绘图函数,是GDI+新增的功能,这些在各种工程技术领域都非常有用。
因为一般的实际图形设计,都是基于实数坐标的。
包括机械(机床/汽车/轮船/飞机等)、建筑(房屋/桥梁/道路/堤坝等)和图形动画设计(形状/物体/人物/背景/轨迹等)等设计,都必须使用浮点参数和坐标系。
2、Color:在GDI+中,色彩是通过Color(色彩)类来描述的。
Color类的构造函数分别为:Color();Color(BYTE a,BYTE r,BYTE g,BYTE b);Color(ARGB argb);Color(BYTE r,BYTE g,BYTE b);参数:a:色彩的透明度(0~255)r、g、b:红、绿、蓝3种色彩分量值(0~255)不同于GDI,GDI+在对色彩支持方面主要体现在对色彩的透明度支持。
从本质上讲,透明度是像素之间的一种合成运算。
它的计算公式是:输出色彩=前景色*Alpha/255 + 背景色*(255-Alpha)/2553、Graphics(图形)图形类Graphics是GDI+的核心,它提供绘制图形、图像和文本的各种方法(操作/函数)(似GDI中的CDC类),还可以存储显示设备和被画项目的属性(到图元文件)。
Graphics类及其成员函数都被定义在头文件Gdiplusgraphics.h中。
Graphics类的构造函数有如下4种:Graphics(Image* image); // 用于绘制图像Graphics(HDC hdc); // 用于在当前窗口中绘图Graphics(HDC hdc, HANDLE hdevice); // 用于在指定设备上绘制图形Graphics(HWND hwnd, BOOL icm = FALSE); // 用于在指定窗口中绘图可以进行颜色调整其中,最常用的是第二种——在当前视图窗口中绘图的图形类构造函数。
编程课程感悟总结范文
时光荏苒,转眼间,我在编程课程的学习中已经走过了数个春秋。
回首这段历程,我感慨万分,不禁对编程产生了深深的敬意。
在此,我想对这段编程课程的学习历程进行一次总结,以期为未来的学习之路提供借鉴。
一、初识编程,激发兴趣记得第一次接触编程,是在大学的第一堂计算机基础课上。
当时,我对编程一无所知,只是抱着好奇的心态去学习。
然而,随着课程的深入,我逐渐被编程的魅力所吸引。
编程让我感受到了逻辑思维的魅力,让我体会到了创造的快感。
从那时起,我对编程产生了浓厚的兴趣。
二、循序渐进,掌握基础在编程学习中,我深知基础的重要性。
因此,我始终保持着对基础知识的学习和巩固。
从C语言、Java到Python,我一步步地掌握了各种编程语言的基础语法和常用算法。
在这个过程中,我学会了如何分析问题、设计算法、编写代码,以及如何调试和优化程序。
这些基础知识为我后续的学习打下了坚实的基础。
三、实践出真知,提升技能编程是一门实践性很强的学科。
为了将所学知识运用到实际项目中,我积极参加各类编程比赛和实践项目。
通过这些经历,我不仅提高了自己的编程技能,还学会了如何与团队成员协作,共同完成一个项目。
在实践中,我深刻体会到了编程的乐趣,也认识到了自己的不足之处。
四、不断拓展,丰富知识体系随着编程知识的积累,我开始关注一些前沿技术,如人工智能、大数据等。
为了丰富自己的知识体系,我阅读了大量的专业书籍和资料,参加了线上课程和线下培训。
这些学习经历让我对编程有了更深入的理解,也让我在未来的职业发展中有了更多的选择。
五、反思与总结回顾这段编程课程的学习历程,我总结以下几点感悟:1. 兴趣是最好的老师。
只有对编程产生浓厚的兴趣,才能在学习的道路上越走越远。
2. 基础知识是关键。
打好基础,才能在编程的道路上稳步前行。
3. 实践出真知。
通过实践,可以将所学知识运用到实际项目中,提升自己的技能。
4. 不断拓展,丰富知识体系。
关注前沿技术,才能在编程领域保持竞争力。
Visual C#.NET GDI+编程实验报告
三、 实验内容
程序实现的基本步骤和实现读取 TEXT 文件中的地理坐标并画图功能 的代码如下所示: 1. 首 先 在 VS 中 新 建 一 个 windows 窗 体 应 用 程 序 , 并 命 名 为
华中师范大学
实验报告
实验名称 课程名称
Visual C#.NET GDI+编程 GIS 程序设计
专 业:地图学与地理信息系统 学 号:2014112014 实验日期:2014.12.06
学生姓名:秦自成 指导教师:刘鹏程
一、 实验目的
1. 熟悉 Visual C#.NET 程序设计中 GDI+编程的基本概念,学会添加相关绘 图命名空间的引用并创建 Graphics,Pen,Brush 等对象,掌握常用的图形 绘制方法。
GDI_PaintForm3。然后分别创建 GeoPoint 类和 PolyLine 类。 2. 在 Form1 窗体中添加 Panel 和 menuStrip 等控件,并添加图形操作和
浏览操作的相关下拉菜单,然后完成 Paint,MouseDown,MouseUp,MouseClick 等事件的响应。此步骤完成后 界面如下图所示:
3. 然后在 Form1.cs 程序中进行添加声明相关变量,创建画布,实现 MapRectangles()映射函数,为加点、加线、平移、放大、全图等功 能项添加具体的实现代码。
4. 最后是在Form1()中添加读取TEXT文件中的地理坐标点并显示在画布 上功能。读取TEXT文件的程序代码如下所示:
if (linestr == "") {
GDI_编程小结
图 水平和斜式渐变画笔
用路径渐变画笔填充图形时,可选择不同的方法来指定当从图形的一部分至另一部分移动画笔时颜色的变化方式。一种选择是指定中心颜色和边缘颜色,在从图形中间向外边缘移动画笔时,像素逐渐从一种颜色变化到另一种颜色。图显示了用路径渐变画笔填充的路径(该路径是用一对贝塞尔样条创建的)。
名称
类
功能
调整箭头帽
AdjustableArrowCap
创建自定义箭头线帽
位图
Bitmap
提供装入和保存矢量和光栅图像的方法,并可以创建和操作光栅图像
位图数据
BitmapData
保存位图的属性
模糊
Blur
将高斯模糊效果作用到图像
亮度对比度
BrightnessContrast
因为GDI+实际上是GDI的封装和扩展,GDI+的执行效率一般要低于GDI的。另外,GDI+不支持图的位运算,那么就不能进行异或绘图等操作。而且在VC中,GDI+ 还不支持双缓存机制(如内存DC和显示DC),这将大大影响GDI+ 在高速图形、图像、动画和视频等方面的应用。
3、 GDI+的使用
1) GDI+开发包
图 不同透明度
7)、丰富的图像格式支持
GDI+提供Image、Bitmap 和Metafile 类,可以用不同的格式加载、保存和操作图像。GDI+支持BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、EMF共9种常见的图像格式。
8)、GDI+的不足
虽然,相对于GDI来说,GDI+ 确实增加了许多新特性,而且功能更强大,使用也更方便。但是,这并不等于GDI+ 就能够完全代替GDI。
编程课程汇报总结范文
一、前言随着信息技术的飞速发展,编程已经成为当今社会的一项基本技能。
为了提高我国高校学生的编程能力,我校开设了编程课程。
经过一学期的学习,我对编程课程有了更加深入的了解,现将本学期的编程课程汇报总结如下。
二、课程概述本学期我们学习了C语言、Java语言和Python语言三种编程语言。
C语言作为一门面向过程的编程语言,具有高效、灵活、易学等特点;Java语言作为一门面向对象的编程语言,具有跨平台、安全性高、易于维护等优点;Python语言作为一门高级编程语言,具有简单、易学、易用等特点。
三、学习成果1. 理论知识方面通过本学期的学习,我对编程语言的基本语法、数据结构、算法等方面有了较为全面的认识。
掌握了C语言、Java语言和Python语言的基本语法,能够编写简单的程序。
2. 实践能力方面在课程实践环节,我完成了多个编程任务,如:使用C语言编写计算器、使用Java语言编写图书管理系统、使用Python语言编写爬虫程序等。
通过实践,提高了我的编程能力和问题解决能力。
3. 团队协作方面在课程实践环节,我积极参与团队协作,与同学们共同完成任务。
在团队合作中,我学会了如何与他人沟通、协调,提高了自己的团队协作能力。
四、收获与体会1. 编程思维的形成通过学习编程,我逐渐形成了编程思维。
在面对问题时,我能够从程序的角度去思考,提高了解决问题的能力。
2. 自主学习能力编程学习过程中,我学会了自主学习。
通过查阅资料、请教同学、上网课等方式,不断提高自己的编程水平。
3. 团队协作意识在课程实践中,我深刻体会到了团队协作的重要性。
在今后的学习和工作中,我将注重团队协作,提高自己的团队协作能力。
五、不足与改进1. 编程基础不够扎实在学习过程中,我发现自己在编程基础方面还有待提高。
在今后的学习中,我将加强对编程基础知识的掌握。
2. 程序设计能力有待提高在编程实践中,我发现自己在程序设计能力方面还有待提高。
在今后的学习中,我将注重程序设计能力的培养。
编程总结范文
时光荏苒,转眼间我已踏入编程领域近一年。
在这段时间里,我经历了许多挑战和成长,下面我就对这段时间的编程学习进行一次总结。
一、学习过程1. 初识编程在刚开始接触编程时,我对这门学科充满了好奇。
通过学习HTML、CSS和JavaScript,我逐渐了解了网页开发的基本原理。
这让我对编程产生了浓厚的兴趣。
2. 深入学习为了提高自己的编程能力,我学习了更多编程语言,如Python、Java和C++。
在深入学习过程中,我了解了各种编程语言的特性和应用场景。
同时,我还学习了数据结构与算法,为以后的项目开发打下了坚实的基础。
3. 实践项目为了将所学知识应用于实际,我参与了一些项目实践。
这些项目包括个人博客、在线投票系统、聊天室等。
通过实践,我不仅提高了自己的编程技能,还学会了团队协作和项目管理。
二、收获与成长1. 编程思维的提升在学习编程的过程中,我逐渐形成了良好的编程思维。
这使我能够更加清晰地分析问题,找到解决问题的方法。
同时,编程思维也让我在日常生活中更加注重逻辑性和条理性。
2. 技能的提升通过不断学习和实践,我的编程技能得到了显著提升。
现在,我能够熟练运用多种编程语言和工具,解决各种实际问题。
此外,我还学会了使用版本控制工具,如Git,以便更好地管理代码。
3. 团队协作能力的提高在项目实践中,我深刻体会到了团队协作的重要性。
通过与团队成员的沟通与交流,我学会了如何与他人合作,共同完成项目目标。
三、不足与反思1. 理论与实践的结合虽然我在学习过程中取得了一定的成绩,但仍然存在理论与实践脱节的问题。
为了解决这个问题,我计划在今后的学习中更加注重实践,将所学知识应用到实际项目中。
2. 持续学习编程领域日新月异,要想跟上时代的步伐,就必须不断学习。
在今后的学习中,我将保持谦虚的态度,努力提高自己的编程能力。
总结:回顾这段编程学习历程,我感慨万分。
编程不仅让我收获了知识,更让我成长为一个更加严谨、理性的人。
在今后的日子里,我将继续努力,不断提高自己的编程能力,为我国信息化事业贡献自己的力量。
编程学习心得(通用5篇)
编程学习心得(通用5篇)编程学习心得(通用5篇)编程学习心得要怎么写,才更标准规范?根据多年的文秘写作经验,参考优秀的编程学习心得样本能让你事半功倍,下面分享【编程学习心得(通用5篇)】相关方法经验,供你参考借鉴。
编程学习心得篇1最近我开始了一项编程学习之旅,探索了一些新的编程语言和技术。
在这个过程中,我不仅学到了很多新知识,还获得了一些重要的心得体会。
首先,我发现编程学习需要耐心和毅力。
编程是一个需要耐心和细心的过程,需要不断地调试和修改代码。
有时候,一个小小的错误可能会花费我很多时间来修复。
但是,这种经历让我学会了如何更好地解决问题,并且让我更加珍惜自己的成果。
其次,我学会了如何更好地与他人合作。
在编程学习过程中,我经常需要和其他人一起合作项目,以共同实现目标。
这种经历让我学会了如何更好地与他人协作,如何有效地沟通和解决问题。
此外,我也发现,编程学习需要不断地学习和更新知识。
在这个快速发展的领域,新的编程语言和技术不断涌现。
因此,我需要不断地学习和更新自己的知识,以保持竞争力。
最后,我意识到,编程不仅仅是一项技能,更是一种思维方式。
编程让我学会了如何更好地组织思路,如何将复杂的问题转化为可操作的代码。
这种思维方式让我在生活和工作中也受益匪浅。
总之,编程学习是一个充满挑战和收获的过程。
通过这个过程,我不仅学到了很多新知识,还获得了宝贵的生活经验。
我相信,在未来的学习和工作中,这些经历将会对我产生深远的影响。
编程学习心得篇2当然可以,以下是一份编程学习心得:时间流逝,岁月如梭,而我在编程学习之路上的经历,也随着时间的推移而不断丰富。
这份心得便是我这段旅程的独白。
首先,我必须承认,初识编程时,我感到无比困惑。
就像面对着一座巨大的迷宫,我试图从中找到方向。
我坚信,每一个初学者都会在初始阶段感受到类似的迷茫。
然而,我选择不放弃,我选择勇敢地面对。
我了解到,编程不仅仅是一种技术,更是一种解决问题的思维方式。
GDI编程
GDI编程一、GDI相关概念1、GDI(Graphics Device Interfase):图形设备接口,是一个应用程序与输出设备之间的中介。
它提供了一套函数库,这些函数在不同的输出设备上输出图形和文字。
一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道。
2、DC (Device Context):设备描述表(设备上下文),是一种Windows数据结构,包括了如线的宽度和颜色、刷子的样式和颜色、字体、剪裁区域等信息。
所有的绘制操作通过一个设备描述表进行,绘制线条、形状和文本的Windows API 函数都与DC有关。
设备可以是显示器,打印机等。
Win32下获取DC的API函数有:HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint):特定用于WM_PAINT消息HDC GetDC(HWND hWnd):用于获得hWnd参数所指定窗口的客户区域的HDC。
HDC GetWindowDC(HWND hWnd):返回hWnd参数所指定的窗口的HDC,包括非客户区,如标题栏、菜单、滚动条,以及边框等。
hWnd为NULL时,获取整个屏幕的HDC。
3、GDI对象:DC定义了一组GDI对象,包括画笔,画刷,字体,位图,调色板,剪裁区域,路径层(Path)。
他们有MFC和Win32两套实现版本,其对应关系如下:要使用这些对象,可以使用Win32函数SelectObject来将其选入DC中:HGDIOBJ SelectObject(HDC hdc, //设备上下文句柄HGDIOBJ hgdiobj //GDI对象句柄);当然,使用之前,这些对象必须存在,可以通过如下Win32函数来创建这些对象:或者,通过Win32函数HGDIOBJ GetStockObject(int fnObject)来获取系统预先定义好的如下备用对象:fnObject参数含义二、设备描述表DC在MFC中的实现MFC提供了CDC类作为设备描述表类的基类,它封装了Windows的HDC设备描述表对象和相关函数。
编程工作总结及心得体会
编程工作总结及心得体会
编程工作总结及心得体会篇3
在过去的一年里,我作为一名编程工程师,见证了自己的成长。
回首过去,我感到无比欣慰,因为我在工作中取得了一些成果,也学到了许多宝贵的经验。
我的主要工作是参与公司产品的开发,优化代码结构,提高程序性能。
我参与的项目包括一个电商系统和一个客户关系管理系统。
在工作中,我主要负责编写业务逻辑代码,并对系统进行性能优化。
在这一过程中,我遇到了许多挑战。
例如,在电商系统开发过程中,由于业务逻辑复杂,我遇到了许多问题。
为了解决这些问题,我不断学习新知识,提高自己的技能水平。
此外,我还需要与其他团队成员密切合作,确保项目按时交付。
在这个过程中,我学到了许多宝贵的经验。
例如,如何有效地管理项目进度,如何与团队成员沟通,如何解决问题等。
同时,我也遇到了一些困难,例如如何提高自己的编程速度,如何保持长期的学习态度等。
总的来说,我在过去的一年里取得了一些成果。
我参与的电商系统和客户关系管理系统的项目都得到了客户的好评。
同时,我也学到了许多宝贵的经验。
在未来,我将继续努力,提高自己的技能水平,为公司创造更多的价值。
windows程序设计实验指导书(3)GDI编程(正确)解析
实验三、Windows GDI编程实验目的:1、了解windows GDI设备环境的获取与设置。
2、了解windows GDI 绘图对象CPen,CBrush,CFont等的相关基本操作。
3、掌握建立简单图形交互的图形数据管理和鼠标工具设计等。
实验要求:建立一个windows SDI(单文档)应用程序,并编辑建立图形属性设置的无模式对话框、简单图形工具条等。
实现直线、矩形、椭圆、多边形的交互绘制及文字显示,并能进行图形属性设置。
实验可以选择竞赛作业题目,则本次的基本操作实验可以不做,竞赛作业可在课程后期交上,计算成绩有加分因素。
竞赛作业:分析微软Office系列软件的绘图工具箱组件的图形编辑功能和操作特点,抽象出其数据组织的结构体系,并分析其需要的鼠标工具类型,设计出相应合理的数据结构和鼠标工具,模拟实现简单几何图形的绘制工具(能交互设置图形属性、有图形成组操作功能,可以实现图形的简单几何变换为佳)。
实验指导:一、在VC++6.0环境中建立一个单文档工程。
1、通过资源编辑器编辑如下所示对话框资源和工具条资源。
注意生成对话框类后,为几个组合框添加字符串变量,为Spin控件添加控制变量,并为几个组合对话框添加初始数据:映射模式:MM_ANISOTROPICMM_HIENGLISHMM_HIMETRICMM_ISOTROPICMM_LOENGLISHMM_LOMETRICMM_TEXTMM_TWIPS画笔风格:PS_SOLIDPS_DASHPS_DOTPS_DASHDOTPS_DASHDOTDOTPS_NULLPS_INSIDEFRAME画刷风格:BS_HATCHEDBS_SOLID线刷风格:HS_BDIAGONALHS_CROSSHS_DIAGCROSSHS_FDIAGONALHS_HORIZONTALHS_VERTICAL为对话框类添加构造函数和变量:C*Dlg(C*View* pView);G*View* m_pView;C*Dlg::C*Dlg(C*View* pView){m_pView = (C*View* ) pView;}//重载消息void C*Dlg::PostNcDestroy(){// TODO: Add your specialized code here and/or call the base class //用于在无模式对话框关闭时自动释放堆空间delete this;CDialog::PostNcDestroy();}//通过“颜色”通用对话框设置画笔颜色void C*Dlg::OnButtonPencolor(){// TODO: Add your control notification handler code here CColorDialog dlgColor;if (dlgColor.DoModal() == IDOK){m_pView->m_lPen.lopnColor = dlgColor.GetColor();m_pView->Invalidate();}}//通过“颜色”通用对话框设置画刷颜色void C*Dlg::OnButtonBrucol(){// TODO: Add your control notification handler code here CColorDialog dlgColor;if (dlgColor.DoModal() == IDOK){m_pView->m_lBrush.lbColor = dlgColor.GetColor();m_pView->Invalidate();}}//通过“字体”通用对话框设置字体属性void C*Dlg::OnButtonFont(){// TODO: Add your control notification handler code here //声明一个“字体”通用对话框对象CFontDialog dlg;//定义“字体”通用对话框的初值dlg.m_cf.lpLogFont = &(m_pView->m_lFont);dlg.m_cf.rgbColors = m_pView->m_cFont;dlg.m_cf.Flags |= CF_INITTOLOGFONTSTRUCT;//打开“字体”通用对话框,若单击了“确定”按钮if (dlg.DoModal() == IDOK){//获取所选择的字体属性dlg.GetCurrentFont(&(m_pView->m_lFont));//获取所选择的字体颜色m_pView->m_cFont = dlg.GetColor();//重画窗口m_pView->Invalidate();}}//重载消息BOOL C*Dlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization here//控件必要的初始化m_ctrlSpin.SetRange(1,1000);m_ctrlSpin.SetBase(10);m_ctrlSpin.SetPos(1);m_ctrlPS.SetCurSel(0);m_ctrlMM.SetCurSel(6);m_ctrlHBS.SetCurSel(0);m_ctrlBS.SetCurSel(0);return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }void C*Dlg::OnApply(){// TODO: Add your control notification handler code hereUpdateData();//调用视图类的方法将图形属性设置变量传过去m_pView->OnApply();}void C*Dlg::OnOK(){// TODO: Add extra validation hereUpdateData();//也调用视图类的方法将图形属性设置变量传过去m_pView->OnApply();CDialog::OnOK();}2、在View类中添加数据成员:int m_nMapMode;//映射模式LOGBRUSH m_lBrush;//用来交互设置CDC画刷属性的逻辑画刷LOGPEN m_lPen;//用来交互设置CDC画笔属性的逻辑画笔COLORREF m_cFont;//用来交互设置CDC字体颜色LOGFONT m_lFont;//用来交互设置CDC字体属性的逻辑字体//将字符串变量与整形变量之间建立映射关系,用于对话框的数据交互CMap<int,int,CString,CString> m_mapMode;CMap<int,int,CString,CString> m_mapPen;CMap<int,int,CString,CString> m_mapBrush;CMap<int,int,CString,CString> m_mapHBrush;3、在View类中添加成员函数和实现:头文件(.h)中所加内容://无模式对话框C*Dlg* pDlg;//图形属性对话框Apply、OK按钮的消息处理void OnApply();源文件(.cpp)中所加内容:构造函数中添加内容:*View::*View(){// TODO: add construction code here//初始化映射模式的值-字符串映射表m_mapMode.SetAt(MM_ANISOTROPIC,"MM_ANISOTROPIC");m_mapMode.SetAt(MM_HIENGLISH,"MM_HIENGLISH");m_mapMode.SetAt(MM_HIMETRIC,"MM_HIMETRIC");m_mapMode.SetAt(MM_ISOTROPIC,"MM_ISOTROPIC");m_mapMode.SetAt(MM_LOENGLISH,"MM_LOENGLISH");m_mapMode.SetAt(MM_LOMETRIC,"MM_LOMETRIC");m_mapMode.SetAt(MM_TEXT,"MM_TEXT");m_mapMode.SetAt(MM_TWIPS,"MM_TWIPS");//初始化画笔样式的值-字符串映射表m_mapPen.SetAt(PS_SOLID,"PS_SOLID");m_mapPen.SetAt(PS_DASH,"PS_DASH");m_mapPen.SetAt(PS_DOT,"PS_DOT");m_mapPen.SetAt(PS_DASHDOT,"PS_DASHDOT");m_mapPen.SetAt(PS_DASHDOTDOT,"PS_DASHDOTDOT");m_mapPen.SetAt(PS_NULL,"PS_NULL");m_mapPen.SetAt(PS_INSIDEFRAME,"PS_INSIDEFRAME");//初始化画刷样式的值-字符串映射表m_mapBrush.SetAt(BS_HATCHED,"BS_HATCHED");m_mapBrush.SetAt(BS_SOLID,"BS_SOLID");m_mapBrush.SetAt(BS_NULL,"BS_NULL");//初始化线模式画笔样式的值-字符串映射表m_mapHBrush.SetAt(HS_BDIAGONAL,"HS_BDIAGONAL");m_mapHBrush.SetAt(HS_CROSS,"HS_CROSS");m_mapHBrush.SetAt(HS_DIAGCROSS,"HS_DIAGCROSS");m_mapHBrush.SetAt(HS_FDIAGONAL,"HS_FDIAGONAL");m_mapHBrush.SetAt(PS_DASHDOTDOT,"PS_DASHDOTDOT");m_mapHBrush.SetAt(HS_HORIZONTAL,"HS_HORIZONTAL");m_mapHBrush.SetAt(HS_VERTICAL,"HS_VERTICAL");//初始化映射模式,画笔、画刷、字体样式m_nMapMode = MM_TEXT;m_lBrush.lbColor = RGB(0,0,0);m_lBrush.lbHatch = HS_BDIAGONAL;m_lBrush.lbStyle = BS_HATCHED;m_lPen.lopnColor = RGB(0,0,0);m_lPen.lopnStyle = PS_SOLID;m_lPen.lopnWidth.x = 1;m_cFont = RGB(0,0,0);m_lFont.lfHeight = 30;m_lFont.lfWidth = 0;m_lFont.lfEscapement = 0;m_lFont.lfOrientation = 0;m_lFont.lfWeight = FW_NORMAL;m_lFont.lfItalic = FALSE;m_lFont.lfUnderline = FALSE;m_lFont.lfStrikeOut = FALSE;m_lFont.lfCharSet = GB2312_CHARSET;m_lFont.lfOutPrecision = OUT_STROKE_PRECIS;m_lFont.lfClipPrecision = CLIP_STROKE_PRECIS;m_lFont.lfQuality = DRAFT_QUALITY;m_lFont.lfPitchAndFamily = VARIABLE_PITCH|FF_MODERN;strcpy(m_lFont.lfFaceName,"楷体_GB2312");//无模式对话框的指针初始化pDlg = NULL;}C*View::~*View(){m_mapMode.RemoveAll();m_mapPen.RemoveAll();m_mapBrush.RemoveAll();m_mapHBrush.RemoveAll();}OnDraW()函数中添加显示文字代码:void *View::OnDraw(CDC* pDC){CExm_Menu_ToolBarDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);// TODO: add draw code for native data here//根据逻辑画笔、画刷设置设备环境画笔、画刷的属性CBrush brush;if (!brush.CreateBrushIndirect(&m_lBrush)) return;CPen pen;if (!pen.CreatePenIndirect(&m_lPen))return;CBrush* pOldBrush = pDC->SelectObject(&brush); CPen* pOldPen = pDC->SelectObject(&pen);//画矩形pDoc->DrawRects(this,pDC);//画椭圆pDoc->DrawEllipses(this,pDC);//画多边形pDoc->DrawPolygons(this,pDC);//画直线pDoc->DrawLines(this,pDC);//还原设备环境pDC->SelectObject(pOldBrush);pDC->SelectObject(pOldPen);//根据“字体”通用对话框中的选项绘制文本CFont myFont;myFont.CreateFontIndirect(&m_lFont);CFont* pOldFont = pDC->SelectObject(&myFont); pDC->SetTextColor(m_cFont);//根据逻辑字体显示文字pDC->TextOut(80,80,"字体实例,显示选择字体");//由CreateFont函数直接创建一种显示字体CFont myFont1;myFont1.CreateFont(30, //字符的逻辑高度0, //字符的平均宽度,缺省值-450, //文本行顺时针旋转45度0,FW_BOLD, //加粗体TRUE, //不倾斜TRUE, //加下划线FALSE, //不加删除线GB2312_CHARSET, //中文字符集OUT_OUTLINE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_ROMAN,"仿宋"); //宋体pOldFont = pDC->SelectObject(&myFont1);//将字体颜色设置为兰色pDC->SetTextColor(RGB(0,0,255));//根据创建字体显示文字pDC->TextOut(200,130,"自定义仿宋字体");//还原设备环境pDC->SelectObject(pOldFont);}void C*View::On*(){// TODO: Add your command handler code here//无模式对话框的建立if(pDlg == NULL){pDlg = new C*Dlg(this);pDlg->Create(IDD_DIALOG1);}pDlg->ShowWindow(SW_SHOW);}//由无模式对话框设置设备环境属性void C*View::OnApply(){m_lPen.lopnWidth.x = pDlg->m_nWeight;POSITION pos;pos = m_mapMode.GetStartPosition();while (pos != NULL){CString szMapMode;int nMapMode;m_mapMode.GetNextAssoc(pos,nMapMode,szMapMode);if (szMapMode == pDlg->m_strMode){if(m_nMapMode != nMapMode){m_nMapMode = nMapMode;m_bSelected = FALSE;}break;}}pos = m_mapPen.GetStartPosition();while (pos != NULL){CString szPenStyle;int nPenStyle;m_mapPen.GetNextAssoc(pos,nPenStyle,szPenStyle);if (szPenStyle == pDlg->m_strPStyle){m_lPen.lopnStyle= nPenStyle;break;}}pos = m_mapBrush.GetStartPosition();while (pos != NULL){CString szBrushStyle;int nBrushStyle;m_mapBrush.GetNextAssoc(pos,nBrushStyle,szBrushStyle);if (szBrushStyle == pDlg->m_strBStyle){m_lBrush.lbStyle= nBrushStyle;break;}}pos = m_mapHBrush.GetStartPosition();while (pos != NULL){CString szHBrushStyle;int nHBrushStyle;m_mapHBrush.GetNextAssoc(pos,nHBrushStyle,szHBrushStyle);if (szHBrushStyle == pDlg->m_strHBrush){m_lBrush.lbHatch= nHBrushStyle;break;}}Invalidate();}4、在文挡类中添加相关绘图对象数据成员和方法:头文件中://存储图形数据的数据结构CArray<CRect,CRect> m_lineObj;CArray<CRect,CRect> m_rectObj;CArray<CRect,CRect> m_ellipseObj;CTypedPtrList<CObList, CDrawPolygon*> m_polygonObj;//向数据集中追加新的数据的函数void AddLine(CRect rect);void AddRect(CRect rect);void AddEllipse(CRect rect);void AddPolygon(CDrawPolygon* pPoly);//画图形的函数void DrawLines(C*View* pView,CDC* pDC);void DrawRects(C*View* pView,CDC* pDC);void DrawEllipses(C*View* pView,CDC* pDC);void DrawPolygons(C*View* pView,CDC* pDC); 源文件中:C*Doc::~C*Doc(){//释放内存m_lineObj.RemoveAll();m_rectObj.RemoveAll();m_ellipseObj.RemoveAll();while(!m_polygonObj.IsEmpty()){delete m_polygonObj.GetHead();m_polygonObj.RemoveHead();}}void C*Doc::AddLine(CRect rect){m_lineObj.Add(rect);UpdateAllViews(NULL);}void C*Doc::AddRect(CRect rect){m_rectObj.Add(rect);UpdateAllViews(NULL);}void C*Doc::AddEllipse(CRect rect){m_ellipseObj.Add(rect);UpdateAllViews(NULL);}void C*Doc::AddPolygon(CDrawPolygon* pPoly) {pPoly->m_nID = m_polygonObj.GetCount()+1;m_polygonObj.AddTail(pPoly);UpdateAllViews(NULL);}void C*Doc::DrawLines(C*View* pView,CDC* pDC){CString str;for(int i = 0; i < m_lineObj.GetSize(); i++){CRect rect = m_lineObj[i];pView->DocToClient(rect);pDC->MoveTo(rect.TopLeft());pDC->LineTo(rect.BottomRight());str.Format("%d",i+1);pDC->TextOut(rect.left+rect.Width()/2+5,rect.top+rect.Height()/2-15,str);}}void C*Doc::DrawRects(C*View* pView,CDC* pDC){CString str;for(int i = 0; i < m_rectObj.GetSize(); i++){CRect rect = m_rectObj[i];pView->DocToClient(rect);pDC->Rectangle(rect);str.Format("%d",i+1);pDC->TextOut(rect.left+2*rect.Width()/3,rect.top+rect.Height()/3, str);}}void C*Doc::DrawEllipses(C*View* pView,CDC* pDC){CString str;for(int i = 0; i < m_ellipseObj.GetSize(); i++){CRect rect = m_ellipseObj[i];pView->DocToClient(rect);pDC->Ellipse(rect);str.Format("%d",i+1);pDC->TextOut(rect.left+2*rect.Width()/3,rect.top+rect.Height()/3, str);}}void C*Doc::DrawPolygons(C*View* pView,CDC* pDC){CString str;int index = 0;POSITION pos = m_polygonObj.GetHeadPosition();while(pos != NULL){index++;CDrawPolygon* poly = m_polygonObj.GetNext(pos);int num = poly->m_nPoints;CPoint* pts = new CPoint[num];for(int i = 0; i < num; i++){CPoint pt = poly->m_points[i];pView->DocToClient(pt);pts[i] = pt;}pDC->Polygon(pts, num);delete[] pts;str.Format("%d",index);int xx = poly->m_boundRect.left+poly->m_boundRect.Width()/2;int yy = poly->m_boundRect.top+poly->m_boundRect.Height()/2;pDC->TextOut(xx,yy,str);}}5、在工具栏加绘图按钮将鼠标工具类(DrawTool.h DrawTool.cpp)和相关数据结构头文件(DrawObjStruct.h)加入工程,在View类中添加绘图工具栏和鼠标消息的处理.void C*View::OnButtonLine(){// TODO: Add your command handler code hereCDrawTool::c_drawShape = line;}void C*View::OnButtonRect(){// TODO: Add your command handler code hereCDrawTool::c_drawShape = rectangle;}void C*View::OnButtonEllips(){// TODO: Add your command handler code hereCDrawTool::c_drawShape = ellipse;}void C*View::OnButtonPolygen(){// TODO: Add your command handler code hereCDrawTool::c_drawShape = polygon;}void C*View::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape); if (pTool != NULL)pTool->OnLButtonDown(this, nFlags, point);// CView::OnLButtonDown(nFlags, point);}void C*View::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape); if (pTool != NULL)pTool->OnLButtonUp(this, nFlags, point);// CView::OnLButtonUp(nFlags, point);}void C*View::OnLButtonDblClk(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape); if (pTool != NULL)pTool->OnLButtonDblClk(this, nFlags, point);// CView::OnLButtonDblClk(nFlags, point);}void C*View::OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape); if (pTool != NULL)pTool->OnMouseMove(this, nFlags, point);// CView::OnMouseMove(nFlags, point);}。
社团课编程总结范文
随着科技的飞速发展,编程已经成为当代青少年必备的一项技能。
在这个信息爆炸的时代,掌握编程知识不仅能让我们更好地适应未来社会的发展,还能激发我们的创新思维和解决问题的能力。
近期,我参加了学校举办的社团课编程学习,通过这段时间的学习,我对编程有了更深入的了解,以下是我对这次社团课编程的总结。
一、学习内容1. 编程基础:学习了编程语言的基础知识,如变量、数据类型、运算符、控制结构等。
2. 数据结构与算法:了解了常见的数据结构(如数组、链表、栈、队列等)及其应用,掌握了基本的算法思想。
3. 编程实践:通过实际项目,如制作小游戏、编写简单的网站等,将所学知识应用于实际,提高编程能力。
4. 软件开发工具:熟悉了常用的编程工具,如集成开发环境(IDE)、版本控制工具(如Git)等。
二、收获与体会1. 培养了逻辑思维能力:编程需要严谨的逻辑思维,通过学习编程,我的逻辑思维能力得到了很大提升。
2. 提高了创新能力:在编程过程中,我学会了如何分析问题、寻找解决方案,并在实践中不断优化,这让我在创新方面有了很大进步。
3. 学会了团队协作:在社团课中,我们常常需要分工合作完成项目,这让我学会了与他人沟通、协作,提高了团队协作能力。
4. 增强了自信心:通过完成一个个项目,我对自己在编程方面的能力有了信心,这让我更有动力去深入学习。
三、不足与改进1. 理论知识掌握不够扎实:在学习过程中,我发现自己在理论知识方面还存在一些不足,今后需要加强理论学习,为实践打下坚实基础。
2. 编程速度较慢:在编程实践中,我的编程速度相对较慢,今后需要多加练习,提高编程效率。
3. 问题解决能力有待提高:在遇到编程问题时,我的解决能力还有待提高,今后需要多向他人请教,积累经验。
四、展望未来通过这次社团课编程学习,我深刻认识到编程在现代社会的重要性。
在今后的学习和工作中,我将继续努力,提高自己的编程能力,为我国科技事业贡献自己的力量。
总之,这次社团课编程学习让我受益匪浅。
编程课程自我总结范文
时间过得真快,转眼间,我在学校的编程课程已经结束了。
回顾这段时间的学习,我收获颇丰,不仅掌握了编程的基本知识和技能,还提升了自身的综合素质。
以下是我对这段编程课程的学习进行的一次自我总结。
一、课程学习成果1. 理论知识方面在课程中,我学习了编程语言的基本概念、语法规则和编程思想。
通过学习C语言、Python语言等,我对编程有了更深入的了解。
同时,我还学习了数据结构、算法等基础知识,为以后的学习打下了坚实的基础。
2. 实践能力方面在课程中,我积极参与了各类编程实践项目。
通过完成作业、实验和课程设计,我提高了编程技能,学会了如何运用所学知识解决实际问题。
在项目实践中,我学会了团队协作、沟通和项目管理等能力。
3. 思维方式方面编程课程培养了我严谨的逻辑思维和解决问题的能力。
在面对复杂问题时,我学会了分析问题、设计算法和实现代码,使我在面对困难时更加从容。
二、学习过程中的体会1. 重视基础知识在学习编程的过程中,我发现基础知识的重要性。
只有掌握了扎实的理论基础,才能在编程实践中游刃有余。
因此,我在学习过程中,注重对基本概念、语法规则和编程思想的理解和掌握。
2. 注重实践操作编程是一门实践性很强的学科。
在课程中,我通过大量实践操作,巩固了所学知识,提高了编程技能。
同时,我也明白了理论知识与实践操作相结合的重要性。
3. 团队合作与沟通在课程项目中,我与同学们共同协作,完成了多个编程任务。
在这个过程中,我学会了如何与他人沟通、协调,提高了团队协作能力。
4. 持续学习与探索编程领域不断发展,新技术、新工具层出不穷。
为了跟上时代的步伐,我需要在学习过程中保持持续学习的态度,不断探索新的编程技术和方法。
三、未来展望在今后的学习和工作中,我将继续努力提高自己的编程能力,以下是我对未来的一些规划:1. 深入学习编程语言和框架,提高自己的编程技能。
2. 关注行业动态,了解新技术,不断丰富自己的知识体系。
3. 积极参与开源项目,提升自己的实战经验。
编程课程总结文案范文
---编程课程总结:开启数字化未来的钥匙随着信息技术的飞速发展,编程已成为现代社会不可或缺的一项技能。
在过去的一个学期里,我有幸参加了学校举办的编程课程,通过系统的学习和实践,我对编程有了更加深刻的认识。
以下是我对本次编程课程的总结与感悟。
一、课程概述本次编程课程旨在培养学生掌握基础的编程知识和技能,使其能够运用编程语言解决实际问题。
课程内容涵盖了Python编程语言的基础语法、数据结构、算法、面向对象编程以及Web开发等多个方面。
通过理论与实践相结合的教学模式,使学生在短时间内能够快速掌握编程的核心技能。
二、课程收获1. 基础知识扎实:通过课程的学习,我对Python编程语言的基础语法有了全面而深入的了解,包括变量、数据类型、运算符、控制结构等。
这些基础知识为后续深入学习奠定了坚实的基础。
2. 编程思维提升:编程课程不仅教授了编程语言,更重要的是培养了学生的编程思维。
在课程中,我们通过解决实际问题来锻炼逻辑思维和问题解决能力,这对我今后的学习和工作都具有极大的帮助。
3. 实践能力增强:课程注重实践操作,通过大量的编程练习和项目实战,我学会了如何将理论知识应用于实际项目中。
这不仅提高了我的编程技能,还让我体会到了编程的乐趣。
4. 团队协作能力:在课程的项目实战中,我与同学们共同合作,共同解决问题。
这使我认识到了团队协作的重要性,也锻炼了我的团队协作能力。
三、课程感悟1. 编程是一项技能,需要不断学习:编程技术日新月异,作为一名编程学习者,要时刻保持学习的热情,不断更新自己的知识体系。
2. 编程需要耐心和毅力:编程过程中会遇到各种问题,解决这些问题需要耐心和毅力。
只有不断尝试和总结,才能逐步提高自己的编程水平。
3. 编程是一种表达方式:编程不仅是一种技能,更是一种表达方式。
通过编程,我们可以将想法变为现实,创造出有价值的软件产品。
4. 编程是未来趋势:随着人工智能、大数据等技术的快速发展,编程已成为未来社会的重要技能。
gdi学习及代码总结
竭诚为您提供优质文档/双击可除gdi学习及代码总结篇一:gDI学习总结上海鼎为通讯科技有限公司上海鼎为通讯科技有限公司鼎为通讯科技DewavcommunicationTechnologyco.,Ltd.gDI学习总结文件编号Doc.no.:页数page:12报告人:neil版本Version:V1.0上海鼎为通讯科技有限公司1历次修正记录序号1变更日期20XX-10-11原因创建文档变更摘要版本1.0提出者neil批准2目录1gDI简介................................................. ................................................... ...................................42gDI功能描述和架构分析.................................................................................................... ........432DApIs和文本功能................................................. ................................................... .................63.1点................................................. ................................................... ....................................63.2线................................................. ................................................... ....................................63.3框................................................. ................................................... ....................................63.4文本................................................. ................................................... ................................73.4.1字体................................................. ................................................... ......................73.4.2带边框的文本................................................. ................................................... (74)层................................................. ................................................... ..............................................74.1准备................................................. ................................................... ................................84.2创建层................................................. ................................................... ............................84.3激活层................................................. ................................................... ............................94.4基础层................................................. ................................................... ..........................104.5合并层................................................. ................................................... ..........................114.6层坐标系................................................. .........................................................................114.7剪切................................................. ................................................... ..............................124.8透明度................................................. ................................................... ...........................124.9通透................................................. ................................................... ..............................124.10图像旋转................................................. ................................................... ....................135流程跟踪................................................. ................................................... .................................156参考文档................................................. ................................................... (153)1gDI简介gDI是graphicsDeviceInterface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有windows程序的图形输出。
在C#中使用GDI的简单总结
在C#中使⽤GDI的简单总结在C#中使⽤GDI的简单总结在C#默认⽀持的是GDI+库,使⽤GDI+库,有很丰富的函数和排版⼿段,可以满⾜⼤部分的要求.除⾮,你需要使⽤bitmap字体,GDI+对于字体的⽀持有很⼤限制,⽀持truetype字体,⽽对于点阵字体(栅格字体)则不再⽀持,但是很多字体都是这种点阵字体,这样就带来⼀个问题,使⽤不了了.⽽很多公司则会⾃⼰制作某些⽤途的字体,⽐如说在LED显⽰屏上使⽤,这个时候使⽤GDI+则不再是⼀个明智的选择了.此外GDI+虽然强⼤,但是经过测试发现效率却是低下,速度⽐GDI慢了不少.但是CS的界⾯开发环境和编码习惯⼜很适合,所以⽐较折衷的解决⽅法是使⽤C#调⽤系统的gdi api函数实现编程.⾸先C#环境中的color结构是AARRGGBB,⽽在win32的颜⾊结构却是AABBGGRR,所以如果不注意则会使到颜⾊出现偏差或者逆转.在.net环境的类库当中,在system.drawing的命名空间中有ColorTranslator.ToWin32()这个函数,来对color结构转换成win32的api使⽤的颜⾊结构.GDI中⽐较重要的函数,gdi函数基本都是来之⼀个dll. Gdi32.dll[DllImport("gdi32.dll")]public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);[DllImport("GDI32.dll")]public static extern bool DeleteObject(IntPtr objectHandle);[DllImport("gdi32.dll")]public static extern bool FillRgn(IntPtr hdc, IntPtr hrgn, IntPtr hbr);[DllImport("gdi32.dll")]public static extern IntPtr CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect,int nBottomRect);[DllImport("gdi32.dll")]public static extern IntPtr CreateSolidBrush(Int32 crColor);[DllImport("gdi32.dll")]public static extern int SetBkMode(IntPtr hdc, int iBkMode);public const int TRANSPARENT = 1;public const int OPAQUE = 2;[DllImport("gdi32.dll")]static extern uint SetBkColor(IntPtr hdc, int crColor);[DllImport("gdi32.dll")]static extern uint SetTextColor(IntPtr hdc, int crColor);[DllImport("gdi32", EntryPoint = "CreateFontW", CharSet = CharSet.Auto)]static extern IntPtr CreateFontW([In] Int32 nHeight,[In] Int32 nWidth,[In] Int32 nEscapement,[In] Int32 nOrientation,[In] FontWeight fnWeight,[In] Boolean fdwItalic,[In] Boolean fdwUnderline,[In] Boolean fdwStrikeOut,[In] FontCharSet fdwCharSet,[In] FontPrecision fdwOutputPrecision,[In] FontClipPrecision fdwClipPrecision,[In] FontQuality fdwQuality,[In] FontPitchAndFamily fdwPitchAndFamily,[In] String lpszFace);[DllImport("gdi32.dll")]public static extern int GetTextFace(IntPtr hdc, int nCount,[Out] StringBuilder lpFaceName);public const Int32 LF_FACESIZE = 32;[DllImport("gdi32.dll", ExactSpelling = true)]public static extern bool BitBlt(IntPtr hdcDest, // ⽬标设备的句柄int nXDest, // ⽬标对象的左上⾓的X坐标int nYDest, // ⽬标对象的左上⾓的Y坐标int nWidth, // ⽬标对象的矩形的宽度int nHeight, // ⽬标对象的矩形的长度IntPtr hdcSrc, // 源设备的句柄int nXSrc, // 源对象的左上⾓的X坐标int nYSrc, // 源对象的左上⾓的X坐标TernaryRasterOperations dwRop // 光栅的操作值);[DllImport("gdi32.dll")]public static extern bool StretchBlt(IntPtr hdcDest, int nXOriginDest, int nYOriginDest,int nWidthDest, int nHeightDest,IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,TernaryRasterOperations dwRop);[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetTextExtentPoint(IntPtr hdc, string lpString,int cbString, ref Size lpSize);[DllImport("Gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetTextMetrics(IntPtr hdc, out TEXTMETRIC lptm);[DllImport("gdi32.dll")]public static extern bool GetCharABCWidthsFloatW(IntPtr hdc, uint iFirstChar, uint iLastChar, [Out] ABCFloat[] lpABCF);[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool TextOutW(IntPtr hdc, int nXStart, int nYStart,string lpString, int cbString);[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetCharWidth32(IntPtr hdc, uint iFirstChar, uint iLastChar,[Out] int[] lpBuffer);[DllImport("user32.dll", CharSet = CharSet.Unicode)]public static extern int DrawText(IntPtr hdc, string lpStr, int nCount, ref Rect lpRect, dwDTFormat wFormat);[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]static extern IntPtr CreateCompatibleDC(IntPtr hdc);[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]static extern bool DeleteDC(IntPtr hdc);这些都是在GDI中⽐较常⽤的函数,其中SelectObject,和DeleteObject更是关键,在GDI的使⽤中最容易出现的问题就是内存泄漏,很多时候是因为没有正确释放资源引起的.所以需要特别⼩⼼,在GDI中释放资源使⽤DeleteObject这个函数来释放.下⾯来实现⼀些具体的函数////// 填充特定DC的⼀个区域的特定颜⾊////// 给定DC/// 给定区域/// 给定颜⾊public static void FillRect(IntPtr hdc, Rectangle Rect, Color FillColor){IntPtr fillBrush = CreateSolidBrush(ColorTranslator.ToWin32(FillColor));IntPtr rectR = CreateRectRgn(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);FillRgn(hdc, rectR, fillBrush);DeleteObject(rectR);DeleteObject(fillBrush);}这个函数实现对⼀个区域填充⼀个颜⾊, 当中创建了画笔,创建了区域,然后最后,当然还要记得释放两者占⽤的资源.创建字体函数public static IntPtr CreatFont(String FontName, Int32 Height, FontStyle Style){IntPtr Result;// = IntPtr.Zero;FontWeight boldWeight = FontWeight.FW_NORMAL;Boolean Italic = false;Boolean Underline = false;Boolean Bold = false;if ((Style & FontStyle.Bold) != 0){Bold = true;}if ((Style & FontStyle.Italic) != 0){Italic = true;}if ((Style & FontStyle.Underline) != 0){Underline = true;}if (Bold){boldWeight = FontWeight.FW_BOLD;}Result = CreateFontW(Height, 0, 0, 0, boldWeight, Italic, Underline, false,FontCharSet.DEFAULT_CHARSET, FontPrecision.OUT_DEFAULT_PRECIS,FontClipPrecision.CLIP_DEFAULT_PRECIS, FontQuality.DRAFT_QUALITY,FontPitchAndFamily.DEFAULT_PITCH, FontName);return Result;}在.net中,默认的字体类,不⽀持点阵字体,所以要使⽤CreateFontW这个函数来创建⾃⼰的字体资源,其中⼤部分的选项都试⽤默认值即可.然后就是设置画板字体,在GDI环境中,DC是带着字体的,⽽不像GDI+那样⼦是分离的,所以经常需要设置不同的字体public static IntPtr SetCanvasFont(IntPtr hdc, ApiFont NewFont){IntPtr FontPtr = CreatFont(, NewFont.Size, NewFont.Style);IntPtr OldPtr = SelectObject(hdc, FontPtr);DeleteObject(OldPtr);return OldPtr;}这个函数,将DC原来的字体资源释放掉,这样的实现会带来⼀个新的问题,因为⼀般来说都需要将DC原来的字体资源再通过selectobject函数放回去,然后将新的字体资源释放掉.所以这个函数是要⼩⼼使⽤的.所以就有了第⼆个版本public static IntPtr SetCanvasFontNotDelete( IntPtr hdc, ApiFont NewFont ){IntPtr FontPtr = CreatFont(, NewFont.Size, NewFont.Style);IntPtr OldPtr = SelectObject(hdc, FontPtr);return OldPtr;}这样⼦就可以⼿动的释放资源,但是需要特别注意,的是⼀定要记得释放掉字体资源.⼀般的使⽤画图的步骤IntPtr pTarget = e.Graphics.GetHdc();IntPtr pSource = CreateCompatibleDC(pTarget);IntPtr pOrig = SelectObject(pSource, drawBmp.GetHbitmap());GDIApi.StretchBlt(pTarget, 0, 0, this.Width, this.Height, pSource, 0, 0, drawWidth, drawHeight, TernaryRasterOperations.SRCCOPY);IntPtr pNew = SelectObject(pSource, pOrig);DeleteObject(pNew);DeleteDC(pSource);e.Graphics.ReleaseHdc(pTarget);这样⼦就可以将drawBmp画到e.graphics上⾯了.最重要的是后⾯释放掉资源,否则内存的泄漏速度是很厉害的.我的软件每次重画就有7M左右的泄漏.⼀下⼦从⼗⼏M的内存上升到⼏百M的内存占⽤[DllImport("gdi32.dll")]public static extern int SetBkMode( IntPtr hdc, int iBkMode );public const int TRANSPARENT = 1;public const int OPAQUE = 2;这个函数是设置透明度的,参数2如果为1则是透明,2则是不透明.不透明的话,将字符串画上去的时候,会有⽩⾊的背景.⼀般来说设为透明.获取字符或者字体的信息函数[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetTextExtentPoint( IntPtr hdc, string lpString,int cbString, ref Size lpSize );[DllImport("Gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetTextMetrics( IntPtr hdc, out TEXTMETRIC lptm );[DllImport("gdi32.dll")]public static extern bool GetCharABCWidthsFloatW( IntPtr hdc, uint iFirstChar, uint iLastChar, [Out] ABCFloat[] lpABCF );[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetCharWidth32( IntPtr hdc, uint iFirstChar, uint iLastChar,[Out] int[] lpBuffer );这⼏个函数都可以获取字体或者字符串占⽤的空间⼤⼩,⽽⼜各有区别.GetTextExtentPoint可以⽅便的获取⼀个字符串,或者字符串的部分的长度,因为可以通过cbString这个长度来控制获取的范围. GetTextMetrics则是获取⼀个字体的各种⾼度信息,包括height,ascent,descent,还包括字体能够表现的字符范围等等信息. GetCharABCWidthsFloatW则是获取某段连续字符串的abcwidth信息,abcwidth信息在某些情况下,需要特别注意,否则斜体会排版得很难看. GetCharWidth32获取⼀个连续的字符段的宽度信息, 但是根据实践,居然和GetTextExtentPoint获取的信息不⼤⼀致,暂时是少于实际占⽤的空间.使到计算出来的占⽤宽度实际上不⾜以容纳字符串的排版.字符串的描绘这是在gdi操作中⾮常重要的⼀部分,使⽤Gdi是因为需要使⽤特殊字体,⽽字体当然是针对字符串来使⽤的的.所以,这根本就是使⽤gdi的⽬的.常⽤的字符串输出有来个函数[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool TextOutW( IntPtr hdc, int nXStart, int nYStart,string lpString, int cbString );[DllImport("user32.dll", CharSet = CharSet.Unicode)]public static extern int DrawText( IntPtr hdc, string lpStr, int nCount, ref Rect lpRect, dwDTFormat wFormat );TextOutW是⼀个⽐较简单的函数,适合⼀般的场合,只需要设置X和Y的坐标即可DrawText,则会控制输出的空间⼤⼩,排版规则.⽐较适合需要精确控制的场所,⼜或者⽐如说输出阿拉伯⽂字的时候,要设置为右对齐.获取系统所有的字体由于C#不⽀持点阵字体,所以⾃然地,使⽤.net提供的函数,获取的安装字体列表⾃然是不包含点阵字体的.所以并不符合我的要求.所以还得使⽤系统的api函数,来获取安装字体列表.private Int32 EnumFontCallBack(ref ENUMLOGFONTEX lpelfe, IntPtr lpntme, int FontType, int lParam){//Debug.WriteLine(lpelfe.elfFullName);if (lpelfe.elfFullName.Substring(0, 1) != "@"){if (!sysFontList.Contains(lpelfe.elfFullName)){sysFontList.Add(lpelfe.elfFullName);}}return 1;}LOGFONT logfont = new LOGFONT();logfont.lfCharSet = FontCharSet.DEFAULT_CHARSET;Bitmap bmp = new Bitmap(10, 10);Graphics g = Graphics.FromImage(bmp);IntPtr hDC = g.GetHdc();EnumFontFamilies.EnumFontFamiliesEx(hDC, logfont, EnumFontCallBack, IntPtr.Zero, 0);g.ReleaseHdc(hDC);g.Dispose();bmp.Dispose();public class EnumFontFamilies{public const int LF_FACESIZE = 32;public delegate int EnumFontExDelegate( ref ENUMLOGFONTEX lpelfe, IntPtr lpntme, int FontType, int lParam );[DllImport("gdi32.dll", EntryPoint = "EnumFontFamiliesEx", CharSet = CharSet.Unicode)]public static extern int EnumFontFamiliesEx( IntPtr hDC, [In] LOGFONT logFont, EnumFontExDelegate enumFontExCallback, IntPtr lParam, uint dwFlags );}其中EnumFontCallBack为回调函数,通过这个回调函数,可以获取到系统所有的字体,包括点阵的字体.附录A:GDI使⽤的结构和常量[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]public struct ENUMLOGFONTEX{public LOGFONT elfLogFont;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string elfFullName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string elfStyle;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string elfScript;}[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class LOGFONT{public int lfHeight;public int lfWidth;public int lfEscapement;public int lfOrientation;public FontWeight lfWeight;[MarshalAs(UnmanagedType.U1)]public bool lfItalic;[MarshalAs(UnmanagedType.U1)]public bool lfUnderline;[MarshalAs(UnmanagedType.U1)]public bool lfStrikeOut;public FontCharSet lfCharSet;public FontPrecision lfOutPrecision;public FontClipPrecision lfClipPrecision;public FontQuality lfQuality;public FontPitchAndFamily lfPitchAndFamily;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string lfFaceName;public override string ToString(){StringBuilder sb = new StringBuilder();sb.Append("LOGFONT\n");sb.AppendFormat(" lfHeight: {0}\n", lfHeight);sb.AppendFormat(" lfWidth: {0}\n", lfWidth);sb.AppendFormat(" lfEscapement: {0}\n", lfEscapement);sb.AppendFormat(" lfOrientation: {0}\n", lfOrientation);sb.AppendFormat(" lfWeight: {0}\n", lfWeight);sb.AppendFormat(" lfItalic: {0}\n", lfItalic);sb.AppendFormat(" lfUnderline: {0}\n", lfUnderline);sb.AppendFormat(" lfStrikeOut: {0}\n", lfStrikeOut);sb.AppendFormat(" lfCharSet: {0}\n", lfCharSet);sb.AppendFormat(" lfOutPrecision: {0}\n", lfOutPrecision);sb.AppendFormat(" lfClipPrecision: {0}\n", lfClipPrecision);sb.AppendFormat(" lfQuality: {0}\n", lfQuality);sb.AppendFormat(" lfPitchAndFamily: {0}\n", lfPitchAndFamily);sb.AppendFormat(" lfFaceName: {0}\n", lfFaceName);return sb.ToString();}}public enum FontWeight : int{FW_DONTCARE = 0,FW_THIN = 100,FW_EXTRALIGHT = 200,FW_LIGHT = 300,FW_NORMAL = 400,FW_MEDIUM = 500,FW_SEMIBOLD = 600,FW_BOLD = 700,FW_EXTRABOLD = 800,FW_HEAVY = 900,}public enum FontCharSet : byte{ANSI_CHARSET = 0,DEFAULT_CHARSET = 1,SYMBOL_CHARSET = 2,SHIFTJIS_CHARSET = 128,HANGEUL_CHARSET = 129,HANGUL_CHARSET = 129,GB2312_CHARSET = 134,CHINESEBIG5_CHARSET = 136,OEM_CHARSET = 255,JOHAB_CHARSET = 130,HEBREW_CHARSET = 177,ARABIC_CHARSET = 178,GREEK_CHARSET = 161,TURKISH_CHARSET = 162,VIETNAMESE_CHARSET = 163,THAI_CHARSET = 222,EASTEUROPE_CHARSET = 238, RUSSIAN_CHARSET = 204,MAC_CHARSET = 77,BALTIC_CHARSET = 186,}public enum FontPrecision : byte{OUT_DEFAULT_PRECIS = 0,OUT_STRING_PRECIS = 1,OUT_CHARACTER_PRECIS = 2, OUT_STROKE_PRECIS = 3,OUT_TT_PRECIS = 4,OUT_DEVICE_PRECIS = 5,OUT_RASTER_PRECIS = 6,OUT_TT_ONLY_PRECIS = 7,OUT_OUTLINE_PRECIS = 8,OUT_SCREEN_OUTLINE_PRECIS = 9, OUT_PS_ONLY_PRECIS = 10,}public enum FontClipPrecision : byte{CLIP_DEFAULT_PRECIS = 0,CLIP_CHARACTER_PRECIS = 1, CLIP_STROKE_PRECIS = 2,CLIP_MASK = 0xf,CLIP_LH_ANGLES = (1 << 4),CLIP_TT_ALWAYS = (2 << 4),CLIP_DFA_DISABLE = (4 << 4),CLIP_EMBEDDED = (8 << 4),}public enum FontQuality : byte{DEFAULT_QUALITY = 0,DRAFT_QUALITY = 1,PROOF_QUALITY = 2, NONANTIALIASED_QUALITY = 3, ANTIALIASED_QUALITY = 4,CLEARTYPE_QUALITY = 5,CLEARTYPE_NATURAL_QUALITY = 6,}[Flags]public enum FontPitchAndFamily : byte{DEFAULT_PITCH = 0,FIXED_PITCH = 1,VARIABLE_PITCH = 2,FF_DONTCARE = (0 << 4),FF_ROMAN = (1 << 4),FF_SWISS = (2 << 4),FF_MODERN = (3 << 4),FF_SCRIPT = (4 << 4),FF_DECORATIVE = (5 << 4),}/// <summary>/// Enumeration for the raster operations used in BitBlt./// In C++ these are actually #define. But to use these/// constants with C#, a new enumeration type is defined./// </summary>public enum TernaryRasterOperations{SRCCOPY = 0x00CC0020, /* dest = source */SRCPAINT = 0x00EE0086, /* dest = source OR dest */SRCAND = 0x008800C6, /* dest = source AND dest */ SRCINVERT = 0x00660046, /* dest = source XOR dest */ SRCERASE = 0x00440328, /* dest = source AND (NOT dest ) */ NOTSRCCOPY = 0x00330008, /* dest = (NOT source) */ NOTSRCERASE = 0x001100A6, /* dest = (NOT src) AND (NOT dest) */ MERGECOPY = 0x00C000CA, /* dest = (source AND pattern) */ MERGEPAINT = 0x00BB0226, /* dest = (NOT source) OR dest */ PATCOPY = 0x00F00021, /* dest = pattern */PATPAINT = 0x00FB0A09, /* dest = DPSnoo */PATINVERT = 0x005A0049, /* dest = pattern XOR dest */ DSTINVERT = 0x00550009, /* dest = (NOT dest) */BLACKNESS = 0x00000042, /* dest = BLACK */WHITENESS = 0x00FF0062, /* dest = WHITE */};[Flags]public enum dwDTFormat : int{DT_TOP = 0, DT_LEFT = 0x00000000, DT_CENTER = 0x00000001, DT_RIGHT = 0x00000002,DT_VCENTER = 0x00000004, DT_BOTTOM = 0x00000008, DT_WORDBREAK = 0x00000010, DT_SINGLELINE = 0x00000020,DT_EXPANDTABS = 0x00000040, DT_TABSTOP = 0x00000080, DT_NOCLIP = 0x00000100, DT_EXTERNALLEADING = 0x00000200, DT_CALCRECT = 0x00000400, DT_NOPREFIX = 0x00000800, DT_INTERNAL = 0x00001000};public struct Rect{public int Left, Top, Right, Bottom;public Rect( Rectangle r ){this.Left = r.Left;this.Top = r.Top;this.Bottom = r.Bottom;this.Right = r.Right;}}[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]public struct TEXTMETRIC{public Int32 tmHeight;public Int32 tmAscent;public Int32 tmDescent;public Int32 tmInternalLeading;public Int32 tmExternalLeading;public Int32 tmAveCharWidth;public Int32 tmMaxCharWidth;public Int32 tmWeight;public Int32 tmOverhang;public Int32 tmDigitizedAspectX;public Int32 tmDigitizedAspectY;public char tmFirstChar;public char tmLastChar;public char tmDefaultChar; public char tmBreakChar; public byte tmItalic;public byte tmUnderlined; public byte tmStruckOut; public byte tmPitchAndFamily; public byte tmCharSet;}。
GDI+总结
GDI+ 总结一:保存图像文件要将图像文件保存,必须先获得图像的编码格式信息,但是GDI+没有直接提供这个函数:GetEncoderClsid(const WCHAR* format, CLSID* pClsid)因此需要我们自己写一个GetEncoderClsid取得图像编码格式的函数幸好,有 GetImageDecoders函数作为参照[cpp]view plaincopy1.#include <windows.h>2.#include <gdiplus.h>3.#include <stdio.h>ing namespace Gdiplus;5.6.INT main()7.{8.// Initialize GDI+.9. GdiplusStartupInput gdiplusStartupInput;10.ULONG_PTR gdiplusToken;11. GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);12.13.UINT num; // number of image decoders14.UINT size; // size, in bytes, of the image decoder array15.16. ImageCodecInfo* pImageCodecInfo;17.18.// How many decoders are there?19.// How big (in bytes) is the array of all ImageCodecInfo objects?20. GetImageDecodersSize(&num, &size);21.22.// Create a buffer large enough to hold the array of ImageCodecInfo23.// objects that will be returned by GetImageDecoders.24. pImageCodecInfo = (ImageCodecInfo*)(malloc(size));25.26.// GetImageDecoders creates an array of ImageCodecInfo objects27.// and copies that array into a previously allocated buffer.28.// The third argument, imageCodecInfos, is a pointer to that buffer.29. GetImageDecoders(num, size, pImageCodecInfo);30.31.// Display the graphics file format (MimeType)32.// for each ImageCodecInfo object.33.for(UINT j = 0; j < num; ++j)34. {35. wprintf(L"%s\n", pImageCodecInfo[j].MimeType);36. }37.38. free(pImageCodecInfo);39. GdiplusShutdown(gdiplusToken);40.return 0;41.}The preceding code produces the following output:image/bmpimage/jpegimage/gifimage/x-emfimage/x-wmfimage/tiffimage/pngimage/x-icon仿照上例,我们编写自己的,获得编码格式的函数GetEncoderClsid()[cpp]view plaincopy1.INT GetEncoderClsid(const WCHAR *format, CLSID *pClsid)2.{3.UINT num = 0; // number of image encoders4.UINT size = 0; // size of the image encoder array in bytes5.6. ImageCodecInfo* pImageCodecInfo = NULL;7.8. GetImageEncodersSize(&num, &size);9.if(size == 0)10.return -1; // Failure11.12. pImageCodecInfo = (ImageCodecInfo*)(malloc(size));13.if(pImageCodecInfo == NULL)14.return -1; // Failure15.16. GetImageEncoders(num, size, pImageCodecInfo);17.18.for(UINT j = 0; j < num; ++j)19. {20.if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )21. {22. *pClsid = pImageCodecInfo[j].Clsid;23. free(pImageCodecInfo);24.return j; // Success25. }26. }27.28. free(pImageCodecInfo);29.return -1; // Failure30.}保存图像文件:Example_1:[cpp]view plaincopy1.VOID Example_SaveFile(HDC hdc)2.{3. Graphics graphics(hdc);4.5.// Create an Image object based on a PNG file.6. Image image(L"Mosaic.png");7.8.// Draw the image.9. graphics.DrawImage(&image, 10, 10);10.11.// Construct a Graphics object based on the image.12. Graphics imageGraphics(&image);13.14.// Alter the image.15. SolidBrush brush(Color(255, 0, 0, 255));16. imageGraphics.FillEllipse(&brush, 20, 30, 80, 50);17.18.// Draw the altered image.19. graphics.DrawImage(&image, 200, 10);20.21.// Save the altered image.22. CLSID pngClsid;23. GetEncoderClsid(L"image/png", &pngClsid);24. image.Save(L"Mosaic2.png", &pngClsid, NULL);25.}Example_2:[cpp]view plaincopy1.void CMyView::SavePic(HBITMAP hBitmap, CString szPicFilePath)2.{3.if(!hBitmap) return;4.5.if(PathFileExists(szPicFilePath))6. CFile::Remove(szPicFilePath);7.8. BITMAP bm;9. GetObject(hBitmap,sizeof(BITMAP),&bm);10.WORD BitsPerPixel=bm.bmBitsPixel;11.ing namespace Gdiplus;13. Bitmap* bitmap=Bitmap::FromHBITMAP(hBitmap,NULL);14. EncoderParameters encoderParameters;15.ULONG compression;16. CLSID clsid;17.18.if(BitsPerPixel==1)19. {20. compression=EncoderValueCompressionCCITT4;21. }22.else23. {24. compression=EncoderValueCompressionLZW;25. }26. GetEncoderClsid(L"image/tiff", &clsid);27.28. encoderParameters.Count=1;29. encoderParameters.Parameter[0].Guid=EncoderCompression;30. encoderParameters.Parameter[0].Type=EncoderParameterValueTypeLong;31. encoderParameters.Parameter[0].NumberOfValues=1;32. encoderParameters.Parameter[0].Value=&compression;33.34. bitmap->Save(szPicFilePath,&clsid,&encoderParameters);35.delete bitmap;36./*37. compression=100;38. GetEncoderClsid(L"image/jpeg", &clsid);39.40. encoderParameters.Count = 1;41. encoderParameters.Parameter[0].Guid = EncoderQuality;42. encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;43. encoderParameters.Parameter[0].NumberOfValues = 1;44. encoderParameters.Parameter[0].Value =&compression;45. */46.}GDI+ 总结二:为什么说CImage类是基于GDI+的?在许多资料上都说CImage类是基于GDI+的,但是为什么是基于GDI+的呢?因为使用这个类时,并没有加入#include <gdiplus.h>,也没有在程序开始和结束时分别写GDI+启动代码GdiplusStartupInput和结束代码GdiplusShutdown使用这个类时,仅仅需要添加头文件# include<altimage.h>就可以了,比GDI+得使用要简单一些。
GDI学习总结
上海鼎为通讯科技有限公司 上海鼎为通讯科技有限公司 鼎为通讯科技 Dewav Communication Technology Co.,Ltd.GDI 学习总结文件编号 Doc. No. : 页数 Page : 12 报告人:Neil 版本 Version :V1.0上海鼎为通讯科技有限公司1历次修正记录序号 1 变更 日期 2010-10-1 1 原因创建文档变更摘要版本1.0提出者Neil批准2目 录1 GDI 简介 ....................................................................................................................................... 4 2 GDI 功能描述和架构分析............................................................................................................ 4 3 2D APIs 和文本功能 ..................................................................................................................... 6 3.1 点........................................................................................................................................ 6 3.2 线........................................................................................................................................ 6 3.3 框........................................................................................................................................ 6 3.4 文本.................................................................................................................................... 7 3.4.1 字体.......................................................................................................................... 7 3.4.2 带边框的文本 ......................................................................................................... 7 4 层 .................................................................................................................................................. 7 4.1 准备.................................................................................................................................... 8 4.2 创建层................................................................................................................................ 8 4.3 激活层................................................................................................................................ 9 4.4 基础层.............................................................................................................................. 10 4.5 合并层.............................................................................................................................. 11 4.6 层坐标系.......................................................................................................................... 11 4.7 剪切.................................................................................................................................. 12 4.8 透明度............................................................................................................................... 12 4.9 通透.................................................................................................................................. 12 4.10 图像旋转........................................................................................................................ 13 5 流程跟踪..................................................................................................................................... 15 6 参考文档..................................................................................................................................... 1531 GDI 简介GDI 是 Graphics Device Interface 的缩写,含义是图形设备接口,它的主 要任务是负责系统与绘图程序之间的信息交换, 处理所有 Windows 程序的图形输 出。
Windows 系统编程实验三 GDI编程
西华大学上机实践报告课程名称:Windows系统编程年级:2011上机实践成绩:指导教师:陈克力姓名:徐千上机实践名称:GDI编程学号:312011*********上机实践日期:11.06上机实践编号:实验3组号:1上机实践时间:18:30——20:30一、目的(1)了解GDI设备环境的感念。
(2)了解GDI类和CPaintDC类的基本情况。
(3)了解WM_PAINT消息的作用。
(4)了解Windows的坐标映射模式。
(5)了解Windows颜色的表示方法。
(6)学习使用Color类表示Windows颜色的方法。
(7)学习在对话框中输出文本的方法。
(8)学习绘制各种基本图形的方法。
二、内容与设计思想(1)联系在对话框中输出文本。
(2)练习设置字体。
(3)练习使用设置字体的对话框。
(4)练习设置文本的前景色和背景色。
(5)练习使用文本的对话框。
(6)练习在对话框中绘制像素。
(7)练习在对话框中绘制直线。
(8)练习在对话框中绘制正弦曲线。
(9)练习在对话框中绘制椭圆。
(10)练习在对话框中绘制矩形。
(11)练习在绘画时使用画笔对象。
(12)练习在绘画时使用刷子填充颜色。
三、使用环境WINDOWS 7四、核心代码及调试过程1、练习在对话框中输出文本void CTextOUTDlg::OnPaint(){CPaintDC dc(this);dc.TextOutA(10,10,"你好!!",strlen("你好!!"));CDialog::OnPaint();}输出:2、练习设置字体void CTextOUTDlg::OnPaint(){CPaintDC dc(this);CFont font;font.CreatePointFont(320,"隶书");dc.SelectObject(&font);dc.TextOutA(10,10,"游在雨城",strlen("游在雨城"));CDialog::OnPaint();}输出:3、练习使用选择字体的对话框。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
根据微软的文档,进程终止时,由该进程创建的所有GDI对象会被释放。如果你想知道这是怎样实现的,我们现在有一点线索了。GDI只需搜索GDI对象表并删除有指定进程标识符的对象。
2、 GDI函数分类
GDI的功能太多了,所以我们需要一种办法对Win32 GDI API的函数分类,以便理解GDI的结构,MSDN库将GDI API分成17个领域,清楚地描述了GDI的功能。
(1)位图:处理创建、绘制设备相关位图(DDB)、设备无关位图(DIB)、DIB段、像素和区域填充的函数。
4、GDI对象类型
GDI对象表
typedef struct
{
void * pKernel;
unsigned short nProcess;
unsigned short nCount;
unsigned short nUpper;
unsigned short nType;
void * pUser;
}GdiTableCell;
(1) pKernel指向页面池:对每个有效GDI对象,pKernel从不为空,并且值总是唯一的。因此看起来对每个GDI对象有一个相应的数据结构,这个数据结构只能从内核模式代码存取,甚至不能从GDI32.DLL直接存取。对于不同进程的对象,从pKernel的值中看不出明显区分区域来。pKernel指向的对象起始地址是0xE1000000,根据《Inside Windows NT》,起始地址是0xE1000000的区域一般是被称为“页面池”的可分页系统的内存堆。
(16)矩形:user32.dll提供的处理RECT结构的函数。
(17)区域:负责用区域GDI对象描述一个点集的函数,并对该点集进行操作。
还有一些没有文档记载的函数。有一些GDI函数在DDK中说明,还一些没有文档记载但系统DLL使用的函数,另处还有一些函数则没有用过。下面是这些函数的粗略分类:
(2)画刷:处理创建、修改GDI画刷对象的函数。
(3)剪裁:处理设备上下文可绘制区域的函数。
(4)颜色:调色板管理。
(5)坐标和变换:处理映射模式、设备坐标映射逻辑和通用变换矩阵的函数。
(6)设备上下文:创建设备上下文,查询、设置其属性,及选择GDI对象的函数。
(7)填充形状:绘制闭合区域及其周线的函数。
(6)pUser指向用户模式数据结构。
GDI对象类型列表:
5、GDI函数大致分类
设备上下文函数(如GetDC、CreateDC、DeleteDC)、 画线函数(如LineTo、Polyline、Arc)、填充画图函数(如Ellipse、FillRect、Pie)、画图属性函数(如SetBkColor、SetBkMode、SetTextColor)、文本、字体函数(如TextOut、GetFontData)、位图函数(如SetPixel、BitBlt、StretchBlt)、坐标函数(如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen)、映射函数(如SetMapMode、SetWindowExtEx、SetViewportExtEx)、元文件函数(如PlayMetaFile、SetWinMetaFileBits)、区域函数(如FillRgn、FrameRgn、InvertRgn)、路径函数(如BeginPath、EndPath、StrokeAndFillPath)、裁剪函数(如SelectClipRgn、SelectClipPath)等。
(2)nCount 是一个部分选择计数器:在Windows 2000下,nCount总是零,就是说未使用。但在Windows NT 4.0中,某些GDI对象用了它。为了理解nCount的意义,我们试着将对象句柄选入和取消一个或多个设备上下文中,观察选入和取消是否能根据nCount值的变化而成功。
(3)nProcess使得GDI句柄绑定到进程:如果程序想使用另一个进程的GDI对象句柄,Win32 API调用原因。对于库存(stock)对象,如GetStockObject(BLACK_PEN),nProcess被置为零。对于用户进程创建的其他 GDI对象,nProcess是创建进程的进程标识符。
二、三种图形输出类型 应用程序可以使用GDI创建三种类型的图形输出:矢量输出、位图图形输出和文本输出。矢量图形输出 矢量图形输出指的是创建线条和填充图形,包括点、直线、曲线、多边形、扇形和矩形的绘制。位图输出 位图图形的输出是指位图图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出。 在屏幕上表现为对若干行和列的像素的操作,在打印机上则是若干行和列的点阵的输出。 位图图形输出的优点是速度很快,它是直接从内存到显存的拷贝操作。缺点是需要额外的内存空间。文本输出 与DOS字符方式下的输出不同,Windows是按图形方式输出的。 这样,在输出文本时,必须以逻辑坐标为单位计算文本的输出位置,而不是象DOS下以文本行为单位输出文本。这比DOS下的文本输出要难一些。 按图形方式输出文本给文本输出带来很大的灵活性。用户可以通过调用各种GDI函数,制造出各种文本输出效果,包括加粗、斜体、设置颜色等。 Windows还提供了一种TrueType(写真字体)。TrueType字体用一组直线和曲线命令及一些参数来描述字体的轮廓。Windows可以通过参数来调整直线的长度和曲线的形状,从而实现对字体的自由缩放。
GDI编程小结GDI编程小结
图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出。GDI负责Windows的所有图形输出,包括屏幕上输出像素、在打印机上输出硬拷贝以及绘制Windows用户界面。也就是Windows的图形编程。
设备上下文类包括CDC和它的派生类CClientDC、CPaintDC、CWindowDC、CMetaFileDC。
CDC、CclientDC、CpaintDC、CwindowDC、CmetaFileDC含义与区别 CDC是设备上下文类的基类,除了一般的窗口显示外,还用于基于桌面的全屏幕绘制和非屏幕显示的打印机输出。CDC类封装了所有图形输出函数,包括矢量、位图和文本输出。 CClientDC(客户区设备上下文)用于客户区的输出,它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。 CClientDC dc(this);//this一般指向本窗口或当前活动视图 dc.TextOut(10,10,str,str.GetLength()); CPaintDC用于响应窗口重绘消息(WM_PAINT)时的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。 CWindowDC用于窗口客户区和非客户区(包括窗口边框、标题栏、控制按钮等)的绘制。除非要自己绘制窗口边框和按钮(如一些CD播放程序等),否则一般不用它。 CMetaFileDC专门用于图元文件的绘制。图元文件记录一组GDI命令,可以通过这一组GDI命令重建图形输出。使用CMetaFileDC时,所有的图形输出命令会自动记录到一个与CMetaFileDC相关的图元文件中。
一、GDI体系结构
1、 GDI32.DLL导出的函数
GDI提供几百个Windows程序中可以调用的函数。这些函数大多数是从Win32的子系统DLL GDI32.DLL中导出的。窗口管理模块UER32.DLL是使用GDI函数的大用户,它用GDI函数来绘制菜单、图标、滚动条、标题栏和每个窗口的框架等细节内容。有一些绘图函数从USER32.DLL导出,提供给应用程序。仅Windows2000 GDI32.DLL就导出了543个入口点。与DevStudio一起发行的dumpbin工具是一个简单的工具,能列出模块导出的函数。下面就是由dumpbin gdi32.dll /export 产生的部分内容:
(12)画图和绘图:负责绘图消息管理和窗口已绘图区域的函数。其中一些函数实际上是从uer32.dll导出的。
(13)路径:负责将一系列直线和曲线组成名为路径的GDI对象,并用它来绘制的函数。
(14)画笔:处理直线绘制属性的函数。
(15)打印和打印池:负责将GDI绘图命令发送到硬拷贝设备(如行式打印机和绘图仪)并平滑地管理这些任务的。打印池函数是由Win32打印池提供的,包括几个系统提供的DLL和销售自定义的模块。
HDC BeginPaint(HWND hWnd,LPPAINTSTRUCT lpPaint)
使用GetDCEx可以代替其他的函数。例如,GetDCEx(hWnd,NULL,DCX_WIND|DCX_NORESETATTRS)可以轻松地替代GetWindowDC(hWnd),而GetDCEx(hWnd,NULL,DCX_NORESETATTRS)可以替代GetDC(hWnd)。
(8)字体和文本:在系统中安装和枚举字体,并用它们绘制文本字符串的函数。
(9)直线和曲线:绘制直线、椭圆曲线和贝赛尔曲线的函数。
(10)元文件:处理Windows格式的元文件或增强型元文件的生成和回放的函数。
(11)多显示监视器:允许在一个系统中使用多个显示监视器的函数。这些函数实际上是从uer32.dll导出的。