TVN_ASYNCDRAW通知代码

当图标或覆盖的绘制失败时,由树视图控件发送到其父级。 此通知代码以 WM_NOTIFY 消息的形式发送。

TVN_ASYNCDRAW
        
    pnmTVAsynchDraw =  (NMTVASYNCDRAW *) lParam; 

参数

lParam

指向 NMTVASYNCDRAW 结构的指针。 NMTVASYNCDRAW 结构包含绘制失败的原因。

返回值

没有返回值。

备注

树视图控件必须具有 TVS_EX_DRAWIMAGEASYNC 扩展样式。 请注意,这等效于列表视图的LVN_ASYNCDRAWN标志及其相应的样式。

此控件不会异步绘制。 异步用于树视图控件不同步提取图像(如果图像不可用)的上下文中。 (例如,如果树视图控件使用稀疏图像列表,则映像可能不可用,因为映像可能被卸载。) 相反,当图像不可用时,控件会通过向父级发送具有 NMTVASYNCDRAW 结构的TVN_ASYNCDRAW通知来同步询问父级要采取什么操作。 此结构的 hr 成员描述控件的绘制失败的原因。 E_PENDING的 小时 结果意味着 (图像根本不存在,需要) 提取图像。 成功表示图像存在,但未以所需的图像质量显示。

父级设置结构的 dwRetFlags 成员,以通知控件如何继续操作。 例如,父级可以在 iRetImageIndex 成员中返回另一个图像,以便控件进行绘制。 在这种情况下,父级将 dwRetFlags 成员设置为 ADRF_DRAWIMAGE。 如果控件发现返回的图像尚未提取,则控件可能会发送另一个TVN_ASYNCDRAW通知。

如果图像不可用,异步背后的想法是允许父级在后台进行提取,以便提取不会阻止 UI 线程,即控件位于的线程。 父级可以返回控件ADRF_DRAWNOTHING,然后启动后台线程以提取图标。 提取后,父级可以使用宏 TreeView_SetItem在树视图控件中设置图标。 这会导致树视图使项失效,并最终在图像列表中使用提取的图像重新绘制它。

以下代码示例将用作较大程序的一部分,演示父级如何通过控件处理此通知中的两个可能的返回代码,并确定控件应采取的操作。 未显示设置 dwRetFlags

case TVN_ASYNCDRAW:

   NMTVASYNCDRAW *pnm =  (NMTVASYNCDRAW *)lParam
   short dwDrawSuccessFlags = ShortFromResult(pnm->hr);

   if (dwDrawSuccessFlags & ILDRF_IMAGELOWQUALITY)
   {
        // Need to re-extract the icon
   }

   if (dwDrawSuccessFlags & ILDRF_OVERLAYLOWQUALITY)
   {
        // Need to re-extract the overlay
   }

要求

要求
最低受支持的客户端
Windows Vista [仅限桌面应用]
最低受支持的服务器
Windows Server 2008 [仅限桌面应用]
标头
Commctrl.h