كيفية اكتشاف ما إذا كان شريط التمرير أو لم يكن في نهاية مربع RichText (vb.net)
-
19-08-2019 - |
سؤال
سؤالي هو كما هو: كيف تكتشف ما إذا كان شريط التمرير في أو لا في نهاية صندوق recktext؟
تحرير: عندما أقول في النهاية أعني تم التمرير تمامًا إلى القاع ، وليس في أي مكان آخر.
المحلول
تفحص ال GetScrollRange
و GetScrollPos
API ...
Private Const SBS_HORZ = 0
Private Const SBS_VERT = 1
<DllImport("user32.dll")> _
Public Function GetScrollRange(ByVal hWnd As IntPtr, ByVal nBar As Integer, _
ByRef lpMinPos As Integer, _
ByRef lpMaxPos As Integer) As Boolean
End Function
<DllImport("user32.dll")> _
Public Function GetScrollPos(ByVal hWnd As Integer, _
ByVal nBar As Integer) As Integer
End Function
// ...
Dim scrollMin as Integer = 0
Dim scrollMax as Integer = 0
If(GetScrollRange(rtb.Handle, SBS_VERT, scrollMin, scrollMax) Then
Dim pos as Integer = GetScrollPos(rtb.Handle, SBS_VERT)
// Detect if they're at the bottom
EndIf
ملحوظات:
لتحديد ما إذا كان شريط التمرير مرئيًا ، اتصل GetWindowLong
والتحقق من WS_VSCROLL
لتحديد القيمة الأقصى التي يمكن أن تحصل عليها شريط التمرير ، اتصل GetScrollInfo
; ؛ أعتقد أن القيمة القصوى هي
scrollMax - largeChange + 1
نصائح أخرى
لقد استخدمت هذا الرمز للحصول على المواضع الحالية والحد الأقصى بشكل صحيح:
const int SB_HORZ = 0x0000;
const int SB_VERT = 0x0001;
const int WM_HSCROLL = 0x0114;
const int WM_VSCROLL = 0x0115;
const int SB_THUMBPOSITION = 4;
private enum ScrollInfoMask : uint
{
SIF_RANGE = 0x1,
SIF_PAGE = 0x2,
SIF_POS = 0x4,
SIF_DISABLENOSCROLL = 0x8,
SIF_TRACKPOS = 0x10,
SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)
}
[StructLayout(LayoutKind.Sequential)]
struct SCROLLINFO
{
public uint cbSize;
public uint fMask;
public int nMin;
public int nMax;
public uint nPage;
public int nPos;
public int nTrackPos;
}
public int HScrollPosition
{
get
{
return GetScrollPos(Handle, SB_HORZ);
}
set
{
SetScrollPos((IntPtr)Handle, SB_HORZ, value, true);
PostMessageA((IntPtr)Handle, WM_HSCROLL, SB_THUMBPOSITION + 0x10000 * value, 0);
}
}
public int VScrollPosition
{
get
{
return GetScrollPos(Handle, SB_VERT);
}
set
{
SetScrollPos((IntPtr)Handle, SB_VERT, value, true);
PostMessageA((IntPtr)Handle, WM_VSCROLL, SB_THUMBPOSITION + 0x10000 * value, 0);
}
}
public int HScrollPositionMax
{
get
{
SCROLLINFO scrollInfo = new SCROLLINFO();
scrollInfo.fMask = (uint)ScrollInfoMask.SIF_ALL;
scrollInfo.cbSize = (uint)Marshal.SizeOf(scrollInfo);
GetScrollInfo(Handle, SB_HORZ, ref scrollInfo);
return scrollInfo.nMax - (int)scrollInfo.nPage;
}
}
public int VScrollPositionMax
{
get
{
SCROLLINFO scrollInfo = new SCROLLINFO();
scrollInfo.fMask = (uint)ScrollInfoMask.SIF_ALL;
scrollInfo.cbSize = (uint)Marshal.SizeOf(scrollInfo);
GetScrollInfo(Handle, SB_VERT, ref scrollInfo);
return scrollInfo.nMax - (int)scrollInfo.nPage;
}
}
من الممل الحصول على القيمة القصوى "الصحيحة". يجب عليك التغلب على قيمة NPAGE (تغيير كبير) لإرجاع GetScrollrange القيمة الأقصى ، ثم يمكنك مقارنتها باستخدام خاصية HSCrollPosition بشكل صحيح ، مثل:
if (_rtb.VScrollPosition == _rtb.VScrollPositionMax)
{
Debug.WriteLine("Scroll is at the bottom most edge");
}
if (richTextBox1.Size.Width - richTextBox1.ClientSize.Width > 10)
آسف ، يجب عليك تحويل ذلك إلى VB.NET بنفسك. لا ينبغي أن يكون صعبا جدا :)
طريقة واحدة هي استخدام وظيفة getScrollPos. إليك نوعًا من مثال طويل على ذلك باستخدام vb.net.
http://www.codeproject.com/kb/vb/vbnetscrolling.aspx؟print=true