Jeremy White wrote:
The script below shows the problems I'm having
with InvalidateRect(). The script makes a RichEdit
move in tandem with a splitter.

When no InvalidateRect() is called in the Splitter_OnRelease(),
and the splitter is moved into the RichEdit area,
echoes of it are created in the RichEdit.

When $Main->InvalidateRect(1) is called at the end
of Splitter_OnRelease() the echo problem is corrected,
but clearly only the RichEdit has been updated,
not the whole $Main window.

And finally, when Win32::GUI::InvalidateRect(0,0)
is used, the whole window is repainted correctly,
but so is the whole desktop, with unacceptable
flicker.

I've tried every imaginable variation on InvalidateRect(),
Redraw() and Update(), and only invalidating the whole
desktop works (sort of).

I must admit this one's got me stumped. InvalidateRect and Redraw *should* work, but they don't. I even checked that the correct parms are passed to the windows API function InvalidateRect via XS, and it's fine.

I then commented out the line:

-background => 0x0000FF,

When you create the window, and bingo, $Main->InvalidateRect(1); works. I'm not sure why setting the background color of the window should cause this problem, but I suspect it's a bug of somesort when Win32-GUI paints the background.

I've added comments to this tracker:

http://sourceforge.net/tracker/index.php?func=detail&aid=1363141&group_id=16572&atid=116572

Thanks for the bug report. There was indeed a problem with WM_ERASEBKGND and -background. I've got a fix for that, but the original splitter problem remains. Once this fix gets into a release you'll only need to call InvalidateRect(1) on the RichEdit control to remove the extra lines left by the splitter.

Regards,
Rob.

Reply via email to