宿迁腾云网络网站建设公司

腾云网络 八年经验专注网站建设
  • 首页
  • 服务项目
    • 网站建设
    • 微信小程序
    • APP开发
    • SEO优化
  • 建站费用
  • 成功案例
    • 网站建设案例
    • 小程序案例
    • APP开发案例
    • SEO优化案例
  • 行业动态
    • 网站建设
    • SEO优化
    • 技术日志
  • 联系我们
    • 关于我们
首页 > 行业动态 > 技术日志 > 编程中另一个非常重要的部分GDI绘图做一个讲解

编程中另一个非常重要的部分GDI绘图做一个讲解

2021-08-25

在上两篇文章中,我们学习了文本字符输出和编程,并且知道了如何使用常见的输出文本字符串。在本文中,我们将学习编程中GDI图形绘制的另一个非常重要的部分。 GDI 函数包含数百个 API 供我们使用。本文将讲解最常用的GDI绘图。 GDI 可以绘制点、直线和曲线,填充封闭区域、位图和文本。正文部分已经在上一篇文章中介绍过了。请参考【编程】系列第三篇:文本字符输出。

与之前的 GDI 对象一样,本文中的这些绘图函数也必须需要一个设备上下文句柄 (HDC) 作为函数参数。上一篇我们知道,HDC可以在处理过程中通过函数获取,也可以通过and获取。

既然是图画,就少不了对颜色的描述。颜色中有几种颜色的表示。其中,在GDI绘图中使用最多的,其实是一个无符号的32整数。其中,红、绿、蓝各占一个字节,最高字节不使用windows 图形编程基础,如下图:

该值可由提供的RGB宏生成,RGB的定义为:


编程中另一个非常重要的部分GDI绘图做一个讲解
(图1)

#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

另外还有表示颜色的结构windows 图形编程基础,一般用于位图结构信息中。

提供 sum 函数来设置和获取像素的颜色。函数原型为:

COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);
COLORREF GetPixel(HDC hdc, int nXPos, int nYPos);

这个功能不常用。

在绘制图形之前,您可以为后续绘制创建一个画笔。创建画笔的API函数为:

HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);
HBRUSH CreateSolidBrush(COLORREF crColor);
HBRUSH CreatePatternBrush(HBITMAP hbmp);
HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);

它可以指定画笔样式、宽度和颜色。样式可以是实线、虚线、虚线等,具体请参考MSDN中描述的各种类型。

提供了十几种画线功能。常用的画线有,一般用多条线段等,曲线可以画椭圆、椭圆弧、贝塞尔样条曲线。这些函数的原型请参考 MSDN。我们将通过示例来演示这些函数的用法。

如果绘图

是封闭区域,内部可以填充。当然,如果不显示填充,系统会用默认颜色填充,比如窗口背景色。我们也可以在绘制闭合图形之前创建一个画笔。如果在设备环境中选择创建的画笔,系统将用画笔填充内部区域。将关闭的常见绘图API函数包括绘制直角矩形、圆角矩形、椭圆、饼图和和弦切割。

位图输出的内容很多,包括设备相关和设备无关位图,以及位块传输、透明度、缩放等,本文仅以位图画笔为例进行演示,其他内容可写将来分开。 使用位图作为画笔时,首先使用该函数加载位图文件,然后使用创建图案画笔。

这个之前已经讨论过了,请参考【编程】系列的第三部分:文本字符输出。

绘制图形时,环境设备有5个属性会影响大部分绘图:

笔位:画线时,从笔的位置开始,笔位可以通过函数设置。

笔:绘图时,将使用当前环境中的笔进行绘图。如果未创建显示,将使用系统默认笔。

背景:某些 GDI 将具有透明和不透明设置。

背景颜色:例如文本输出的间隙颜色。

绘制模式:比如可以设置实线、虚线等进行绘制,填充时可能会有不同的填充绘制模式。

下面我们用一个完整的例子来演示上述常用功能的具体应用和实际使用效果。

