网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月20日漏签0天
vb吧 关注:156,090贴子:1,166,232
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 3 4 5 6 7 下一页 尾页
  • 145回复贴,共7页
  • ,跳到 页  
<<返回vb吧
>0< 加载中...

[ZsUI]一步一步写个DirectUI.[连载贴]

  • 只看楼主
  • 收藏

  • 回复
  • Zatans
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
趁着今天六一,这么欢乐的节日里,开个连载贴.
这个贴酝酿了有几天了,现在发出来看看反响.如果大家都不怎么感兴趣的话,我果断TJ掉.
贴吧的帖子偶尔会抽,或者排版问题影响阅读,所以我每一章都会在博客里也发一次.
看正版高清**连载请点:http://hi.baidu.com/zatansvb/blog/category/Visual%20Basic


  • Zatans
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ZsUI - 前言
提起DirectUI或者Windowsless相信很多人都会感到陌生.
先来看看百度百科:
http://baike.baidu.com/view/3102587.htm
如果还觉得概念模糊.可以找点参照.
VB中其实也有一些这样的控件,比如Label Image,这些都是直接画在窗体上,SPY+找不到句柄.
现在,开始一步一步的写一个自己的DirectUI.
由于此连载内容只是教学,为了简介方便,使用了效率一般的GDI+.大量地方未做优化.
(工程内引用了vIstaswx的GDI+ 声明模块)
每一步的代码都会打包放在百度的网盘里.
http://pan.baidu.com/netdisk/singlepublic?fid=295000_3835340436



2025-08-20 09:51:16
广告
不感兴趣
开通SVIP免广告
  • Zatans
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ZsUI - 第一个例子
第一步,我们找个容器.
在VB里,Form或者PictureBox又或者其它那些有句柄的可视控件都能胜任.
接着,在脑子想象一个控件应该有的样子. 位置和尺寸(x.y.width.height).各种属性和状态.(image.status).
我们先用一个Type来描述它.
Type Zs_UI_Button '想象中的简陋按钮.
X As Integer
Y As Integer
Width As Integer
Height As Integer
Image As Long
Status As Long
End Type
第二部,给它来点实际的东西.
Dim ZButton1 As Zs_UI_Button
With ZButton1
.X = 30
.Y = 30
.Width = 92
.Height = 40
Call GdipLoadImageFromFile(StrPtr(App.Path & "/res/button.png"), pImage)
.Image = pImage
.Status = C_Status_Leave
End With
第三部,我们为它弄点"事件"并把它显示出来.
"事件"不可能凭空出现,这事得靠依附的那个容器了.
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '容器的MouseMove事件
With ZButton1
If X > .X And X < .X + .Width And Y > .Y And Y < .Y + .Height Then '看看是不是轮到我出场了.MouseEnter和MouseLeave都是靠这句了.
If .Status And C_Status_Leave Then '为了防止一直重画,设置个状态标志.
Me.Cls '因为我们要做的控件是透明的,所以先要把容器背景重画一次.
Call GdipDrawImageRectRect(pGraphics, .Image, .X, .Y, .Width, .Height, 92, 0, 92, 40, UnitPixel) '根据一个状态画出对应的图.
.Status = C_Status_Hover '标记一下
End If
Else
If .Status = C_Status_Hover Then
Me.Cls
Call GdipDrawImageRectRect(pGraphics, .Image, .X, .Y, .Width, .Height, 0, 0, 92, 40, UnitPixel)
.Status = C_Status_Leave
End If
End If
End With
End Sub
Private Sub Form_Click() '处理容器的单击事件.
If ZButton1.Status = C_Status_Hover Then '如果鼠标还在虚拟控件的范围内,就吱一声.
MsgBox "ZButton_Click"
End If
End Sub
写完这些,运行来张效果图看看.

