Jump to content

Richedit horizontal scroll right arrow problem


Go to solution Solved by pixelsearch,

Recommended Posts

sorry again.

as said didn't find a way to reinstall wordpad.

btw we have 5 computers and on every computer wordpad and autoit richedit have the same error.

i cannot imagine that this should be be a broken wordpad.

is there no other way to verify and find out where the problem comes from.

what dlls are responsible for enabling richedit for autoit?

thanks for assistance

cheers mike

Link to comment
Share on other sites

Mike, you could deactivate the horizontal scroll right arrow as soon as the horizontal scroll thumb has reached its very rightmost position, as shown in the pic below :

Deactivate-scroll-right-arrow.png

After that, a click on the horizontal scroll thumb won't reactivate the arrow, but any other click on the horizontal scrollbar will (including dragging the thumb a bit on the left) with at least the letter "z" disappearing from the window ("z" is the very last letter of the longest line in the pic). Now that the scroll right arrow reappears (and at least the "z" is missing) then clicks on the self-reactived right arrow will be allowed...until the horizontal scroll thumb reaches its rightmost position again etc...

The picture above is based on a reworked example of the help file, topic _GUIScrollBars_GetScrollBarRGState, with _GUIScrollBars_Init() applied to the (Rich)Edit control and not to the GUI.

@PsaltyDS indicated in this link how to catch an event scrolling in _GUICtrlRichEdit ( WM_NOTIFY => $EN_MSGFILTER => PsaltyDS's "Case 276" e.g. $WM_HSCROLL, also you can prevent scrolling within the function by Returning 1 [tested] ) and there are also a few recommandations from @water and @Zedna in this link

I guess there must be a way to detect the rightmost position of the horizontal scroll thumb (e.g. there is nothing to scroll anymore). As soon as you retrieve this position, then you should reach your goal. All this isn't really easy but as this issue seems crucial for you, then I hope you'll find the solution (with the help of other readers too)

Good luck :bye:
Link to comment
Share on other sites

Hi again,

I have integrated the code so far, that I get the current scroll positions.

What I need and didn't find yet is how to get the max scroll positions possible.

Then I can compare both positions and either disable the arrow or set the position back into the allowed range.

Since the arrow sets by step, I would just reset to recent step.

This is my idea.

thanks for assistance

Cheers mike

Link to comment
Share on other sites

Mike, I'll try to dig into that when I got some time.

In fact, _GUIScrollBars_Init() isn't useful in the preceding pic. It is used in the help file (topic _GUIScrollBars_GetScrollBarRGState) to add scrollbars to the GUI (setting internally the elements of the Global variable $__g_aSB_WindowInfo[1][8], variable which will be found only in the function _GUIScrollBars_SetScrollInfoPos() and nowhere else in AutoIt)

As the (Rich)Edit control already got scrollbars, then we don't need _GUIScrollBars_Init() in your case, maybe a function like _GUIScrollBars_GetScrollBarXYThumbBottom() would be a good start, as it "retrieves the position of the bottom or right of the thumb"
Link to comment
Share on other sites

Mike, maybe some good news :
* The rightmost horizontal scroll thumb position is found in xyThumbBottom (see structure $tagSCROLLBARINFO
in help file). It should be a constant, as long as the (rich)edit control isn't resized.

* The changing position of the horizontal scroll thumb (its right coordinate) is found in GUIScrollBars_GetScrollBarXYThumbBottom . It changes constantly when a horizontal scrolling event is done.

So comparing both values when a richedit horizontal scroll event appears (in WM_NOTIFY => $EN_MSGFILTER => etc...) should allow you to deactivate the horizontal scroll arrow as soon as both values are equal.
Link to comment
Share on other sites

hi pixelsearch,

thanks for the info.

Here GUIScrollBars_GetScrollBarXYThumbBottom does not change the value while scrolling.

It always is same value like xyThumbBottom.

A variable scroll position I get with  _GUICtrlRichEdit_GetScrollPos($hGlo_WE_Control)
but the value seems to be like line length (117)
and not like the most position (1254)

In fact i need to compare editcontrol content width (say respecting longest line)
with editcontrol width opened more than this content by faulty scrolling with the arrow.

Cheers mike

Edited by mike1950r
Link to comment
Share on other sites

  • Solution
Mike, the following script solves partially your issue.
If you immediately drag the horizontal scroll box at its rightmost position, then the horizonal scroll right arrow will be deactivated, as discussed before. But this is not enough, as some other ways of scrolling aren't solved by the script.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiRichEdit.au3>
#include <GuiScrollBars.au3>

Global $sText = "", $hGui, $hRichEdit

For $n = 2 To 100
    $sText &= $n & " - This is a single long line intended to cause a hoizontal scroll bar to appear in the RichEdit control." & @CRLF
Next
$hGui = GUICreate("Example (" & StringTrimRight(@ScriptName, 4) & ")", 320, 350, -1, -1)
$hRichEdit = _GUICtrlRichEdit_Create($hGui, $sText, 10, 10, 300, 220, BitOR($ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL))

; _GUICtrlRichEdit_SetEventMask($hRichEdit, BitOR($ENM_SCROLL, $ENM_SCROLLEVENTS))
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_SCROLLEVENTS)

GUISetState(@SW_SHOW)