#include 
static TCHAR szAppName[] = TEXT("GDI Test");
static LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
     HWND     hWnd;
     MSG      msg;
     WNDCLASS wndclass;
     wndclass.style         = CS_HREDRAW | CS_VREDRAW;
     wndclass.lpfnWndProc   = WndProc;
     wndclass.cbClsExtra    = 0;
     wndclass.cbWndExtra    = 0;
     wndclass.hInstance     = hInstance;
     wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
     wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
     wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
     wndclass.lpszMenuName  = NULL;
     wndclass.lpszClassName = szAppName;
     if (!RegisterClass(&wndclass))
     {
          MessageBox (NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
          return 0;
     }
     
     hWnd = CreateWindow(szAppName,            // window class name
                          szAppName,           // window caption
                          WS_OVERLAPPEDWINDOW, // window style
                          CW_USEDEFAULT,       // initial x position
                          CW_USEDEFAULT,       // initial y position
                          400,                 // initial x size
                          300,                 // initial y size
                          NULL,                // parent window handle
                          NULL,                // window menu handle
                          hInstance,           // program instance handle
                          NULL);               // creation parameters
     
     ShowWindow(hWnd, iCmdShow);
     UpdateWindow(hWnd);
     
     while (GetMessage(&msg, NULL, 0, 0))
     {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
     }
     return msg.wParam;
}
//绘制指定属性的直线
static void DrawLine(HDC hDC, int x0, int y0, int x1, int y1, int style, int width, COLORREF color)
{
	HPEN hPen = CreatePen(style, width, color);
	HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
	MoveToEx(hDC, x0, y0, NULL);
	LineTo(hDC, x1, y1);
	SelectObject(hDC, hOldPen);
	DeleteObject(hPen);
}
//绘制实心圆
static void DrawCircle(HDC hDC, int x, int y, int len, COLORREF color)
{
	HBRUSH hBrush = CreateSolidBrush(color);
	HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
	HPEN hPen = CreatePen(PS_SOLID, 1, color);
	HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
	Ellipse(hDC, x-len/2, y-len/2, x+len/2, y+len/2);
	SelectObject(hDC, hOldBrush);
	DeleteObject(hPen);
	SelectObject(hDC, hOldPen);
	DeleteObject(hOldBrush);
}
//绘制填充矩形
static void DrawRect(HDC hDC, int left, int top, int width, int height, int style, COLORREF color)
{
	HBRUSH hBrush = CreateHatchBrush(style, color);
	HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
	Rectangle(hDC, left, top, left+width, top+height);
	
	SelectObject(hDC, hOldBrush);
	DeleteObject(hOldBrush);
}
//绘制位图填充矩形
static void DrawBmpRect(HDC hDC, int left, int top, int width, int height, LPCTSTR file)
{
	HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, file, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
	HBRUSH hBrush = CreatePatternBrush(hBitmap);
	HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
	Rectangle(hDC, left, top, left+width, top+height);
	SelectObject(hDC, hOldBrush);
	DeleteObject(hOldBrush);
	DeleteObject(hBitmap);
}
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC         hDC;
	PAINTSTRUCT ps;
	switch (message)
	{
	case WM_CREATE:
		return 0;
	case WM_PAINT:
		{
			hDC = BeginPaint(hWnd, &ps);
			for (int i=10; i<50; i+=4)
			{
				SetPixel(hDC, i, 10, RGB(0, 0, 0)); //绘制像素点
			}
                        //绘制不同模式的直线
			DrawLine(hDC, 120, 30, 200, 30, PS_SOLID, 2, RGB(0,0,0));
			DrawLine(hDC, 120, 50, 200, 50, PS_DASH, 1, RGB(100,0,200));
			DrawLine(hDC, 120, 70, 200, 70, PS_DASHDOT, 1, RGB(100,250,100));
                        //绘制弧线、弦割线、饼图
			Arc(hDC, 10, 30, 40, 50, 40, 30, 10, 40);
			Chord(hDC, 10, 60, 40, 80, 40, 60, 10, 70);
			Pie(hDC, 10, 90, 40, 110, 40, 90, 10, 100);
			POINT pt[4] = {{90,130},{60,40},{140,150},{160,80}};
                        //绘制椭圆、矩形
			Ellipse(hDC,pt[0].x, pt[0].y, pt[1].x, pt[1].y);
			Rectangle(hDC, pt[2].x, pt[2].y, pt[3].x, pt[3].y);
                        //绘制贝塞尔曲线
			PolyBezier(hDC, pt, 4);
                        //标出贝塞尔曲线的四个锚点
			DrawCircle(hDC, pt[0].x, pt[0].y, 8, RGB(0,255,0));
			DrawCircle(hDC, pt[1].x, pt[1].y, 8, RGB(0,0,255));
			DrawCircle(hDC, pt[2].x, pt[2].y, 8, RGB(0,0,0));
			DrawCircle(hDC, pt[3].x, pt[3].y, 8, RGB(255,0,0));
                        //绘制圆
			DrawCircle(hDC, 100, 180, 60, RGB(0, 250, 250));
                        //绘制不同填充模式的矩形
			DrawRect(hDC, 220, 20, 60, 40, HS_BDIAGONAL, RGB(255,0,0));
			DrawRect(hDC, 220, 80, 60, 40, HS_CROSS, RGB(0,255,0));
			DrawRect(hDC, 290, 20, 60, 40, HS_DIAGCROSS, RGB(0,0,255));
			DrawRect(hDC, 290, 80, 60, 40, HS_VERTICAL, RGB(0,0,0));
                        //绘制位图
			DrawBmpRect(hDC, 180, 140, 180, 100, TEXT("chenggong.bmp"));
                        //绘制文本
			TextOut(hDC, 20, 220, TEXT("GDI画图输出测试程序"), 11);
		}
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0 ;
	}
	return DefWindowProc (hWnd, message, wParam, lParam);
}