嘿,可爱的"控件"出现了.
不过这样的代码明显是各种BUG,糟糕透顶了.
一两个"控件"还好,多了就是一团糟.
下期我们开始把这些封装起来.让它更像"控件"一点.
本期代码下载地址:http://pan.baidu.com/netdisk/singlepublic?fid=295000_4071038647



  • Zatans
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ZsUI - 初步封装
封装可以使代码变得简洁,方便,可复用.
我们先简单的封装一下.
新建一个Zs_h模块.
把一些常数和自定义类型的声明放在里面.
新建一个Zs_Graphics_GdiPlus类模块.
负责GDIPlus的初始化和善后.
新建一个Zs_UI_Container类模块.
负责管理子控件,处理父容器的消息分发给对应的子控件.并声明一些接口给子控件调用.
新建一个Zs_UI_ImageButton类模块.
替代原先那个简陋的Type Zs_UI_Button.
封装后的效果图.
本期源码下载地址:http://pan.baidu.com/netdisk/singlepublic?fid=295000_3794599589



  • sunshinebean
  • 子类化
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶顶更健康,来支持下!顺祝节日快乐


  • Zatans
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ZsUI - 思考已出现的问题
上一期的代码里,把所有的UI对象都放进一个数组,通过轮询数组来找出触发事件的对象,数组的中对象的顺序既是对象的Z序.
重绘的时候从数组第一个对象开始,也就是最底层.触发事件的时候从数组最后一个对象开始,也就是最顶层.
VB中数组很方便,可是用数组保存对象,这对于增删改对象的时候却非常的低效.个人觉得链表才是更好的选择.虽然链表在VB中实现也很麻烦.
关于重绘,上一期的代码重绘时有很严重的闪烁.而且系统的内存占用很大.
可以更改重绘方式为双缓冲定时重绘,即每50MS重绘一次.VB中多线程不稳定,用Timer代替.
(因UI对象都有透明度,这里重绘时选择全部重绘,而没有做裁剪优化.有心的可以自己去写一个)
在想象中,写一个Zs_UI_Base这样的基类,然后继承和重载是最好的选择,可以省去很多精力和劳力,可惜VB在类的继承上太脆弱了.
导致每写一个UI对象就要重新写一遍那些X,Y,Width,Height...之类的属性和方法.代码的臃肿可想而知.
这个暂时无解.或又谁知道取巧的可以指点下我.~.~.



  • Zatans
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
年年有今日,岁岁有今朝.


  • itianda
  • 简易程序
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
大概20天或者一个月前也在弄directui,语言选了go,现在有点后悔了。(go有接口,但没有继承)
控件只写了个按钮类和半个文本框(cleartype不会处理,再加上考试所以停滞到了现在..)
实现的事件:

go和vb一样,没有头文件,只能自己去写声明:

抛开语言,说下经验:
重绘问题是大家都比较关心的,我的实现方法是父控件生成bitmap,然后向下传递从该bitmap创建的graphics。最终所有图像都存在于顶层控件创建的bitmap上,由顶层控件(窗体)实施绘制。重绘效率:

大概每次15ms。提高重绘效率的一个技巧是使用cachedbitmap(不使用cachedbitmap的效率大概是200ms)。

贴张图(上面的图都是以前截的,刚重装完系统...)
为了风格统一,我实现的时候除了beginpaint和endpaint算是gdi函数外,其余全部使用gdi+函数。
支持楼主此贴不会TJ


2025-08-20 09:45:16
广告
不感兴趣
开通SVIP免广告
  • 凤凰社sun
  • 暴力枚举
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶


  • 无聊耍耍酷
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
节日快乐,此贴该加精


  • 无聊耍耍酷
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好像已经是精品了,哈哈


  • _G63
  • 递归爆栈
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好贴要顶 支持lz继续发下去 祝lz节日快乐


  • Kita
  • 子类化
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • Zatans
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
谢谢大家支持.六一快乐.


2025-08-20 09:39:16
广告
不感兴趣
开通SVIP免广告
  • jcweiran
  • 简易程序
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
厉害


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 3 4 5 6 下一页 尾页
  • 145回复贴,共7页
  • ,跳到 页  
<<返回vb吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示