$tSCROLLBARINFO = _GUIScrollBars_GetScrollBarInfoEx($hRichEdit, $OBJID_HSCROLL)
$iMaxScrollHoriz = $tSCROLLBARINFO.Right - $tSCROLLBARINFO.xyThumbTop - $tSCROLLBARINFO.Left
ConsoleWrite("$iMaxScrollHoriz = " & $iMaxScrollHoriz & @crlf & @crlf)

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While True
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            _GUICtrlRichEdit_Destroy($hRichEdit)
            Exit
    EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
    #forceref $iMsg, $iWparam
    Local $hWndFrom, $iCode, $tNMHDR, $tMsgFilter, $hMenu
    $tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hRichEdit
            Select
                Case $iCode = $EN_MSGFILTER
                    $tMsgFilter = DllStructCreate($tagMSGFILTER, $iLparam)
                    Switch DllStructGetData($tMsgFilter, "msg")
                        Case $WM_HSCROLL ; 276
                            Local $iRightScrollThumb = _GUIScrollBars_GetScrollBarXYThumbBottom($hRichEdit, $OBJID_HSCROLL)
                            ConsoleWrite("$iRightScrollThumb = " & $iRightScrollThumb & "   /   " & _
                                "$iMaxScrollHoriz = " & $iMaxScrollHoriz & @crlf)
                            If $iRightScrollThumb = $iMaxScrollHoriz Then
                                _GUIScrollBars_EnableScrollBar($hRichEdit, $SB_HORZ, $ESB_DISABLE_RIGHT)
                            Else
                                _GUIScrollBars_EnableScrollBar($hRichEdit, $SB_HORZ, $ESB_ENABLE_BOTH)
                            EndIf

                        Case $WM_VSCROLL ; 277
                    EndSwitch
            EndSelect
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Anyway, that's a start, better than nothing :)
Link to comment
Share on other sites

Hi pixelsearch,

thanks lot for your code.

In my window I had to get the max position with $tSCROLLBARINFO.Right - 22.

I have tried all other options, but this was the only one, which worked.

I will have to find a formula which works on standalone editor and also on embeded editor.

When scrolling to the right pressing on the arrow constantely it passes the max position.

If you scroll with arrow click arrow, click arrow ... it works fine

also clicking once left arrow enables correctly the diabled right arrow.

Cheers mike

Edited by mike1950r
Link to comment
Share on other sites

Hi pixelsearch,

the formula for the max position must be:

$tSCROLLBARINFO = _GUIScrollBars_GetScrollBarInfoEx($hRichEdit, $OBJID_HSCROLL)
$iMaxScrollHoriz = $tSCROLLBARINFO.Right - $tSCROLLBARINFO.dxyLineButton - $tSCROLLBARINFO.Left

This works fine standalone or embeded

Cheers mike

Link to comment
Share on other sites

Mike, could you please run the example script found in the help file, topic GUIScrollBars_GetScrollBarInfoEx ?
Then just take a pic of the displayed GUI (without any shrinking or enlargement, just its exact size) and post it here, ok ?

It should allow to explain why this line didn't make it for you :

$iMaxScrollHoriz = $tSCROLLBARINFO.Right - $tSCROLLBARINFO.xyThumbTop - $tSCROLLBARINFO.Left

Meanwhile, I checked the results of the help file example with a reworked script (no major change, just added a tooltip while moving the mouse, also have the edit scrollbars disappear, to focus on the GUI scrollbars etc...) :

Scrollbar-1.png

* Tooltip on the left (100/500) matches what's found in $tagSCROLLBARINFO structure : Left = 100, Top = 500, which are the absolute coords of the left upper corner of the scrollbar (coords related to screen)

* Tooltip on the right (500/517) matches what's found in $tagSCROLLBARINFO structure : Right = 500, Bottom = 517, which are the absolute coords of the right down corner of the scrollbar (coords related to screen)
So far so good...

Scrollbar-2.png

* Tooltip on the left (117/...) corresponds (if I'm not wrong) to xyThumbTop, which is the "position of the top (for vertical scrollbar) or left (for horizontal scrollbar) of the thumb."
We see the tooltip displays 117 and not 17 as in the GUI display (e.g $tagSCROLLBARINFO structure) so I guess this result of 17 is relative to the scrollbar itself (on the contrary, Left, Top, Right & Bottom were related to screen)

* Tooltip on the right (419/...) corresponds (if I'm not wrong) to xyThumbBottom, which is the "position of the bottom (for vertical scrollbar) or right (for horizontal scrollbar) of the thumb."
We see the tooltip displays 419 and not 319 as in the GUI display (e.g $tagSCROLLBARINFO structure) so I guess this result of 319 is relative to the scrollbar itself (on the contrary, Left, Top, Right & Bottom were related to screen)

Scrollbar-3.png

This tooltip (483/...) indicates the maximum hozizontal scrollable position, related to screen (in fact 383 if we substract the left coordinate 100 to have it related to the scrollbar)

483 = 500 - 17 , with 17 being the width of the scrollable right arrow (which is also the value of xyThumbTop as the left coord of the thumb follows immediately the scrollable left arrow

So I don't understand why it didn't work for you, because you had to substract dxyLineButton instead of xyThumbTop. According to the help file (topic $tagSCROLLBARINFO), "dxyLineButton is the Height (for horizontal scrollbars ?) or width (for vertical scrollbars ?) of the thumb"

If I understood it correctly, why should we calculate the maximum scrollable position, introducing in the formula a value indicating... the height of the horizontal scrollbar ?

In my pics, both xyThumbTop and dxyLineButton got a value of 17 (as the scrollable arrows seem to be square). That's why I would like to see what will appear on your pic : will it show different values for xyThumbTop and dxyLineButton, with non-square scrollable arrows ?

Another possibility is that msdn is mistaken (I highly doubt that) and dxyLineButton is the height (for vertical scrollbars) or width (for horizontal scrollbars) of ... the scroll arrows : this would in fact explain why you had to use dxyLineButton instead of xyThumbTop in the formula !

So I'm a bit confused now. Sorry for the wrong assumptions in this post, just waiting for some clarification :)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...