The most complex process in Virtual Treeview is without doubts its painting.

Read here what stages Virtual Treeview enters during paint and how you can customize this process.

Description

Similar to the system tree view Virtual Treeview defines so called paint cycles.

A paint cycle is one run of the paint code which draws a part or the entire window.

In Virtual Treeview this task is accomplished by the method PaintTree

which centralizes the paint management into one place and is called

for various tasks like window painting, drag image painting, WM_PRINTCLIENT handling and so on.

This paint method is able to draw the entire tree regardless of its window to the target canvas

and optimizes painting by considering the update/clipping rectangle,

which is passed in via the Window parameter (see also PaintTree).

Usually the following paint stages are executed during a paint cycle:

--> (OnBeforePaint)
--> (OnBeforeItemPaint)
--> (OnBeforeItemErase)
--> (OnAfterItemErase)
--> (OnBeforeCellPaint)
--> (OnPaintText)
--> (OnAfterCellPaint)
--> (OnAfterItemPaint)
--> (OnAfterPaint)

The cell and node events are of course not executed if there is no node to be drawn.

A special flag (tsPainting) in TreeStates indicates when a paint cycle is in progress.

Using this flag an application can for instance determine whether a node is initialized

because it is about to be drawn or for other reasons.

Every of the stages above is accompanied by a specific event

which allows the application to customize a particular aspect in the painting.

The following list discusses tasks which can be done during the various stages.

before paint

This stage is entered only once per paint cycle.
After setting the vsPainting state it is the very first instruction in a cycle.

This stage is typically used to do any further setup of the target canvas of the paint operation
(e.g. the window or a printer canvas), like changing the mapping mode or setting another clipping region.
Since the passed canvas is not directly used to do the actual painting setting its font or colors has no effect.
Basically only properties which affect blitting a bitmap to the target canvas have an effect at all.

before item paint

This stage is entered once per node to be drawn and allows directly
to control the path which is the taken to paint the node.

In the event for this stage you can tell the tree whether you want
to paint the node entirely on your own or let the tree paint it.
As this happens on a per node basis it is the perfect place
to maintain a special layout without doing everything in the paint cycle.
Note:
setting the CustomDraw parameter in the event to True will skip the node entirely,
without painting anything of the standard things like tree lines, button,
images or erasing the background.
Hence to display any useful information for the node do it in the OnBeforeItemPaint event.

This is the first stage which gets the double buffer canvas which is used to draw a node
so if you want to set special properties this is a good opportunity.
Keep in mind though that in particular the colors are
set by the tree according to specific rules (focus, selection etc.).

before item erase

This stage is also entered only once per node and allows to customize the node's background.

This stage and its associated event is usually used to give the node a different background color
or erase the background with a special pattern which is different to what the tree would draw.

after item erase

This stage is also entered only once per node.

This stage and its associated event is used
to do additional drawings after the background has been erased.

before cell paint

This paint stage is the first of the cell specific stages used to customize a single cell of a node and
is called several times per node, depending on the number of columns.

If no columns are used then it is called once.

While internally a full setup for this node happened
before the stage is entered (if it is the first run) the only noticeable effect
for the application which has changed compared to after item erase is that
the painting is limited to the current column.
There are still no lines or images painted yet.

on paint text

After default stuff like lines and images has been painted the paint node/paint text stage is entered.

Because Virtual Treeview does not know how to draw the content of a node
it delegates this drawing to a virtual method called DoPaintNode.
Descendants override this method and do whatever is appropriate.
For instance TVirtualDrawTree simply triggers its OnDrawNode event
while the TVirtualStringTree prepares the target canvas and
allows the application to override some or all canvas settings (font etc.)
by triggering OnPaintText.

After this event returned the text/caption of the node is drawn.
Changed font properties are taken into account when aligning and painting the text.

Note: The string tree triggers the OnGetText event two times
if toShowStaticText is enabled in the TVirtualStringTree.TreeOptions.StringOptions property.
Once for the normal text and once for the static text.
Use the event's parameter to find out what is required.

after cell paint

This stage is entered immediately after the cell is drawn.

This stage can be used to add whatever you like to a single cell
after everything has been painted there and is triggered once per column.

after item paint

This stage is entered after all cells of an item are drawn.

The after item paint stage is used to add node specific stuff like frames
and the like which concern all columns of that node and is called once per node.

after paint

The after paint stage is the last stage in the long chain of paint stages
and is entered after when paint cycle is complete.

In this stage everything of the tree (related to the current update area) has been drawn,
including the selection rectangle.

