Windows GDI绘图基础知识

一、Windows可以画直线、椭圆线(椭圆圆周上的曲线)和贝塞尔曲线。

7 个画线函式是:

(1)画直线
LineTo    BOOL LineTo(HDC hdc,int nXEnd,int nYEnd);
结合MoveToEx函数使用BOOL MoveToEx(HDC hdc,int X,int Y,LPPOINT lpPoint)

Point记录了旧的坐标点(先前的当前位置)。
///注意:GetCurrentPositionEx (hdc, &pt) ;获得当前位置。

(2)画一系列相连的直线。
Polyline    把Point数组的点连接成线。不用当前点做开始点,
PolylineTo  使用当前点做开始点,并将当前的位置设置成最后一根线的终点。
PolyPolyline 画多组相连的线。

(3)填充矩形
Rectangle 画一个矩形,并用白色刷子填充、Rectangle(hdc,xleft,ytop,xright,ybottom)
Ellipse   画一椭圆,并用白色的刷子填充。Ellipse (hdc,xleft,ytop,xright,ybottom)
RoundRect 画圆角矩形。并用白色的刷子填充 RoundRect(hdc,xL,yT,xR,yB,xC,yC)
 xC,yC是圆角矩形的圆角。
Arc  画椭圆线。Arc (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd,yEnd) 
Chord 画弦弓形Chord(hdc,xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) 
Pie 画饼形图 Pie(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);
ArcTo 和AngleArc 画椭圆线。

//多边形
Polygon(hdc,apt,iCount);  //画一个多边形,最后一点与第一点相连。
PolyPolygon(hdc,apt,aiCount,iPolyCount);  //画多个多边形。

(4)贝塞尔曲线,画贝塞尔曲线
POINY  apt【4】=(起点,第一控制点,第二控制点,终点)
需要注意的是::曲线是起点到终点的连线曲线,控制点(调整点)不在其中、
PolyBezier (hdc,apt,icount)
PolyBezierTo (hdc,apt,icount)。使用当前点为起点
PolyDraw 画一系列相连的线以及贝塞尔曲线。
对于多条贝塞尔曲线,后一条的起点是前一条的终点。

(5)矩形函数
FillRect(hdc,&rect,hBrush);  //使用指定的画刷来填充矩形,(不包含(Right,buttom)FrameRect(hdc,&rect,hBrush);//使用画刷来填充矩形框,不填充矩形,
InvertRect(hdc,&rect);  //使像素翻转,白变黑,黑变白,绿变红。

///对Rect的操作
SetRect(&rect,xLeft,yTop,xRight,yButtom);//赋值
OffsetRect(&rect,x,y);  //沿x,y移动
InflateRect(&rect,x,y); //增减矩形的尺寸。
SetRectEmpty(&rect);  //置0
CopyRect(&A,&B);把B复制到A.
IntersectRect(&A,&B1,&B2);//把B1和B2的交集复制到A.
UnionRect(&A,&B1,&B2);  //取并集
bEmpty=IsRectEmpty(&Rect);//判断矩形是否为空。
blnRect=PtlnRect(&Rect,point); //判断点是否在矩形中。

二、映像坐标

1)、视口:设备坐标(像素)
窗口:逻辑坐标,像素、mm、英寸
视口(设备)坐标转换为窗口(逻辑)坐标:
公式:一般不用记,有专门的函数。
xWindow=(xViewport - xViewOrg) * xWinExt/xViewExt +xWinOrg
yWindow=(yViewport - yViewOrg) * yWinExt/yViewExt +yWinOrg

(xWindow,yWindow) 转换后的窗口坐标
(xViewport,yViewport)待转换的视口坐标
(xWinExt,yWinExt)是逻辑座标的视窗范围;
(xViewExt,yViewExt)是装置座标的视窗范围。
(xWinOrg,yWinOrg)是逻辑座标的窗口原点;
(xViewOrg,yViewOrg)是装置座标的视口原点

2)、设备点转化为逻辑点
DPtoLP (hdc, pPoints, iNumber);pPoints 结构阵列的指标,而iNumber 是要转换的点的个数
例如:
GetClientRect (hwnd, &rect) ;
DPtoLP (hdc, (PPOINT) &rect, 2) ;

