[Bug 3476] New: Treeview control has invalid update region when
built by COMCTL32.OCX
Wine Bugs
wine-bugs at winehq.org
Mon Oct 3 13:26:36 CDT 2005
http://bugs.winehq.org/show_bug.cgi?id=3476
Summary: Treeview control has invalid update region when built by
COMCTL32.OCX
Product: Wine
Version: CVS
Platform: PC
OS/Version: Linux
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: wine-gui
AssignedTo: wine-bugs at winehq.org
ReportedBy: a_villacis at palosanto.com
When COMCTL32.OCX (ships with MS VisualBasic 5) builds a TreeView control, the
control is not repainted correctly: only the very first item is repainted,
instead of the entire tree. This happens regardless of the expanded status of
the treeview.
After some digging in the treeview control, I saw that the code in the control
tries to save some drawing by querying the update region of the control window.
When the WM_PAINT message indicates a non-null HDC in wParam, the code fetches
the update region for the control window. If I understand the intent of the
code correctly, the WM_PAINT message can be sent to the control with an wParam
of the HDC of an offscreen bitmap, in order to draw the tree into it. When the
update region of the control is NULL, the code fetches the BITMAP structure of
the target HDC in order to clip the drawing to the dimensions of the target
bitmap.
The problem is that, in the case of the treeview managed by COMCTL32.OCX, for
some as yet undiscovered reason, the control *always* has a null update region,
except for the very first rendering (which is overwritten by a second rendering
with the problematic null region). No matter how the window is uncovered, the
update region remains null. Therefore, the control believes that the target is
an offscreen bitmap, even for the rendering to the screen. It then fetches the
default bitmap selected, which is an 1x1 dummy bitmap, gets a 1x1 target region,
and believes that only 1 pixel should be updated. Only the very first item gets
redrawn because of this.
The following patch works around this issue. However, this is not a proper fix,
because the control window should have been properly invalidated in the first
place, and the control should therefore have a proper update region. I am not
really sure whether the root cause is in the treeview code or in the region
updating code. I am inclined to the former, because the same treeview control
seems to work correctly in regedit.exe:
--- wine-20050930-cvs/dlls/comctl32/treeview.c 2005-09-12 17:34:07.000000000 -0500
+++ wine-20050930-cvs-patch/dlls/comctl32/treeview.c 2005-10-02
22:08:08.000000000 -0500
@@ -2790,6 +2790,8 @@
RECT rect = *rc;
TREEVIEW_ITEM *wineItem;
+ TRACE("refreshing on (%ld,%ld)-(%ld,%ld)\n", rect.left, rect.top,
rect.right, rect.bottom);
+
if (infoPtr->clientHeight == 0 || infoPtr->clientWidth == 0)
{
TRACE("empty window\n");
@@ -2859,6 +2861,12 @@
rc.left = 0; rc.top = 0;
rc.right = bitmap.bmWidth;
rc.bottom = bitmap.bmHeight;
+ if (bitmap.bmWidth == 1 &&
+ bitmap.bmHeight == 1 &&
+ bitmap.bmWidthBytes == 2) {
+ ERR("failed to recover a valid update region, using
GetClientRect()\n");
+ GetClientRect(infoPtr->hwnd, &rc);
+ }
TREEVIEW_EraseBackground(infoPtr, (HDC)wParam);
}
}
--
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
More information about the wine-bugs
mailing list