Well, I hope it is released properly. I accidentally clicked on something "sticky" and it confused me a bit. So samples/BitmapScroll.pl may have gotten more rearranged than necessary, but I think it is back in order now. It seems to work, anyway.

On approximately 9/30/2004 6:25 PM, came the following characters from the keyboard of Glenn Linderman:

Hmm. One could argue that it is purely the responsibility of the user code that calls Win32::Scroll from the -onScroll handler, to adjust the position as appropriate.

It seems (confirm this if you can Jez) that the "issues" probably only occur for SB_THUMBPOSITION and SB_THUMBTRACK operations, as these are the only that use the position value which is potentially from the WM_HSCROLL or WM_VSCROLL message.

To allow easier "plumbing", and for the sake of efficiency, I'm adding a special value to the "position" parameter, of -1, which means "use the value from GetScrollInfo nTrackPos instead of the passed in value. So user code that directly calls Scroll($hv,SB_THUMBPOSITION,$pos) without receiving a message will still work, but user code that says

  -onScroll => sub { my ( $wh, $sb, $op, $pos ) = @_;
                     $win->Scroll( $sb, $op, $pos, 1 );
                     $win->InvalidateRect( 0 );
                   ),

need only be recoded as

  -onScroll => sub { my ( $wh, $sb, $op, $pos ) = @_;
                     $win->Scroll( $sb, $op, -1, 1 );
                     $win->InvalidateRect( 0 );
                   ),

to cause the -onScroll to use the value retrieved by the internal call to GetScrollInfo that it has to make anyway... thus avoiding doing two calls. The GetScrollInfo does have to have a different flag setting to retrieve the number. I haven't tested this with numbers that exceed 16 bits, but it seems to not break anything for smaller numbers.

I guess I've found the "off-by-one" error.... the SCROLLINFO struct is defined to have the "min and max" values for scrolling. This inconsistency with the graphics ops, which use "min and max+1" for all their bounds, is apparently another idoit-syncracy of the Windows API.

So I'm updating the sample/BitmapScroll.pl as follows:

Alter Scroll to be simpler, and use Win32::GUI::Scroll internally, and to return 1, as appropriate for use as an event sub.

Alter OpenBitmap to use bitmap size-1 for the ScrollRange maximums.

Alter Paint to pass $win->GetClientRect as the 1st 4 parameters, rather than invoking GetWindowRect twice, and after all, it is the ClientRect we want to fill, not the WindowRect...

Alter Resize to call AdjScroll, which does more complex adjustments to sizes and positions based on the presence or absence of scrollbars. AdjScroll is also needed to set up the scrollbars in OpenBitmap, to get it done accurately. The +20 technique works, to a degree, but this is more precise (I've been using this change for quite a while, and it works great... but is probably what made me aware of the off-by-one error).

I've also extracted a more generic OpenBitmap functionality, because there are other ways one might obtain the bitmap than asking the user... so I've renamed the "user interface" part FindAndOpenBitmap, and the generic code OpenBitmap. The more generic OpenBitmap also permits substitution of a different bitmap of the same size without altering the scroll positions, which is a function I find handy.

I'm about to release all this.... of course it can be rolled back if it is anathema. But it all seems better, and seems to work for me, both in the sample program, and in my two applications that both use the same technology -- derived from the sample originally (thanks Jez) and then refined -- and now put back into the sample.


On approximately 9/30/2004 10:11 AM, came the following characters from the keyboard of Glenn Linderman:

TADA!

As I mentioned to Jez off-list, the WM_HSCROLL and WM_VSCROLL messages come with parameters that are 16-bit... but the definition of scrollbars allows 32-bit numbers, if Get/SetScrollInfo APIs are used. Jez was noticing these issues when scroll ranges got into the 100,000+ range, he mentioned off-list.

So I perused the code for scrolling, and it seems that the incoming scroll message parameters are preserved and passed to the default Scroll event, with uses them.

There are two possible solutions.  I prefer the 2nd.

1) In all the places where WM_HSCROLL and WM_VSCROLL events are received (several .xs modules) the message parameter could be replaced by the real 32-bit value from a GetScrollInfo call, before calling the Scroll event.

2) In all the places where the Scroll event is processed, it should be the user responsibility to use Get/SetScrollInfo instead. For Win32::GUI, this means that the default Scroll event in GUI.xs should be updated.

The reason I prefer the second is that it preserves the Windows idoit-syncracies, which are (reasonably well) documented in MSDN; that it is less GUI code to change, and in a more central place; and that users should be used to using Get/SetScrollInfo in their own code anyway, due to MSDN documentation.

