VisualFreeBasic代码_yGDI

2026-1-20 / 0 评论 / 207 阅读

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颜色不存在,就进行抖动处理

评论一下?

OωO
取消