Уведомления от RichEdit

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Уведомления от RichEdit

Сообщение Александр Дмитриев » 11.07.2007 (Ср) 10:23

Здравствуйте! Столкнулся тут с проблемой.
1. Создал RichEdit. Послал ему сообщение о том, чтоб посылал мне уведомления (например, EN_SELCHANGE - об изменении выделенной области). А RichEdit вместо этого при движении по нему мыши и при нажатии клавиш посылает мне уведомления EN_MSGFILTER (они действительно должны посылаться при этих событиях, но только если заранее об этом попросить). Причем от того, какое уведомление я его прошу мне посылать это не зависит. Изначально я хотел отлавливать EN_CORRECTTEXT (чтобы запретить изменения текста), но в MSDN сказано, что EN_CORRECTTEXT посылается только RichEdit'ом первой версии, поэтому решил попробовать другие уведомления. Но какую бы маску уведомлений я не ставил, приходят EN_MSGFILTER (кроме нулевой маски, естественно, при которой не приходит уведомлений).
2. В MSDN насчет EN_CORRECTTEXT написано что-то мне непонятное:
MSDN писал(а):The EN_CORRECTTEXT message notifies a rich edit control parent window that a SYV_CORRECT gesture occurred, giving the parent window a chance to cancel correcting the text. A rich edit control sends this notification message in the form of a WM_NOTIFY message.

Syntax

EN_CORRECTTEXT

WPARAM wParam
LPARAM lParam;


Parameters

wParam
The low-order word specifies rich edit control identifier. The high-order word specifies the notification message.
lParam
Pointer to an ENCORRECTTEXT structure specifying the selection to be corrected.
Что это за синтаксис? Это нестандартный синтаксис WM_NOTIFY? Ведь при WM_NOTIFY wParam - некий идентификатор посылающего уведомление контрола, а lParam - указатель на NMHDR. Как тогда в общем случае узнать, какое уведомление пришло?
Вот код, описывающий то, что я делаю:
Форма:
Код: Выделить всё
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
    (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" _
    (ByVal hLibModule As Long) As Long
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" _
    (ByVal dwExStyle As Long, ByVal lpClassName As String, _
    ByVal lpWindowName As String, ByVal dwStyle As Long, _
    ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
    ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, _
    ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
    lParam As Any) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Const WM_USER As Long = &H400

Const WS_VISIBLE As Long = &H10000000
Const WS_CHILD As Long = &H40000000
Const WS_VSCROLL As Long = &H200000
Const WS_HSCROLL = &H100000
Const WS_BORDER As Long = &H800000

Const ES_MULTILINE As Long = &H4

Const GWL_WNDPROC As Long = -4

Const EM_SETEVENTMASK As Long = (WM_USER + 69)

Const ENM_PROTECTED As Long = &H200000
Const ENM_CORRECTTEXT As Long = &H400000
Const ENM_LINK As Long = &H4000000
Const ENM_SELCHANGE As Long = &H80000

Private Sub Form_Load()
REDll = LoadLibrary("RichEd20.dll")
REWnd = CreateWindowEx(0, "RichEdit20A", "", _
    WS_VISIBLE Or ES_MULTILINE Or WS_CHILD Or WS_VSCROLL Or WS_BORDER, _
    0, 0, 150, 100, Me.hwnd, 0, App.hInstance, 0)
SendMessage REWnd, EM_SETEVENTMASK, 0, ENM_SELCHANGE
FRMProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)
REProc = SetWindowLong(REWnd, GWL_WNDPROC, AddressOf WndProc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
DestroyWindow REWnd
FreeLibrary REDll
End Sub
Модуль:
Код: Выделить всё
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
    (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
    ByVal wParam As Long, lParam As NMHDR) As Long

Type NMHDR
  hwndFrom As Long
  idFrom As Long
  code As Long
End Type

Const WM_NOTIFY As Long = &H4E

Const EN_MSGFILTER As Long = &H700
Const EN_PROTECTED As Long = &H704
Const EN_CORRECTTEXT As Long = &H705
Const EN_LINK As Long = &H70B
Const EN_SELCHANGE As Long = &H702

Global REWnd As Long, REDll As Long, FRMProc As Long, REProc As Long

Function WndProc(ByVal hwnd As Long, ByVal Message As Long, _
    ByVal wParam As Long, lParam As NMHDR) As Long
If hwnd = Form1.hwnd Then
  If (Message = WM_NOTIFY) Then
    Debug.Print CStr(Date) & " " & CStr(Time) _
        & " Пришло уведомление: " & CStr(lParam.code) & ". " _
        & "hWndFrom: " & CStr(lParam.hwndFrom) _
        & ", idFrom: " & CStr(lParam.idFrom) & ", RichEditWnd: " & REWnd
  End If
  WndProc = CallWindowProc(FRMProc, hwnd, Message, wParam, lParam)
End If
If hwnd = REWnd Then
  WndProc = CallWindowProc(REProc, hwnd, Message, wParam, lParam)
End If
End Function
При получении сообщения WM_NOTIFY прога пишет в отладочное окно информацию о поступающих уведомлениях. Они все оказываются 1792 (&H700, EN_MSGFILTER) и поступают при движениях мыши и нажатых клавишах.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.07.2007 (Ср) 10:52

Ещё один, блин :-(
"lParam As Any" замени на "ByVal lParam As Long"
Изображение

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 11.07.2007 (Ср) 11:32

Отлично. Всё заработало. Спасибо большое. :D Только вот насчет второго вопроса - как получать уведомления EN_CORRECTTEXT от RichEdit 1.0? Что это за синтаксис написан в MSDN? (Мне это уже не нужно, но все-равно интересно)


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Majestic-12 [Bot] и гости: 97

    TopList