将逻辑点转换为装置点:
LPtoDP (hdc, pPoints, iNumber) ;

3)、SetMapMode(hdc,iMapMode);   //设置映射方式。
默认:MM_TEXT:每个逻辑单位转换为一个图素,X正方向向右,Y正方向向下。
原点可以改变,范围不可改变
SetWindowOrgEx();  //设置设备环境的原点
SetViewprocOrgEx(); //设置客户区中心
//
//原点和范围都可以改变、
MM_ANISOTROPIC:逻辑单位转换成具有任意比例轴的任意单位,用SetWindowExtExSetViewportExtEx函数可指定单位、方向和比例。

//原点可以改变,范围不可以改变,X的正方面向右,Y的正方向向上。
MM_HIENGLISH:每个逻辑单位转换为0.001英寸,X的正方面向右,Y的正方向向上。
MM_HIMETRIC:每个逻辑单位转换为0.01毫米,X正方向向右,Y的正方向向上。
MM_ISOTROPIC:逻辑单位转换成具有均等比例轴的任意单位,即沿X轴的一个单位等于沿Y轴的一个单位,用和函数可以指定该轴的单位和方向。图形设备界面(GDI)需要进行调整,以保证X和Y的单位保持相同大小(当设置窗口范围时,视口将被调整以达到单位大小相同)。
MM_LOENGLISH:每个逻辑单位转换为0.01英寸,X正方向向右,Y正方向向上。
MM_LOMETRIC:每个逻辑单位转换为0.1毫米,X正方向向右,Y正方向向上。
MM_TWIPS;每个逻辑单位转换为打印点的1/20(即1/1400英寸),X正方向向右,Y方向向上。

三、GDI  对象

画笔、刷子、位图、区域、字体、调色板是可以创建的6种GDI对象。
GetStockObject(obj);获取对象的句柄。
DeleteObject(obj);  删除对象。(注意不能在有效的设备描述表中删除。)
除调色板外,其他对象都是通过SelectObject(hdc,obj);选入设备描述表中。
GetObject(HOBJ,size,lpObj); lpObj可以是下列的结构体。获取对象信息、
BITMAP       //位图
DIBSECTION  //位图 
EXTLOGPEN   //画笔
LOGBRUSH    //刷 
LOGFONT     //字体
LOGPEN      //画笔
(1)画笔(Pen) windows的默认值:BLACK_PEN
创建:
方法一:hPen=CreatePen(iPenStyle,iWidth,crColor);
iPenStyle的参数:PS_SOLID    实心画笔
   PS_DASH     破折号画笔(在iWidth<1有效,否则系统会用实心笔替代)
   PS_DOT     虚线(在iWidth<1有效,否则系统会用实心笔替代)
  PS_DASHDOT  点划线(在iWidth<1有效,否则系统会用实心笔替代)
  PS_DASHDOTDOT 双重点划线(在iWidth<1有效,否则系统会用实心笔替代)
  PS_NULL   空白笔
  PS_INSIDEFRAME  粗实线,当iWidth>1可以使用抖动色(不只是纯色)

方法二:LOGPEN logpen   //指定笔颜色、大小、类型的结构体。同上。
 hPen=CreatePenIndirect(&logpen);

(2)字体(Font) 默认值:SYSTEM_FONT
创建:
一:CreateFont
只用到2个参数,其他都为0,例:CreateFont (0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)
HFONT CreateFont(
  int nHeight,             // 字符宽度,逻辑单位
  int nWidth,              // 
  int nEscapement,         // 斜放置字符串
  int nOrientation,        // 字符倾斜的角度,影响单个字符
  int fnWeight,            // 粗体。0—400标准,700粗体
  DWORD fdwItalic,         // 斜体
  DWORD fdwUnderline,      // 下划线
  DWORD fdwStrikeOut,      // 删除线
  DWORD fdwCharSet,        // 1为默认值。指定字体字符集一个字节的值(*不用理会)
  DWORD fdwOutputPrecision,  // 输出精度*
  DWORD fdwClipPrecision,  // 裁剪精度*
  DWORD fdwQuality,        // 期望匹配字体*
  DWORD fdwPitchAndFamily,  // 字体族*
  LPCTSTR lpszFace         // 字样*
);
                                  
