最新要闻
- 天天热资讯!金观平:唱响新时代“黄河大合唱”
- 广告弹窗太多!小米应用商店出手严管WiFi、清理类App
- 环球快播:100%自研!印度本土4G/5G网络来了:设备将投入大规模部署 还要推广全球
- 国产大飞机C919商用首飞成功!全机供应链揭秘_环球热讯
- 减肥就非得痛苦吗?华为鸿蒙3全家桶打造运动健身新体验-全球快报
- 阻止Wii模拟器登陆Steam!任天堂表态:模拟器非法 当前热点
- 关于征集载人月球车研制方案的公告
- 3年来首升!日本应届大学生就业率97.3% 全面复苏争夺汽车、半导体等人才
- “礼让行人”该不该被取消 网友吵翻:车主称拿规则当保护伞 你怎么看?|全球观天下
- 嫁给金牛男最多的星座女 金牛男婚后会出轨吗?
- PHEV车型常压油箱如何吸附燃油蒸汽?比亚迪公布技术细节 天天关注
- Redmi Note 12T Pro搭载罕见LCD原色屏:144Hz超高刷新率
- 不靠显卡 NVIDIA太会做AI生意了:转手就卖出100倍 环球观焦点
- 热讯:华为官宣开发者大会 7月7日见:全球第三大手机系统鸿蒙4.0要来了
- 吸湿速干 反光设计:鸿星尔克男士速干冰丝短袖39元发车
- 马斯克旗下Neuralink获准启动人体临床试验 脑机接口概念股集体拉升_最资讯
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界播报:VST实例(3)绘制VST
在绘制以及事件中,需要明确两个名词:
ITEM,通常指的是node,因为VST中一个节点就是一项。
(相关资料图)
CELL(单元格),通常指的是一个VST下的某具体栏(column)。
1、节点图标
VST可以链接两组图标,分别是vst.Images; vst.StateImages; vst.Images用于存储VST的通用图标,而vst.StateImages用于存储在不同状态下的图标。
事件OnGetImageIndex用于设置在不同情况下的图标,本程序的代码如下:
procedure TForm2.vstGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: TImageIndex);begin if (Column=2) and (Kind=ikNormal) then ImageIndex:=Sender.GetNodeLevel(node)+1;end;
上面的代码中,column=2,用于指定只在第三栏中显示图标,Kind=ikNormal则说明正常情况下的显示图标。实际上,大部分时候每个节点都有个状态:normal,但是,处于编辑状态或其它特殊情况时,则不具备normal状态。
kind有以下状态:
ikNormal
ikSelected
ikState,
ikOverlay
如果不指定状态,则会同时显示两个图标,一个是normal的图标,一个是状态图标。
上面指定了kind=iknormal,因此如果选中某行节点的时候,你会看到没有图标,所以语句可以更改为:
if (Column=2) and (Kind in [ikNormal,ikSelected ])
如果没有kind部分,则VST显示的效果如下:
请注意:OnGetImageIndex事件的程序不同版本有所区别,V7.X和V5.X并不兼容。
默认情况下,VST每个单元格(CELL,即某个node下的某个column)都可以有图标,所以需要指定具体需要显示图标的node和column的图标ID(imageindex)。
2、绘制循环
绘制VST的顺序如下:
- 开始绘制之前 (OnBeforePaint)
- 节点绘制之前 (OnBeforeItemPaint)
- 节点擦除之前 (OnBeforeItemErase)
- 节点擦除之后 (OnAfterItemErase)
- 单元格绘制之前 (OnBeforeCellPaint)
- 绘制文本(string trees only, OnPaintText)
- 绘制结束 (OnAfterCellPaint)
(1)OnBeforePaint
此事件发生在绘制VST之前,一个VST指发生一次此事件。
这个阶段通常用于对绘画操作的目标画布(TargetCanvas)(例如窗口或打印机画布)进行进一步设置,比如更改映射模式或设置另一个裁剪区域。由于传递的画布并不直接用于进行实际绘画,因此设置其字体或颜色没有任何效果。基本上,仅影响将位图复制到目标画布的属性才有任何影响。
通常不使用此事件,除非打算定制VST的背景图(background)。本程序没有使用此事件。
(2)OnBeforeItemPaint
当准备绘制某个node之前,会触发此事件。
在这个阶段的事件中,您可以告诉树形结构是否要完全自己绘制节点,还是让树形结构绘制它。由于这是基于每个节点的,所以这是保持特殊布局而不必在绘画循环中进行所有操作的完美场所。注意:将事件中的CustomDraw参数设置为True将完全跳过节点的绘制,不会绘制像树形线、按钮、图片或擦除背景等标准内容的任何东西。因此,要显示节点的任何有用信息,请在OnBeforeItemPaint事件中进行。
这是第一个获取双缓冲画布用于绘制节点的阶段,因此如果您想设置特殊属性,这是一个很好的机会。请记住,特别是颜色是由树形结构根据特定规则设置的(焦点、选择等)。
注意:如果你设置了CustomDraw:=true,那么后面你将自己绘制所有的东西,VST不会帮你绘制文本、图标等。
此时也不会进行任何实际的绘制,因此本程序也无此事件的代码。
(3)onBeforeItemErase
英语的erase通常翻译为擦除,但和我们理解中的擦除不一样,它并不是减去某种属性,而是在选定的区域都附上某种属性,例如擦除的位置,都使用某种颜色,而区域的之外,则是其原本的颜色。
事件onBeforeItemErase发生在开始绘制节点(node)之前,这个阶段及其相关事件通常用于为节点设置不同的背景颜色或用与树形结构不同的特殊图案擦除背景。
代码如下:
procedure TForm2.vstBeforeItemErase(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect; var ItemColor: TColor; var EraseAction: TItemEraseAction);begin if Odd(NoDe.Index) then ItemColor:=clSilver;end;
itemcolor指的是节点的背景色,如果没有在后面进行修改,则将在此处指定节点的背景色。
TItemEraseAction有三个值:
eaColor, // 使用提供的颜色绘制背景。
eaDefault, // VST将绘制节点的背景(图形或颜色)
eaNone//将忽略颜色或图形的设置,使用上一个节点的颜色绘制背景。
需要注意的是,如果选择了eanone,在后面的程序中如果自己手动绘制了单元格,可能会出现文本的重影。
(4)OnAfterItemErase
此事件发生在完成节点背景绘制之后,每个节点只触发一次此事件,这个阶段及其相关事件用于在背景被擦除后进行额外的绘制。
本程序也无此事件的代码。
(5)onbeforecellpaint
此事件发生在绘制单元格之前,虽然在进入这个阶段之前(如果是第一次运行)已经进行了针对该节点的完整设置,但与onbeforeitemerase相比,此事件的不同之处是绘画被限制在当前列。现在还没有绘制线条或图片。
可在此事件中设置单元格的rect。本程序也没有此事件的代码。
(6)OnPaintText
此事件是VST特有的,而VDT没有此事件,用于文本绘制的设置,因为Virtual Treeview不知道如何绘制节点的内容,它将这个绘画委派给名为DoPaintNode的虚方法。派生类会覆盖此方法并执行适当的操作。例如,TVirtualDrawTree仅触发其OnDrawNode事件,而TVirtualStringTree准备目标画布,并允许应用程序通过触发OnPaintText重写一些或所有画布设置(字体等)。在此事件返回后,节点的文本/标题被绘制。当对齐和绘制文本时,改变的字体属性会被考虑在内。
本程序中此事件的代码如下:
procedure TForm2.vstPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType);begin if Sender.Selected[node] then begin TargetCanvas.Font.Size:=14; TargetCanvas.Font.Style:=TargetCanvas.Font.Style+[fsUnderline,fsItalic]; end;end;
当某行节点被选择,则选择的文本有着不同的字体大小和样式。
此事件通常也不进行具体的绘制工作,具体的绘制工作在ondrawtext事件中写代码,也就是说,在此事件中通常只进行设置。事件ondrawtext的讲述将放到“3、绘制文本”中。
(7)OnAfterCellPaint
此事件发生于完成了单元格的绘制,此时已经完成单元格的绘制,包括选择框的绘制。
本程序也无此事件的代码。
3、绘制文本
文本的绘制在ondrawtext事件中实现,先上代码如下:
procedure TForm2.vstDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: string; const CellRect: TRect; var DefaultDraw: Boolean);var ss1,ss2:string; POS:Integer; fc:TColor;fs:Integer;begin case Column of 0,1,3: begin //首先存储默认的字体大小和色号 fc:=TargetCanvas.Font.Color; fs:=TargetCanvas.Font.Size; //SS1中存储特定文本,即lbledt1.Text,但转换为大写并清除前后的无用空格 ss1:=lbledt1.Text; ss1:=ss1.Trim.ToUpper; //lbledt1为空或单元格中文本不包含lbledt1中的文本,则直接退出。 if ss1.IsEmpty then Exit; if not Text.Contains(ss1) then Exit; //必须设置DefaultDraw为false,不然即便你自己对文本进行了绘制, //VST仍然会再次进行默认的绘制。 DefaultDraw:=False; //根据不同的栏目和level进行不同的缩进 if Column=0 then POS:=sender.GetNodeLevel(node)*10 else POS:=0; //SS2暂时存储特定文本之前部分的文本,例如单元格文本是ZBAA,而SS1是BA,则SS2是Z SS2:=Text.Substring(0,TEXT.IndexOf(SS1)); //如果SS2不为空 if not ss2.IsEmpty then begin TargetCanvas.Font.Color:=fc; TargetCanvas.Font.size:=fs; TargetCanvas.TextOut(CellRect.left+POS,5,ss2); pos:=TargetCanvas.TextWidth(ss2)+POS+2; end; //字号12,颜色红色显示特定的文本 TargetCanvas.Font.Color:=clRed; TargetCanvas.Font.size:=fs+2; TargetCanvas.TextOut(CellRect.left+POS,4,ss1); pos:=pos+targetcanvas.TextWidth(ss1)+2; //正常显示剩下的文本 TargetCanvas.Font.Color:=fc; TargetCanvas.Font.size:=fs; ss2:=Text.Substring(ss2.Length+ss1.Length); TargetCanvas.TextOut(CellRect.left+POS,5,ss2); END; 4: begin with pcodes(Sender.GetNodeData(NODE))^ do begin if rwy_style="单跑道" then begin DefaultDraw:=False; TargetCanvas.Font.Color:=clRed; TargetCanvas.Font.size:=12; TargetCanvas.TextOut(cellrect.Left+3,CellRect.Top+5,"单"); TargetCanvas.Font.Color:=clBlack; TargetCanvas.Font.size:=10; TargetCanvas.TextOut(cellrect.Left+18,CellRect.Top+5,"跑道"); end; end; end; else ; end;end;
这段代码对显示的文本进行了定制,总得来说,代码分成了两部分,第一部分针对的是第一栏、第二栏和第四栏,如果ICAO四字码、IATA三字码或机场/情报区名称中存在查询的字符,则查询的字符放大两号,且以红色显示,而其余部分则以10号字体。
第二部分以红色字体显示单跑道的“单”字,其余正常显示。
显示结果如下:
关键词:
-
环球视讯!Unity的Console的控制类LogEntries:深入解析与实用案例
使用UnityConsole窗口的LogEntries私有类实现自定义日志系统在Unity开发过程中,我们经常需要使用Console
来源: 世界播报:VST实例(3)绘制VST
【快播报】一图胜千言,气泡图引领数据时代的视觉革命
环球视讯!Unity的Console的控制类LogEntries:深入解析与实用案例
天天热资讯!金观平:唱响新时代“黄河大合唱”
专项债券不能“一拨了之”
广告弹窗太多!小米应用商店出手严管WiFi、清理类App
环球快播:100%自研!印度本土4G/5G网络来了:设备将投入大规模部署 还要推广全球
国产大飞机C919商用首飞成功!全机供应链揭秘_环球热讯
减肥就非得痛苦吗?华为鸿蒙3全家桶打造运动健身新体验-全球快报
阻止Wii模拟器登陆Steam!任天堂表态:模拟器非法 当前热点
关于征集载人月球车研制方案的公告
3年来首升!日本应届大学生就业率97.3% 全面复苏争夺汽车、半导体等人才
“礼让行人”该不该被取消 网友吵翻:车主称拿规则当保护伞 你怎么看?|全球观天下
3万多条含图片的菜谱资料ACCESS\EXCEL数据库-天天视讯
聊聊MassTransit——实现Saga模式概览(译)|天天视点
Visual Studio 2022的一个惊艳新功能开发隧道|滚动
嫁给金牛男最多的星座女 金牛男婚后会出轨吗?
PHEV车型常压油箱如何吸附燃油蒸汽?比亚迪公布技术细节 天天关注
Redmi Note 12T Pro搭载罕见LCD原色屏:144Hz超高刷新率
不靠显卡 NVIDIA太会做AI生意了:转手就卖出100倍 环球观焦点
热讯:华为官宣开发者大会 7月7日见:全球第三大手机系统鸿蒙4.0要来了
吸湿速干 反光设计:鸿星尔克男士速干冰丝短袖39元发车
马斯克旗下Neuralink获准启动人体临床试验 脑机接口概念股集体拉升_最资讯
直播源码技术屏幕共享功能
Python压缩JS文件,重点是 slimit
Python工具箱系列(三十四)
环球热头条丨U3DFrameWorkDemo:四、资源打包和热更
焦点日报:基于 Mindspore 框架与 ModelArts 平台的 MNIST 手写体识别实验
神十六有航天飞行工程师和载荷专家:戴眼镜也能上太空了-天天快看点
红魔电竞显示器2K银翼版618优惠300元:240Hz超高刷 环球新消息
头条焦点:12点正式开始!天猫618红包首发 超高概率中现金红包
世界快看:改款将至?曝特斯拉上海工厂Model 3产线停工:价格或将调整
世界今头条!官宣2030年前登月 我国面向全社会征集载人月球车研制方案
丰立智能:5月26日融资净买入2470.32万元,连续3日累计净买入4969.34万元
Docker 学习笔记
过滤器链及责任链设计模式 观热点
阿里一面:MySQL 单表数据最大不要超过多少行?为什么?这样回答满分! 世界热消息
gps网络时间服务器(时间同步装置)助力电力信息化建设|世界观焦点
deepin-for-arm64支持
全球关注:债市观察:利好钝化收益率窄幅波动 十债2.7%踌躇踏步
【世界新视野】抖音打不开视频怎么回事_抖音打不开
当前要闻:山姆同款蛋糕杭州卖165上海卖95 网友直呼太坑:你遇到过吗
绵云般口感!和路雪千层雪冰淇淋3.5元官方大促(商超6元)
今年唯一LCD性能机!Redmi Note 12T Pro外观公布-当前独家
重点聚焦!研究称每天排便超一次或影响健康:心力衰竭风险增加33%
全球快资讯丨接近小米1英寸了!曝iPhone 16 Pro Max主摄大升级
“候鸟”老人现在是否可以在海南澄迈县买房子?深蓝苑·滨江城PK五指山森林湖养老分析!|焦点简讯
JS中的arguments
今日视点:关于切片参数传递的问题
天天视点!十大券商看后市:A股底部特征浮现 市场进一步下行空间较小
神舟十六号30日9时31分发射:三名航天员名单公布 首次有大学教授
华为畅享60X根治续航焦虑!充电宝完全派不上用场了
全球微资讯!华为智选车终于出轿车 奇瑞EH3谍照曝光:华为ADS摄像头瞩目
世界今热点:小屏4K“天花板”优派推出新款23.8英寸显示器 1999元
神十六乘组公布:载荷专家将首登天宫-动态
搜狐汽车全球快讯 | 比亚迪或考虑在法国建厂 比亚迪:正评估建厂可行性-全球资讯
【独家】Linux工作原理2常用基本命令和目录层次结构
618开车神价 爱国者4TB PCIe 4.0硬盘999元(国产长寿TLC闪存)-全球今亮点
特斯拉、丰田、BBA等都靠边!离开中国:世界无法生产电动车电池 当前观点
苹果iPhone销冠地位稳如泰山 今年618攻略请收好
热消息:央视网评《家有儿女》疑似被恶意评分:小心网络评分变“粉黑大战”
山东舰穿越台湾海峡北上,台军兵推双航母“攻台”_今日热讯
【读财报】三年期互联网主题基金透视:天弘基金业绩垫底 长盛基金风格较激进
天天快消息!内存频率、容量继续狂飙 科赋宣布DDR5-8600:单条48GB
环球今亮点!史上最大屏!iPhone 16 Pro系列确认6.3/6.9英寸屏幕
LCD党福音!Redmi Note 12T Pro跑分出炉:搭载天玑8200-Ultra
每日资讯:101岁杨振宁在西湖大学致辞 给自己打分还不错 张朝阳赞其超越霍金
网络授课用什么软件好 网络授课用什么软件
【世界独家】读数据压缩入门笔记01_数据压缩导读
苹果iOS 17超前瞻 近年来最没存在感的一代?
印度官员为找手机抽掉水库210万升水!最后工作没了|当前时讯
天天热议:iPhone 15即将量产 富士康重金招人:每人3500元奖金
焦点热议:百元股上新 双元科技申购
CISCN_Dozer战队wp
环球新资讯:AutoCAD所有版本总结、序列号密钥总结大全(转载)
ZooKeeper论文阅读笔记 焦点关注
滚筒洗衣机真的比波轮的更好吗?一文读懂
死亡风险直降12%!爱发朋友圈 竟然更长寿 环球观焦点
猫咪为什么要花那么多时间梳理毛发?只是臭美吗?_速看
世界短讯!我父亲配享太庙是谁的台词
重庆长城宽带价格表_重庆长城宽带
银行汇票的付款人是谁_银行本票的有效期限为1个月 而其提示付款期限为自出票日起最长不
王老吉百家姓氏罐大促:12罐到手价29.9元
祭祀的拼音_祭祀怎么读
Oracle 死锁与慢查询总结
当前关注:天津聚力产业链优势打造信创产业基地
全球今头条!丫丫启程回京:将返回北京动物园
当前热议!Unity的Undo:详解解析与实用案例
「学习笔记」(扩展)中国剩余定理
2023-05-28:为什么Redis单线程模型效率也能那么高?|通讯
9)子查询
女模特为长高做手术“打断”腿两次:163变180 如踩高跷
网购虾条居然收到了差评返现卡:主打的就是真诚_热点
热头条丨女生一条微信状态让初中班主任找到:他像太阳一样照耀着大家
资讯推荐:猫眼端午档观众最想看的电影!《消失的她》即将上映:倪妮主演
当前热门:世乒赛战报:陈梦/王艺迪、王楚钦/樊振东夺冠,中国包揽5冠
Doris(三) -- 索引_世界快看点
梅西、迪玛利亚领衔!阿根廷国家队中国行名单公布|关注
南京玄武湖隧道内一辆宝马5系突发自燃 浓烟蔓延数百米_时快讯
哦?上一轮G7塔图姆刚刚刷新历史记录轰了51分! 天天新视野