Comments?

I'll start working on a patch to GUI.xs Scroll function.... along the way, I'm looking for the off-by-one error... gotta be in there somewhere...


On approximately 9/30/2004 8:09 AM, came the following characters from the keyboard of Jez White:

As a quick reply, I have noticed other 'issues' with scrolling, typically when large values are used for the scroll range, I'm not sure if it's a win32::gui thing, a windows thing or a bug- it might or might not be related to issue you've highlighted.

Cheers,

jez.
----- Original Message ----- From: "Glenn Linderman" <[EMAIL PROTECTED]>
To: "Jez White" <[EMAIL PROTECTED]>
Cc: "Laurent ROCHER" <[EMAIL PROTECTED]>; <perl-win32-gui-hackers@lists.sourceforge.net>
Sent: Thursday, September 30, 2004 3:57 PM
Subject: Re: [perl-win32-gui-hackers] Main Commit


Now you know I'm not really a Windows GUI expert. I'm going to look now at updating my applications in the same manner as Laurent updated the sample code.

But I've recently noticed something in the sample bitmap scrolling code, which I am gratefully using in a couple of my applications, which is more obvious when displaying Black & White line art that extends to the very edge of the BMP, rather than full-color images, although once you know to look for it, it can be seen with full-color images also.

When scrolling to the complete right/bottom of a bitmap in a smaller window, especially when scrolling via "pages" by clicking on the empty area of the scroll bar, it becomes clear that the right-/bottom-most column/row of pixels in the window does not get redrawn at the very end. It is like there is an off-by-one error somewhere in the code.

Now I notice the scrolling limits are based on Win32::GUI::Width, and that Win32::GUI::Width calculates width as Right-Left. Now I don't know the Windows spec well enough to know if it should be Right-Left+1 -- in other words, in Right the last drawable pixel, or the first non-drawable pixel? Of course, maybe the off-by-one error is somewhere else instead; this possible source of the off-by-one is just speculation on my part that I haven't yet confirmed or discarded by reading the Windows documentation. But the scrolling bug exists, regardless of where the off-by-one error creeps in.


On approximately 9/30/2004 12:01 AM, came the following characters from the keyboard of Jez White:

Hi,
I've just tested the changes to the -onpaint event and it looks good:)
 Cheers,
 jez.

    ----- Original Message -----
    *From:* Laurent ROCHER <mailto:[EMAIL PROTECTED]>
    *To:* perl-win32-gui-hackers@lists.sourceforge.net
    <mailto:perl-win32-gui-hackers@lists.sourceforge.net>
    *Sent:* Wednesday, September 29, 2004 10:22 PM
    *Subject:* [perl-win32-gui-hackers] Main Commit

    Hi,
     Changelog
     - MakeFile.pl, MakeFile_m.pl
            + Use tab as space in rule for use with dmake
        - GUI.pm, GUI.xs
            + Add -brush option for Win32::GUI::Class.
        - GUI_Helper.cpp
+ classname_From and handle_From : Replace strlen as static
    string length.
        - Window.xs, GUI_MessageLoops.cpp, Samples\BitmpaScroll.pl :
            + Move Paint event in Window_onEvent.
            + Use DoEvent_Paint function like Graphic
        - ToolTip.xs :
            + Add -balloon option
     Laurent.




--
Glenn -- http://nevcal.com/
===========================
The best part about procrastination is that you are never bored,
because you have all kinds of things that you should be doing.


-------------------------------------------------------
This SF.net email is sponsored by: IT Product Guide on ITManagersJournal Use IT products in your business? Tell us what you think of them. Give us Your Opinions, Get Free ThinkGeek Gift Certificates! Click to find out more
http://productguide.itmanagersjournal.com/guidepromo.tmpl
_______________________________________________
Perl-Win32-GUI-Hackers mailing list
Perl-Win32-GUI-Hackers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-hackers






-------------------------------------------------------
This SF.net email is sponsored by: IT Product Guide on ITManagersJournal
Use IT products in your business? Tell us what you think of them. Give us Your Opinions, Get Free ThinkGeek Gift Certificates! Click to find out more
http://productguide.itmanagersjournal.com/guidepromo.tmpl
_______________________________________________
Perl-Win32-GUI-Hackers mailing list
Perl-Win32-GUI-Hackers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-hackers






--
Glenn -- http://nevcal.com/
===========================
The best part about procrastination is that you are never bored,
because you have all kinds of things that you should be doing.

Reply via email to