字体:
SYSTEM_FONT 
SYSTEM_FIXED_FONT 
OEM_FIXED_FONT

ANSI_FIXED_FONT、
ANSI_VAR_FONT 
DEVICE_DEFAULT_FONT

其中: WM_INPUTLANGCHANGE: dwCharSet = wParam ;
二:LOGFONT logfont;
    CreateFontIndirect(&logfont);

(3)刷子(Brush) 默认值::WHITE_BRUSH 
系统的刷子: WHITE_BRUSH  
  LTGRAY_BRUSH    亮灰
  GRAY_BRUSH 灰
                DKGRAY_BRUSH 黑灰
  BLACK_BRUSH 
创建:
一:hBrush=CreateSolidBrush(crColor);
二:hBrush=CreateHatchBrush(iHatchStyle,crColor);//创建有影线的刷子填充部分为阴影
其中:iHatchStyle的参数如下:
 HS_BDIAGONAL   45度的斜线、
 HS_CROSS        十字型的线、
 HS_DIAGCROSS ×型
 HS_FDIAGONAL  135度斜线
 HS_HORIZONTAL   水平
 HS_VERTICAL  垂直 
三:LOGBRUSH  logbrush
    CreateBrushIndirect(&logbrush);
四: hBrush=CreatePatternBrush(HBITMAP hbmp);//创建位图的刷子、
五:hBrush=CreateDIBPatternBrushPt;//创建DIB位图的刷子。
    CreateDIBPatternBrush,

(4)位图(Bitmap)默认值:None(无);
 
CreateBitmap, 
CreateBitmapIndirect, 
CreateCompatibleBitmap, 
CreateDIBitmap, 
CreateDIBSection 
CreateSolidBrush
第一种::
HBITMAP CreateBitmap(
  int nWidth,         // 宽
  int nHeight,        // 高
  UINT cPlanes,       // 颜色板的数目
  UINT cBitsPerPel,   // 没像素的位数。
  CONST VOID *lpvBits // 指向颜色数据数组指针。这些颜色数据用来设置矩形区域内像素的颜色。矩形区域中的每一扫描线必须是双字节的整数倍(不足部分以0填充)。如果该参数为NULL,那么就表示没有定义新位图。
);

//简化版
HBITMAP CreateCompatibleBitmap( HDC hdc,     int nWidth,   int nHeight  );

//第二种
HBITMAP CreateBitmapIndirect(&bitmap);bitmap是BITMAP结构体

(5)区域(Region)区域是对显示器上一个范围的描述,这个范围是矩形、多边形和椭圆的组合,把区域选进设备描述表,区域可以用于绘制和剪裁。
作用:iRgnType=CombineRgn(hRgn,hRgn1,hRgn2,iCombine);
iCombine的参数:
RGN_AND  两个源区域的公共部分
RGN_OR   全部
RGN_XOR  除去公共部分。
RGN_DIFF hRgn1不在hRgn2的部分
RGN_COPY hRgn1的全部。(忽略hRgn2);
iRgnType的参数:
NULLREGION     得到空区域
SIMPLEREGION   得到简单的矩形、椭圆或多边形
COMPLEXREGION   多个多边形、矩形、椭圆的组合
ERROR  出错
创建:
一:创建矩形区域:
    hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;
    hRgn = CreateRectRgnIndirect (&rect) ;
二: 创建椭圆剪裁区域;
   hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ;//
   hRgn = CreateEllipticRgnIndirect (&rect) ;
三;创建多边形剪裁区域
 hRgn = CreatePolygonRgn (&point, iCount, iPolyFillMode) ;

///
矩形与区域的剪裁
对于矩形;
InvalidateRect (hwnd, NULL, TRUE) ;//使矩形无效
GetUpdateRect 来取得失效矩形的座标或WM_PAINT中从PAINTSTRUCT结构中得到
ValidateRect使有效
对于区域:
InvalidateRgn (hwnd, hRgn, bErase) ;
ValidateRgn (hwnd, hRgn) ;

