Как скролить текст в RichTextBox'е, если фокус не на нём

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Как скролить текст в RichTextBox'е, если фокус не на нём

Сообщение Ruslan Demidow » 21.05.2004 (Пт) 10:13

Здравствуйте все. Сабж собственно.
У контрола RTB свойства или метода scroll нету. (или плохо искал?)
В программе на форме лежит список писем (TreeView) и текст текущего письма (RichTextBox).
Хочется чтобы при нахождении фокуса на списке писем при нажатии стрелки влево (возможно другое клавиатурное сокращение) скролился текст письма (без перехода фокуса).
Иногда текст письма не весь помещается в контрол, поэтому приходится жать TAB для перехода фокуса в текст письма, после этого скролить текст, после прочтения текста приходится по SHIFT-ТАВ'у опять назад возвращаться в список писем и по новой.
А моя задумка поможет юзеру избавиться от лишних движений мышью или ТАВом.

ChelDm
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 112
Зарегистрирован: 14.02.2004 (Сб) 14:56

Сообщение ChelDm » 21.05.2004 (Пт) 10:54

Пожет я и ошибаюсь, но вроде должно быть Richtextbox1.setfocus

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.05.2004 (Пт) 11:06

Да не нужен ему SetFocus.

Помоему сообщение так и называется, WM_SCROLL, точно не помню. Отсылаешь сообшение через SendMessage на RTB и скроллишь.
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 21.05.2004 (Пт) 11:43

alibek писал(а):Да не нужен ему SetFocus.

Помоему сообщение так и называется, WM_SCROLL, точно не помню. Отсылаешь сообшение через SendMessage на RTB и скроллишь.

А какое из этих?
Код: Выделить всё
Private Declare Function SendDlgItemMessage Lib "user32.dll" Alias "SendDlgItemMessageA" ( _
    ByVal hDlg As Long, _
    ByVal nIDDlgItem As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByRef lParam As Any) As Long


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.05.2004 (Пт) 11:55

Посмотри в MSDN Q147887 (скроллинг в TextBox, в RTB аналогично). А вот описание EM_SCROLL и EM_LINESCROLL.
EM_LINESCROLL
Edit controls: The EM_LINESCROLL message scrolls the text vertically or horizontally in a multiline edit control.

Rich edit controls: The EM_LINESCROLL message scrolls the text vertically in a multiline edit control.

Код: Выделить всё
EM_LINESCROLL
wParam = (WPARAM) cxScroll; // characters to scroll horizontally
lParam = (LPARAM) cyScroll; // lines to scroll vertically

Parameters
cxScroll
Edit controls: Value of wParam. Specifies the number of characters to scroll horizontally.
Rich edit controls: This parameter is not used; it must be zero.

cyScroll
Value of lParam. Specifies the number of lines to scroll vertically.
Return Values
If the message is sent to a multiline edit control, the return value is TRUE.

If the message is sent to a single-line edit control, the return value is FALSE.

Remarks
The edit control does not scroll vertically past the last line of text in the edit control. If the current line plus the number of lines specified by the cyScroll parameter exceeds the total number of lines in the edit control, the value is adjusted so that the last line of the edit control is scrolled to the top of the edit-control window.

Edit controls: The EM_LINESCROLL message can be used to scroll horizontally past the last character of any line.

QuickInfo for rich edit controls: The EM_LINESCROLL message is supported in Rich Edit 1.0 and later. For information about the compatibility of rich edit versions with the various system versions, see About Rich Edit Controls.


EM_SCROLL
The EM_SCROLL message scrolls the text vertically in a multiline edit control. This message is equivalent to sending a WM_VSCROLL message to the edit control. You can send this message to either an edit control or a rich edit control.

Код: Выделить всё
EM_SCROLL
wParam = (WPARAM) (INT) nScroll;    // scroll action
lParam = 0;                         // not used; must be zero

Parameters
nScroll
Value of wParam. Specifies the action the scroll bar is to take. This parameter may be one of the following values. Value Meaning
SB_LINEDOWN Scrolls down one line.
SB_LINEUP Scrolls up one line.
SB_PAGEDOWN Scrolls down one page.
SB_PAGEUP Scrolls up one page.


Return Values
If the message is successful, the high-order word of the return value is TRUE, and the low-order word is the number of lines that the command scrolls. The number returned may not be the same as the actual number of lines scrolled if the scrolling moves to the beginning or the end of the text. If the nScroll parameter specifies an invalid value, the return value is FALSE.

Remarks
To scroll to a specific line or character position, use the EM_LINESCROLL message.

To scroll the caret into view, use the EM_SCROLLCARET message.

Remarks
QuickInfo for rich edit controls: The EM_SCROLL message is supported in Rich Edit 1.0 and later. For information about the compatibility of rich edit versions with the various system versions, see About Rich Edit Controls.


З.Ы. Разумеется SendMessage
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 21.05.2004 (Пт) 12:10

Спасибо БОЛЬШОЕ Вам: Alibek и ChelDM.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 21.05.2004 (Пт) 12:44

Да, вот ещё вопрос:
Если текущее сообщение последнее в ветке - тогда этот код отрабатывает нормально:
Код: Выделить всё
Case vbKeyLeft
    SendMessage Me.MsgTextBox.hwnd, WM_VSCROLL, SB_LINEUP, 0
Case vbKeyRight
    SendMessage Me.MsgTextBox.hwnd, WM_VSCROLL, SB_LINEDOWN, 0

Если не последнее то - TreeView перехватывает сообщения и отрабатывает их на себе.
Сообщения пробовал посылать и при обработке события MailList_KeyDown и при обработке события Form_KeyDown.
Результат одинаков.
Как этого не допустить.

ЗЫЖ Если вместо WM_VSCROLL использовать EM_LINESCROLL, то тогда происходит скачок на последнюю строку текста.
[/code]


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 3

    TopList