Valhalla Legends Archive

Programming => General Programming => Topic started by: ______ on April 11, 2003, 03:24 PM

Title: Rich Text Box MnuLockChat
Post by: ______ on April 11, 2003, 03:24 PM
How would i lock chat on a pop up menu from a rich text box to read previous messages?
Title: Re:Rich Text Box MnuLockChat
Post by: Lobo on April 23, 2003, 05:35 PM
Quote from: ______ on April 11, 2003, 03:24 PM
How would i lock chat on a pop up menu from a rich text box to read previous messages?
have your rtb send to a not visible rtb when its locked, and when you unlock it send the text from the not visible rtb to the main one, and delete whats in that rtb.
Title: Re:Rich Text Box MnuLockChat
Post by: Mesiah / haiseM on April 23, 2003, 09:55 PM
or you could place all messages while a locked boolean is enabled, in an array, and when it becomes disabled, add the array items to the rtb, simple concept, more effecient than another rtb.
Title: Re:Rich Text Box MnuLockChat
Post by: Lobo on April 23, 2003, 11:24 PM
True
Title: Re:Rich Text Box MnuLockChat
Post by: Banana fanna fo fanna on April 24, 2003, 07:46 PM
LockWindowUpdate would work, except you can't scroll.

But it's the easiest way!
Title: Re:Rich Text Box MnuLockChat
Post by: JoeCool on July 08, 2003, 10:20 PM
dont u right click on the rich text box and go to properties? :D
Title: Re:Rich Text Box MnuLockChat
Post by: dxoigmn on July 08, 2003, 10:23 PM
Quote from: ______ on April 11, 2003, 03:24 PM
How would i lock chat on a pop up menu from a rich text box to read previous messages?

I think the best way to do this is how mIRC does it.  Basically, when the scroll bar is not at the bottom, it doesn't scroll at all.
Title: Re:Rich Text Box MnuLockChat
Post by: Camel on July 09, 2003, 01:53 PM
Quote from: kamakazie on July 08, 2003, 10:23 PMI think the best way to do this is how mIRC does it.  Basically, when the scroll bar is not at the bottom, it doesn't scroll at all.
Not only mIRC does that; it's AFAIK the standard and accepted solution.
Title: Re:Rich Text Box MnuLockChat
Post by: Camel on July 09, 2003, 05:26 PM
Took about 10 minutes to figgure this out with google's help. :)
Public Declare Function GetScrollRange Lib "user32" (ByVal hwnd As Long, ByVal nBar As Long, lpMinPos As Long, lpMaxPos As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Const EM_GETSCROLLPOS = WM_USER + 221
Public Const EM_SETSCROLLPOS = WM_USER + 222

Const SB_HORZ = 0
Const SB_VERT = 1
Const SB_BOTH = 3

Type POINT
   x As Long
   Y As Long
End Type

       Dim origstart As Long, origlen As Long
       origstart = IIf((Len(.Text) - .SelStart) > 10, .SelStart, 0)
       origlen = IIf(origstart = 0, 0, .SelLength)

       Dim srMin As Long, srMax As Long, myPoint As POINT, ShouldScroll As Boolean
       ShouldScroll = False
       
       GetScrollRange frmMain.txtChat.hwnd, SB_VERT, srMin, srMax
       SendMessage frmMain.txtChat.hwnd, EM_GETSCROLLPOS, 0, VarPtr(myPoint)
       myPoint.Y = myPoint.Y + 1 'i have no idea why this is needed, but it's always 1px too high
       
       If myPoint.Y >= srMax - (frmMain.txtChat.Height / 15) Then ShouldScroll = True

...

       .SelStart = IIf(origstart = 0, Len(.Text), origstart)
       .SelLength = origlen

       If ShouldScroll Then
           GetScrollRange frmMain.txtChat.hwnd, SB_VERT, srMin, srMax
           myPoint.x = 0
           myPoint.Y = srMax - (frmMain.txtChat.Height / 15)
           SendMessage frmMain.txtChat.hwnd, EM_SETSCROLLPOS, 0, VarPtr(myPoint)
       Else
           SendMessage frmMain.txtChat.hwnd, EM_SETSCROLLPOS, 0, VarPtr(myPoint)
       End If
Title: Re:Rich Text Box MnuLockChat
Post by: CupHead on July 09, 2003, 05:48 PM
Actually you should use the GetScrollInfo API call.  GetScrollRange and GetScrollPos are provided for backwards compatibility.  GetScrollInfo provides a handy structure into which you can load all of the information you want.  Also, the example you posted is ridiculously complex, which leads me to believe it is not your code (though creation was left ambiguous).  A much simpler way would be to use GetScrollPos rather than those ridiculous SendMessage calls.  (GetScrollPos' functionality is contained in GetScrollInfo as well.)
Title: Re:Rich Text Box MnuLockChat
Post by: Zorm on July 09, 2003, 06:23 PM
While looking at that code it appears that the richedit box will still end up scrolling to the bottom and then back up? Has anyone found a way to stop it from scrolling?
Title: Re:Rich Text Box MnuLockChat
Post by: Noodlez on July 09, 2003, 07:36 PM
Yea, zorm, just check if the scrollbar is not at the bottom. If it isn't, prevent your AddText function from scrolling.
Title: Re:Rich Text Box MnuLockChat
Post by: Camel on July 09, 2003, 08:25 PM
CupHead, yes it is my code. The reason it is complex is because it compensates for the selection being moved: The easiest way in vb to add text to an RTB is to move the selection to the end and modify the .SelColor and .SelText properties. If you cover up that code, it's really not that bad.

Zorm, you would have to not use the aforementioned method to add text to the box. Just set the .visible property of the box to false before and true after modifying the text and it wont flicker. If you're trying to avoid that entirely, you'll probably have to get into writing RTFed text directly to the box.
Title: Re:Rich Text Box MnuLockChat
Post by: dxoigmn on July 09, 2003, 10:45 PM
Or you can do some fun subclassing in VB to stop it from scrolling!   :-\
Title: Re:Rich Text Box MnuLockChat
Post by: CupHead on July 10, 2003, 07:39 AM
I'm curious as to what you mean by "the selection being moved".
Title: Re:Rich Text Box MnuLockChat
Post by: Camel on July 10, 2003, 11:25 AM
Quote from: CupHead on July 10, 2003, 07:39 AM
I'm curious as to what you mean by "the selection being moved".

           .SelStart = Len(.Text)
           .SelColor = ColTimestamp
           .SelText = "[" & Date & " " & Time & "] "