SelectObject(hdc,hRgn);  或SelectClipRgn(hdc,hRgn);选进设备描述表
ExcludeClipRect用於将一个矩形从剪裁区域里排除掉,
IntersectClipRect 用於建立一个新的剪裁区域,它是前一个剪裁区域与一个矩形的交,OffsetClipRgn 用於将剪裁区域移动到显示区域的另一部分。

四、设备描述表

理解1:设备描述表中包含许多确定的GDI函数如何在设备上工作的当前属性。这些属性允许传递给GDI函数的参数只包含其实坐标或者尺寸信息,而不包含Windows在设备上显示对象时需要的所以其他信息、

理解2:一个设备描述表通常指一个物理显示设备。如视频显示器或打印机。

理解3:设备描述表(简称DC)实际上是GDI内部保存的数据结构。有些值是图形化的“属性”,这些属性定义了一些GDI绘图函数的工作,例如:文本颜色,文本的背景、TextOut函数的X坐标,y坐标映射到窗口客户区的方式,还有windows显示的字体、

//获取句柄hdc

(1)注意这不能使无效区域变的有效
hdc=GetDC(hwnd);
//
ReleaseDC(hwnd,hdc);

(2)在处理WM_PAINT消息时使用。能使无效区域变的有效、重绘。
hdc=BeginPaint(hwnd,&ps);
/
EndPaint(hwnd,&ps);

(3)能获得非客户区的绘制消息。包括窗口的标题栏,菜单栏,和滚动条、框架等。
在WM_NCPAINT中处理、
hdc=GetWindowDC(hwnd);
//
ReleaseDC(hwnd,hdc);

(4)通用获得DC的方法。视频显示器或者打印机上的DC.
hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);   //获得整个屏幕的dc
//
DeleteDC(hdc);

(5)获得一个dc,其参数与CreateDC的参数相同。但是不能用这个信息环境句柄往设备描述表上写东西。特别 注意。
hdc=CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
/
DeleteDC (hdc);

(6)可以把位图选进内部设备描述表。然后用GDI 函数在位图上绘画。
hdcMem=CreateCompatibleDC(hdc); //位图选进内部设备描述表
///
DeleteDC (hdcMem);

(7)获取元文件的设备描述表来创建元文件。
hdcMeta=CreateMetaFile(pszFilename);
//
hmf=ColseMetaFile(hdcMeta)

/获取信息
(8)获取视频显示器的尺寸,色彩等信息。
int iValue=GetDeviceCaps(hdc,ilndex);

///保存设备描述表。
(9)  SaveDC(hdc);可以保存多次、RestoreDC(hdc,-1);恢复DC
五、设备描述表属性

1)一些空间隔的填充。如点和虚线之间的间隔填充。
背景模式:使用SetBkMode(hdc,iBkMode)修改
(1)OPAQUE(系统默认值),间隔使用背景颜色填充。
       修改:SetBkColor(hdc,crColor);  //修改背景色
  GetBkColor(hdc);  获取背景色
(2)TRANSPARENT  不填充间隔 ,不擦除背景,透明模式

2)绘图方式:
用画笔进行绘图实际是画笔像素与目标位置处原来像素之间的某种布尔值运算。
默认值::R2_COPYPEN;
修改:
SetROP2(hdc,iDrawMode);
获取:
iDrawMode=GetROP2(hdc);

欢迎想要转行和学习编程的小伙伴,利用更多的资料学习成长比自己一个人更快噢,欢迎大家进群噢~

