我有一个Delphi 6应用程序,它的TListBox控件设置为lbOwnerDrawVariable。在运行时,我向列表框中添加一个字符串。我为OnMeasureItem()和OnDrawItem()设置了事件处理程序,并在每个事件处理程序的第一行代码上设置了断点。然而,他们两个都没有被称为。一次也没有。即使我在列表框中进行了显式的、刷新、或重绘调用,也不会。
这是非常基本的东西,那么,我做错了什么才能抑制那些事件处理程序的调用,进而破坏我的所有者绘制代码呢?单个字符串确实正确地显示在列表框中。我添加了一个OnClick()事件处理程序,以查看它是否有效。
发布于 2011-12-13 07:20:09
OnMeasureItem和OnDrawItem事件(间接)是响应于来自WM_MEASUREITEM和WM_DRAWITEM的消息而触发的。确保您的应用程序中没有过滤掉该消息的任何消息处理程序,或者VCL的内部CN_MEASUREITEM和CN_DRAWITEM消息。
发布于 2011-12-13 11:19:12
结果发现,问题是由于我正在使用的TListBox的列属性中有一个非零的值。在转换为所有者绘图之前,我一直在尝试使用列,并保留了非零值的TListBox.Columns属性。显然,非零列属性值抑制了所有者绘制相关事件触发的触发。一旦我将该属性设置为零,OnMeasureItem()和OnDrawItem()就开始触发。
发布于 2011-12-13 08:06:01
在这里几乎没有什么可以出错的。如果您设置了一个测试应用程序来尝试这一点,那么它的功能就像您所期望的那样,并且调用了事件处理程序。
您报告的行为最有可能的原因是在分配事件处理程序之前添加了项。这通常发生在设计时在.dfm文件中添加项时。您说您要在运行时添加这些项。在分配事件处理程序之前,您可能过早地添加了它们。如果您添加项目以响应事件,例如单击按钮,会发生什么情况。尝试一下,因为您可以确定,然后事件处理程序就会按照这个点分配。
如果这没有帮助,那么很明显,您的应用程序中有一些代码干扰了VCL代码。
https://stackoverflow.com/questions/8485018
复制相似问题