- UID
- 4293
- 精华
- 积分
- 11132
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
本帖最后由 系统消息 于 2022-1-28 16:24 编辑
原帖来源:【DirectX】【VB】用VB6原生语法实现实现DX绘图(测试) https://www.0xaa55.com/thread-26577-1-1.html(出处: 技术宅的结界,转载请保留出处。)
百度分贴:【DirectX】【VB】用VB6原生语法实现实现DX绘图(测试) https://tieba.baidu.com/p/7709442877
技术交流QQ群(有技术问题或发现新的BUG均可来反馈):
112915633 CoolWind游戏编程研究
79221561 VB游戏(GDI OpenGL DirectX)
264417277 0xAA55技术宅的结界
先看效果:
效果图
当年刚学VB还没到一年的时间就在想VB的Form、PictureBox、Printer、UserControl、UserDocument这些控件或类的成员里面除了我们平常用到的方法和属性外,居然还有关键字(Scale、PSet、Line、Circle、Print),就很好奇这些关键字的成员是怎么实现的,然而自己定义方法这些关键字根本没法使用(因为关键字不能作为标识符使用)。直到十二年后的最近一段时间终于发现了VB隐藏了多年的小秘密,这也成功让我实现了自己写的类库创建的对象也能支持这些成员关键字操作。
于是,我便想到VB自带的绘图是基于GDI的,绘图效率低不说,还不支持Alpha混合。既然这样,干脆我就自己来实现一个DX版的VB图形库吧,让VB原生语法操作获得GPU硬件加速功能。
Dim dxgw As GraphWindow ' 定义DX绘图窗口变量
... ... ' 这里省略部分初始化代码
Set dxgw = CreateGraphWindow(初始化参数) ' 创建DX图形窗口
dxgw.Cls [背景颜色] ' 对DX画布清屏处理(背景颜色可选)
dxgw.Scale (X1, Y1)-(X2, Y2) ' 设置画布的绘图区域
当前光标X = dxgw.CurrentX ' 获取当前输出光标的横坐标位置
当前光标Y = dxgw.CurrentY ' 获取当前输出光标的纵坐标位置
dxgw.CurrentX = 当前光标X ' 设置当前输出光标的横坐标位置
dxgw.CurrentY = 当前光标Y ' 设置当前输出光标的纵坐标位置
dxgw.Scale ' 重置画布的绘图区域为默认
dxgw.PSet [Step](X, Y), [输出颜色] ' PSet操作必须指定坐标,坐标前加上Step表示相对于 dxgw.CurrentX 和 dxgw.CurrentY 的相对坐标,不加则是绝对坐标,颜色可选
读取颜色 = dxgw.Point(X, Y) ' 和VB原生的操作一样,可以取出DX画布中的对应点的颜色值。
dxgw.Point(X, Y) = 写入颜色 ' 和VB原生的操作不一样的是,DX的Point不再是方法,而是可赋值的属性(赋值表示修改DX画布中的颜色值)。
dxgw.Line [[Step](X1, Y2)]-[Step](X2, Y2), [Color], [B[F]] ' 直线与矩形用法:B 表示画矩形框,BF 表示画填充矩形,否则在两点之间画一条直线。
dxgw.Circle [Step](X, Y), Radius, [Color], [Start], [End], [Aspect] ' 画圆、椭圆、弧形、扇形用法:Radius为负数表示画填充(否则画线框),Start和End为负数表示画扇形(否则为弧形)
dxgw.Print 数据1; 数据2, 数据3; Spc(相对定位); 数据4; Tab(绝对定义); 数据5 ' 文本打印(Print 有 ; , Spc Tab 四种输出定位调整控制)
dxgw.PaintPicture 图片对象, X1, Y1, [Width1], [Height1], [X2], [Y2], [Width2], [Height2], [Color]
dxgw.Refresh ' 将画布的缓存刷新到窗口(提示:在创建dxgw时启用了垂直同步功能的话,此操作将会等待显示器实际刷新,等待期间不占用CPU和GPU)
这里只大概介绍一下,具体的详细用法请下载附件查看测试Demo中的例子。
测试代码
|
|