WIn系统提供的绘画就是 GDI ,是一切绘画的底层(当然还有 DX、OpenGL,那些更复杂的3D绘画,我门这里说的2D平面绘画),GDI 非常繁琐,功能非常多,为了方便使用,因此封装了一个 yGDI 的类提供给VFB里使用。
什么是GDI?
GDI是 win操作系统里的2D绘画API,属于WIN里的内核函数,无论你用什么编程,反正到最后都是在个API,后来WIN系统又增加了一个增强版的 GDI ,我们称为 GDI+ ,GDI 和 GDI+ 是共存的,并不是二选一
什么是 yGDI?
FreeBasic语言自带的画图语句,虽然可以跨平台,但不支持特定窗口画图,因此只能直接用 WIN系统的API 画图,此绘图API,微软称其为:GDI ,GDI 为2D 绘画API 后来又出了一批增强功能的GDI,称为GDI+,由于API 操作非常繁琐,因此 VisualFreeBasic5 引入了 yGDI 类,可以很简单的方法来操作 GDI 和 GDI+ 来绘画。
绘图分为 2D 和 3D ,2D主要是由CPU计算,3D主要由GPU计算(3D中也有平面2D绘画)\
2D就是平面绘画,在WIn系统中无一例外,都使用GDI核心,yGDI 对其包装,极大的方便使用,可以在库文件里查看到所有源码,还可以修改。
必备基础或须知
(全WIN系统全语言通用GDI概念,学会后不管任何语言,只要是WIN系统都适用)
每个窗口和控件,其实是一个个画板,我们可以任意作画,具体在哪里画,WIN系统引入了设备句柄,代码类型为:hDC ,一般我们称为 DC ,某个窗口 DC用 GetDC 或 GetWindowDC 来获取。当然DC也可是打印机或其它设备,可以自己画其它设备上了。\
要理解GDI是如何绘画的,我们可以先打开 WIN系统里的【画图】应用,就可以直观的明白,方法一样,所不同的是应用软件是用鼠标拖动画,我们用代码画。\
GDI 分为几个元素:笔、刷、字、图\
笔:用来画线条的,可以设置颜色和宽度,GDI+ 还可以设置透明度、和笔帽等。\
刷:用来填充某个区域,可以是颜色、形状、图片,GDI+ 还可以设置渐变、透明度等。\
字:就是写字的呗,可以设置字体、大小、颜色,底色, GDI+ 有更多的文字特效。\
图:就是图片、位图,可以把图贴到目标上,可以加各种特效,如透明等,GDI+ 支持更多图像文件。\
绘图前要先设置好上面的元素,GDI和GDI+各自一套设置,是各自独立,为同一个画板绘画,\
设置好笔和刷,用 画线、画矩形、画圆、画多边形 函数就画上内容了,写字函数写字,贴图函数贴图。
颜色值:32位数值,4个字节,GDI只用3个,GDI+用4个,第4个是透明度 A,=0全透明 =255不透明\
GDI 16进值:0BGR 内存中结构:RGB0 使用函数:BGR (r, g, b) \
GDI+ 16进值:ARGB 内存中结构:BGRA 使用函数:RGBA (r, g, b, a)
注意:无窗口和BAS工程需要添加引用,有窗口的工程会自动引用,不需要我们自己写代码引用。
#include Once "yGDI.inc"
准备工作
主动绘图模式
绑定DC
Dim DC As HDC = GetDC(Picture1.hWnd)
Dim gg As yGDI = DC
'画画开始-----------------------------
...........一系列画画
'画画完成 -------------------------------
gg.Redraw
ReleaseDC Picture1.hWnd, DC '销毁DC
绑定窗口句柄
Dim gg As yGDI = Picture1.hWnd
'画画开始-----------------------------
...........一系列画画
'画画完成 -----------当函数结束, gg 变量被回收前会自动执行 gg.Redraw
被动绘图模式(刷新模式,必须在绘画事件里使用)
Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
Dim gg As yGDI = yGDI(hWndControl, GetSysColor(COLOR_WINDOW), True)
gg.DrawEllipse 10,10,100,50
Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
坐标系和坐标单位
坐标原点(0, 0)位于绘图表面(窗口或控件)的左上角。x 轴正方向是从左向右,y 轴正方向是从上向下。

坐标单位为,像素。支持系统的 DPI ,确保在用户在任何系统中,都显示同比例的大小。

假如,系统的DPI是 125%,你画的 正方形,设置参数为 100像素,那么真实显示的是 125像素,不同系统的DPI,会自动缩放,我们编写软件,就按照 100像素编写即可。
特点:
1,自带绘图缓冲,全部画完结束后自动输出到屏幕,画画非常快。\
2,同时初始化好 GDI 和GDI+,2者可以随意混合使用。\
3,自动感知系统DPI,写代码时按 DPI 100% 设置 位置和大小即可,不需要考虑不同DPI的情况**
'GDI常用封装类,其它API 可以直接用 gg.m_Dc 调用API\
'为了加速GDI 画画速度,增加了 内存DC 用来缓存,不然画太多东西屏幕会闪,\
'调用中不需要知道内存DC,只是其它API操作,用 gg.m_Dc 内存DC来画
'WM_PAINT 消息里用 Dim gg As yGDI = yGDI(窗口句柄,GetSysColor(COLOR_WINDOW),True)\
'其它地方画画用 Dim gg As yGDI = 窗口句柄\
'GDI分为:笔、刷、字体、位图、
辅助事件处理 ===================================================
'注意:自绘状态下预防闪耀,要在 _CUSTOM 事件里加以下代码\
Select Case wMsg
Case WM_ERASEBKGND
**Return True '防止擦除背景,不加这个会闪的。**
End Select
常用的常量
nPenStyle ------ Long,指定画笔样式,可以是下述常数之一\
PS_SOLID 画笔画出的是实线\
PS_DASH 画笔画出的是虚线(nWidth必须不大于1)\
PS_DOT 画笔画出的是点线(nWidth必须不大于1)\
PS_DASHDOT 画笔画出的是点划线(nWidth必须不大于1)\
PS_DASHDOTDOT 画笔画出的是点-点-划线(nWidth必须不大于1)\
PS_NULL 画笔不能画图\
PS_INSIDEFRAME 由椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画线宽度向内扩展。如指定的准确RGB颜色不存在,就进行抖动处理
评论一下?