Virtual Treeview - Paint cycles and stages的更多相关文章

  1. Virtual Treeview 安装以及入门

    Virtual Treeview是一套Delphi下优秀的VCL控件,代码质量高,使用灵活.功能强大.性能非常好,可以用于表达Treeview和表格类数据.它的代码现在托管在google code上. ...

  2. Hypervisor, computer system, and virtual processor scheduling method

    A hypervisor calculates the total number of processor cycles (the number of processor cycles of one ...

  3. Winform组合ComboBox和TreeView实现ComboTree

    最近做Winform项目需要用到类似ComboBox的TreeView控件. 虽然各种第三方控件很多,但是存在各种版本不兼容问题.所以自己写了个简单的ComboTreeView控件. 下图是实现效果: ...

  4. 什么是virtual string tree?

    Virtual stringtree(以后简称VST)是一个提供源码的免费的第三方插件,支持DELPHI和C++builder,可在http://www.soft-gems.net/下载到最新的版本. ...

  5. 浏览器内部工作原理--作者:Tali Garsiel

    本篇内容为转载,主要用于个人学习使用,作者:Tali Garsiel 一.介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到 ...

  6. C/C++技术常用网站

    软件下载网站[visual studio 2005编译器] http://www.xdowns.com/ debug调试大牛 http://blogs.msdn.com/oldnewthing/ ht ...

  7. How browsers work

    这几天翻译一篇旧文 How browsers work ( 以现代浏览器chrome.火狐.safari 为对象来分析),这篇文章网上有其他的翻译版本,自己再翻译一遍主要是练习阅读英文文章,而且自己翻 ...

  8. C#接口知识大全收藏

    第一节 接口慨述 接口(interface)用来定义一种程序的协定.实现接口的类或者结构要与接口的定义严格一致.有了这个协定,就可以抛开编程语言的限制(理论上).接口可以从多个基接口继承,而类或结构可 ...

  9. QTableView使用自定义委托(QItemDelegate)

    需要在表格中绘制流程图,主要有箭头,方向,颜色,字符串,由于QTableView没有可用的绘制函数,所以需要自己去定义. 委托(delegate)继承QItemDelegate,模型(model)继承 ...

随机推荐

  1. 关于linux环境下crontab命令环境变量的问题

    这几天在弄数据库备份的事情,其中涉及到使用crontab命令自动执行shell脚本的问题,发现将写好的数据库导出脚本export.sh ################################ ...

  2. [How to] 使用HBase协处理器---Endpoint客户端代码的实现

    1.简介 不同于Observer协处理器,EndPoint由于需要同region进行rpc服务的通信,以及客户端出数据的归并,需要自行实现客户端代码. 基于[How to] 使用HBase协处理器-- ...

  3. 如何在Cent OS上安装和部署jdk与tomcat?

    Cent OS是一款Linux系统.在商业应用中,Linux操作系统在服务器市场有着广泛的运用,这源于Linux系统的几大优点: 1.跨平台的硬件支持 由于Linux 的内核大部分是用C 语言编写的, ...

  4. 设置NGINX进程分配至多核CPU提升性能

    Nginx 配置文件 nginx.conf 首先需要找到 Nginx 的配置文件 nginx.conf 才能进行下面的操作,在LNMP一键安装包默认配置下,nginx.conf 存放在/usr/loc ...

  5. python【项目】:基于socket的FTP服务器

    功能要求 1. 用户加密认证 2. 服务端采用 SocketServer实现,支持多客户端连接 3. 每个用户有自己的家目录且只能访问自己的家目录 4. 对用户进行磁盘配额.不同用户配额可不同 5. ...

  6. 三十分钟理解:线性插值,双线性插值Bilinear Interpolation算法

    线性插值 先讲一下线性插值:已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的y值(反过来也是一样,略): y−y0x−x0=y1−y0x1−x ...

  7. Median of Two Sorted Arrays——算法课上经典的二分和分治算法

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  8. 如何修改WP文章字体格式、字号大小、字体颜色

    在使用wordpress编辑文章的时候,很多朋友会像小编一样,发现它并没有像word文档一样有修改字体样式.字体大小.字体颜色.分页符等功能按钮,对我们写文章极为不便,原因是wordpress默认使用 ...

  9. bug优先级定义

    优先级定义如下: <版本前期阶段>(功能刚提测): [P0—紧急]:完全不能满足产品要求,基本功能明显未实现或完全不可用,阻塞测试流程与进度(核心功能流程) 1.功能未实现 .功能缺失 2 ...

  10. Windows实现内网IPMI端口转发

    https://www.cnblogs.com/yunweis/p/8024346.html