本例运行结果如下图所示。在图中,您可以看到线条不平滑。这是因为绘图功能没有抗锯齿功能。数字越小,混叠越明显。可以使用微软提供的GDI+绘图功能,具有抗锯齿效果。

GDI的基本绘图不难掌握。只要阅读MSDN上API的详细说明,就可以正确使用,但是创建并使用GDI对象后,一定要记得释放。

更多经验交流可以加入编程讨论QQ群:.

关注微信公众平台:程序员互动联盟(),第一时间获取原创技术文章,与(java/C/C++///)技术专家成为朋友,在线交流编程经验,收获编程基础 解决编程问题的知识。程序员互动联盟,开发者自己的家。

Tag: gdi 位图
网站制作公众号

宿迁腾云网络网站建设公司 | 网站开发 | 网站制作 | 网站优化

咨询电话:13160355545

上一篇

返回栏目

下一篇

免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。

热推

  • 国内php框架微软开源PHP开发工具包,可以让PHP轻松访问微软 php 论坛框架
  • 安卓php代码编辑器机器之心编辑部发布新AI代码补全工具,输入语音命令种子编辑洗白器安卓版
  • 一个出色的企业应用开发框架.官方出品的框架
  • php 代码格式化工具PHP中对XSS进行过滤的简单(绕过)方法。php代码格式化工具
  • 可重用代码的集合,框架代码是框架架构的代码
  • php开源网站织梦真的要收费了,腾云网络不是很久不维护开源php论坛
  • 有程序设计语言才能用于应用软件的开发SQL语言
  • php高级编程书籍想要成为网络安全专家,需要了解的重要的低级IT基础架构搜索引擎优化高级编程:php版
  • 而后端开发语言是做什么用的呢?语言的区别
  • 开源php即时通讯系统云原生批流融合数据平台宣布获得2300万美元A轮融资深喉咙php免费开源企业建站系统

相关

如何修复被黑客篡改的网站代码与数据库?入侵迹象与范围评估指南

如何修复被黑客篡改的网站代码与数据库?入侵迹象与范围评估指南

了解常见PHP应用程序安全威胁,掌握6个常见安全性攻击

了解常见PHP应用程序安全威胁,掌握6个常见安全性攻击

微信支付SDK漏洞曝光!谁会用到它?商家必看

大会现场蒋涛调查参会者,柳峰解析LBS与智能客服开发重难点?

大会现场蒋涛调查参会者,柳峰解析LBS与智能客服开发重难点?

如何查看php版本?多种方法助你快速知晓

如何查看php版本?多种方法助你快速知晓

PHP格式化:提升代码质量与协作效率的关键规则

如何查看虚拟主机上的 PHP 版本?这篇文章告诉你

Linux 系统管理员和 web 开发者必知:如何查看 PH

Linux 系统管理员和 web 开发者必知:如何查看 PH

免费开源的轻量级 PHP 开发框架 ThinkPHP,遵循

FastAdmin 开发基础管理插件步骤及环境配置详解

标签

seo(1182) 市场营销(661) 网站制作(573) 网站建设(564) 搜索引擎(553) 网站(482) PHP(361) 编程语言(345) 建站(294) 关键词排名优化(267) 网站建设公司(245) 优化(216) seo排名(207) 域名(190) 软件(171) 网站优化(148) 搜索引擎优化(146) 外链(141) 科技(136) 网站关键词(124) 网站排名优化(123) 域名服务器(120) 网站排名(107) 时政(103) 排名优化(95) 搜索引擎收录(93) 网站设计(92) 电子商务(88) 引擎(86) 移动互联网(85) 开发框架(79) 开发(75) 网站服务器(74) 框架(68) 前端开发(68) 网站分析(66) 网站建设方案(65) 关键(64) 流量(63) 源码(62) 百度优化(62) 网站权重(61) 开放源代码(59) seo培训(53) 网页设计(51) 百度(51) php框架(50) 网站建设知识(50) 大数据(50) 谷歌(49)
宿迁腾云网络网站建设公司
网站建设
  • 私人定制
  • 标准模板建站
  • 经济模板建站
精品模板

宿迁腾云网络网站建设公司

联系电话:13160355545

公司地址:江苏省宿迁市丽景湾华庭北门都市花园公寓9楼907

联系邮箱:admin@tyweb.net

全国分站
  • 北京
  • 广东
  • 东莞 广州 中山 深圳 惠州 江门 珠海 汕头 佛山 湛江 河源 肇庆 潮州 清远 韶关 揭阳 阳江 云浮 茂名 梅州 汕尾
  • 山东
  • 济南 青岛 临沂 济宁 菏泽 烟台 泰安 淄博 潍坊 日照 威海 滨州 东营 聊城 德州 莱芜 枣庄
  • 江苏
  • 苏州 徐州 盐城 无锡 南京 南通 连云港 常州 扬州 镇江 淮安 泰州 宿迁
  • 河南
  • 郑州 南阳 新乡 安阳 洛阳 信阳 平顶山 周口 商丘 开封 焦作 驻马店 濮阳 三门峡 漯河 许昌 鹤壁 济源
  • 上海
  • 河北
  • 石家庄 唐山 保定 邯郸 邢台 沧州 秦皇岛 张家口 衡水 廊坊 承德
  • 浙江
  • 温州 宁波 杭州 台州 嘉兴 金华 湖州 绍兴 舟山 丽水 衢州
  • 陕西
  • 西安 咸阳 宝鸡 汉中 渭南 安康 榆林 商洛 延安 铜川
  • 湖南
  • 长沙 邵阳 常德 衡阳 株洲 湘潭 永州 岳阳 怀化 郴州 娄底 益阳 张家界 湘西
  • 重庆
  • 福建
  • 漳州 泉州 厦门 福州 莆田 宁德 三明 南平 龙岩
  • 天津
  • 云南
  • 昆明 红河 大理 文山 德宏 曲靖 昭通 楚雄 保山 玉溪 丽江 临沧 思茅 西双版纳 怒江 迪庆
  • 四川
  • 成都 绵阳 广元 达州 南充 德阳 广安 阿坝 巴中 遂宁 内江 凉山 攀枝花 乐山 自贡 泸州 雅安 宜宾 资阳 眉山 甘孜
  • 广西
  • 贵港 玉林 北海 南宁 柳州 桂林 梧州 钦州 来宾 河池 百色 贺州 崇左 防城港
  • 安徽
  • 芜湖 合肥 六安 宿州 阜阳 安庆 马鞍山 蚌埠 淮北 淮南 宣城 黄山 铜陵 亳州 池州 巢湖 滁州
  • 海南
  • 三亚 海口 琼海 文昌 东方
  • 江西
  • 南昌 赣州 上饶 吉安 九江 新余 抚州 宜春 景德镇 萍乡 鹰潭
  • 湖北
  • 武汉 宜昌 襄樊 荆州 恩施 孝感 黄冈 十堰 咸宁 黄石 仙桃 随州 天门 荆门 潜江 鄂州 神农架
  • 山西
  • 太原 大同 运城 长治 晋城 忻州 临汾 吕梁 晋中 阳泉 朔州
  • 辽宁
  • 大连 沈阳 丹东 辽阳 葫芦岛 锦州 朝阳 营口 鞍山 抚顺 阜新 本溪 盘锦 铁岭
  • 黑龙江
  • 齐齐哈尔 哈尔滨 大庆 佳木斯 双鸭山 牡丹江 鸡西 黑河 绥化 鹤岗 伊春 大兴安岭 七台河
  • 内蒙古
  • 赤峰 包头 通辽 呼和浩特 乌海 鄂尔多斯 呼伦贝尔
  • 贵州
  • 贵阳 黔东 黔南 遵义 黔西 毕节 铜仁 安顺 六盘水
  • 甘肃
  • 兰州 天水 庆阳 武威 酒泉 张掖 陇南 白银 定西 平凉 嘉峪关 临夏 金昌 甘南
  • 青海
  • 西宁 海西 海东 海北 果洛 玉树 黄南
  • 新疆
  • 乌鲁木齐 伊犁 昌吉 石河子 哈密
  • 西藏
  • 拉萨 山南 林芝 日喀则
  • 吉林
  • 长春 白山 白城 延边 松原 辽源 通化 四平
  • 宁夏
  • 银川 吴忠 中卫 石嘴山 固原
SiteMap
网站地图
TAG标签
Copyright © 2017-2025 TYWEB.NET 宿迁腾云网络科技有限公司 ALL RIGHTS RESERVED.   苏ICP备17033535号-1

热门搜索

百度 下载 2025 2024 2026 货源 货货源 虚拟 禅道 报名 金蝶KIS旗舰版
  • 客服

    在线客服

  • 电话

    13160355545

  • 微信

精品模板
建站费用
成功案例
联系我们