yjryym yjryym
关注数: 7 粉丝数: 160 发帖数: 15,523 关注贴吧数: 7
【DirectX】【VB】用VB6原生语法实现实现DX绘图(测试) 原帖来源:【DirectX】【VB】用VB6原生语法实现实现DX绘图(测试) http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.0xaa55.com%2Fthread-26577-1-1.html&urlrefer=5640d37c0f9cdc9059247412c6032dc1(出处: 技术宅的结界,转载请保留出处。) 技术交流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中的例子。
【DirectX】牛年马月神作——高仿微软dx8vb.dll重制版开源了 #【DirectX】牛年马月神作——高仿微软dx8vb.dll重制版开源了#二进制文件及其源码均在原帖附加中,有需要的吧友可以过去下载。 原帖来源:【DirectX】【VB】牛年马月神作——高仿微软dx8vb.dll重制版(优化、BUG修复、开源)http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.0xaa55.com%2Fthread-26515-1-1.html&urlrefer=cee8efa89ab099d87b3361b873bff064(出处: 技术宅的结界,转载请保留出处。) 技术交流QQ群(有技术问题或发现新的BUG均可来反馈): 112915633 CoolWind游戏编程研究 79221561 VB游戏(GDI OpenGL DirectX) 264417277 0xAA55技术宅的结界   用VB写过DirectX程序的开发者基本上都知道微软开发过VB专用版的DX类库 dx7vb.dll 和 dx8vb.dll,这俩dll至今已有二十来年的历史了,这些年间有不少VB开发者用其开发出了优秀作品,但是绝大多数开发者都只使用了DX的图形图像功能,经过我本人的研究发现dx8vb.dll里面相对用的较少的功能有重大BUG,可是这么多年过去了发现的人少之又少,而微软官方又从来没有修复这些BUG,于是我决定自行修复。我们再来看看,从Vista后系统也不再内置这两个dll了,要用的话需要发布时打包,既然要打包那干嘛不打包个已修复过BUG的版本呢?   本次发布的dx8vb.dll重置版,基于DirectX8.1开发,需要注意的是微软官方的dx8vb.dll有8.0和8.1两个版本,并且这两个版本有一部分接口互不兼容。本人目前是重置的8.1版本,并与微软官方的8.1版本完全相互兼容,原8.0的开发者如需使用,可能需要修改部分代码后重新编译后才能使用。因为不同版本的dx8vb.dll之间存在的不兼容问题,我提供了绿化清单文件(使用方法和XP控件主题的manifest一样),这样可以让exe不走注册表调用此dll(IDE下使用仍需注册),避免与别人电脑上已安装的版本冲突问题。 免责声明:本重置版及其源码都仅用于个人性质的学习参考和技术研究,从未有意标榜或冒充是微软官方产品。如有商用行为或造成版权纠纷等侵犯微软公司合法版权的行为,一切后果将由肇事者自行负责。
WaveOut COM版本,实现VB6音频处理。 链接: http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fpan.baidu.com%2Fs%2F1oKscISOnRD_REfoC0Kmp0w&urlrefer=c9ed5dcd71a7250e79b03f280199b1ac 提取码: vf9c(包含源码) 在VB6中,图像处理还是很常见的,但是音频处理的资料非常少,会的人也不多,微软虽然在 winmm.dll 中提供了 waveOut 的相关API,但是对VB6开发者不是很友好,使用起来非常繁琐,再加上VB6开发者又是以非专业人士为主,所以我就用VC把 waveOut 封装成对VB6更友好的COM接口,并且大大简化了其细节处理,并且模仿GDI的位图处理函数,实现了相似用法的音频处理函数。 IWaveOutBuffer woBuf1, woBuf2; … … woBuf1.DrawWaved Me.hDC, X坐标, Y坐标, 宽度, 高度 ' 将音频缓冲区1内的全部数据绘制成波形图 woBuf2.DrawWaved Me.hDC, X坐标, Y坐标, 宽度, 高度, 起始位置, 采样点数 ' 将音频缓冲区2的子区域数据绘制成波形图 woBuf1.BitBlt 目标位置, 采样点数, woBuf2, 来源位置 ' 把音频缓冲区2的一部分数据拷贝到缓冲区1中。 woBuf2.StrectBlt 目标位置, 目标采样点数, woBuf2, 来源位置, 来源采样点数 ' 把音频缓冲区2的一部分数据缩放到缓冲区1中(可以实现对波形的拉伸)。 整数采样数据 = woBuf1.SampleValue(下标) ' 获取音频缓冲区1中的整数数据(类似GDI的GetPixel) woBuf2.SampleValueF(下标) = 浮点采样数据 ' 修改音频缓冲区2的浮点数据(类似GDI的SetPixel) woBuf1.GetBufferBits 数组缓冲区(起始下标), 数组缓冲区大小, 起始位置, 读取采样点数 ' 读取音频缓冲区1的数据到VB的数组中(类似于GDI的GetBitmapBits) woBuf2.SetBufferBits 数组缓冲区(起始下标), 数组缓冲区大小, 起始位置, 写入采样点数 ' 写入VB的数组数据到音频缓冲区2中(类似于GDI的SetBitmapBits) woBuf1.GetWaveFotmat ' 获取音频缓冲区格式 wobBuf2.GetAddress ' 获取音频缓冲区的数据地址(可以动态读写里面的音频数据,类似GDI的DIB位图操作) 更多用法在压缩包的例子里面有,这里就不过多介绍了。
1 下一页