Windows高级工程师:GDI+绘图;基础入门大全相关推荐

  1. GDI+绘图基础,绘制表格

    GDI+绘图基础 编写图形程序时需要使用GDI(图形设备接口Graphics Device Interface),从程序设计的角度看,GDI包括两个部分:GDI对象和GDI函数. GDI对象定义了GD ...

  2. MFC GDI绘图基础

    一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Wind ...

  3. GDI+绘图轻松入门[5]-绘图坐标的理解和应用

    我们都知道,有大约五种方式可以获得一个坐标位置,他们分别是new point.PointToClient.PointToScreen,Location及控件鼠标事件传递的坐标.为了了解绘图坐标,我们事 ...

  4. c#创建画布_C#GDI+编程基础(一:Graphics画布类)

    GDI+存在的意义:将变成与具体硬件实现细节分开. GDI+步骤:获取画布,绘制图像.处理图像 命名空间: using System.Drawing;//提供对GDI+基本图形功能的访问 using ...

  5. 全站最全面的Python 基础入门必备知识大全,学完即就业!【建议收藏仔细学习】

    前言: Python作为21世纪最火的编程语言,市面上各种学习视频层出不穷,关于Python的学习氛围也逐渐浓厚!!最近一段时间越来越多的知友们在私信我,希望我出一期python基础入门的内容,肝了N ...

  6. windows编程之GDI绘图 -- 实验3-1

    windows编程之GDI绘图 – 实验3-1 文章目录 windows编程之GDI绘图 -- 实验3-1 @[toc] 1.实验名称 2.实验目的 3.实验的步骤和方法 4.代码实现 5.思考题 6 ...

  7. CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别-Windows绘图基础知识

    From: http://blog.csdn.net/zhangxinrun/article/details/5829084 一.设备环境(DC)的概念 (1)在Windows中,显示工作是基于设备环 ...

  8. python代码大全和用法用量_python零基础入门命令方式汇总大全,快速恶补你的Python基础...

    原标题:python零基础入门命令方式汇总大全,快速恶补你的Python基础 无意中浏览到这篇来自大牛的分享,总结的很全面,我重新排版下放在这里,希望能帮助到大家.在此十分感谢原作者! 在开始之前还是 ...

  9. python基础代码大全-python零基础入门命令方式汇总大全,快速恶补你的Python基础...

    原标题:python零基础入门命令方式汇总大全,快速恶补你的Python基础 无意中浏览到这篇来自大牛的分享,总结的很全面,我重新排版下放在这里,希望能帮助到大家.在此十分感谢原作者! 在开始之前还是 ...

最新文章

  1. Flash 在 EK 被利用漏洞 Top 10 中占 8 个位置
  2. Ubuntu16下编译安装Open Babel2.4.1和python绑定
  3. 用户控件(.ascx)调用网页(.aspx)的方法
  4. 一个典型的视觉系统——照明
  5. go odroid_小众奇葩!Odroid Go Super简评
  6. windows 如何在Windows命令行下配置IP地址
  7. 2019的第一工作日
  8. 博科光交机SNMP配置
  9. 商务办公软件应用与实践【5】
  10. NS3 之 入坑
  11. 2021-2027全球与中国IPA干燥机市场现状及未来发展趋势
  12. 四川取消英语计算机考试,四川远程教育2019年英语考试取消了吗
  13. 企鹅日记(十一):账号管理与ACL权限设置
  14. ”VT-x is not available (VERR_VMX_NO_VMX)“ 和 “VBoxManage: error: Details: code NS_ERROR_FAILURE”问题
  15. Weighted Interval Scheduling VS Interval Scheduling
  16. 立创梁山派GD32F450ZGT6--通过PCA9685控制16路舵机
  17. UNETR 论文精解
  18. 学习正则表达式的简单方法
  19. 解决方法:STM32使用cJSON解析数据失败
  20. 基于51单片机的温度报警系统

热门文章

  1. 微信步数C语言程序,获取微信步数 - osc_1v2pb1nt的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 鹏业BIM三维安装算量软件一次购买还是收年费
  3. 三菱iQ-R系列PLC控制系统项目全套资料
  4. 应用与计算机病毒,计算机病毒论文
  5. c语言如何多核运行程序,对于多线程程序,单核cpu和多核cpu如何工作?
  6. 华为云快成长直播间大数据AI专场,加速经济物联网智能化提升
  7. D - Petya and Array(树状数组,二分)
  8. vins-mono(5)vin_mono数据集测试
  9. c语言 乱码转化为16进制_编码格式介绍及C语言处理汉字编码
  10. 淘宝多重优惠的订单退其中一件商品的退款金额设想