1. Создал RichEdit. Послал ему сообщение о том, чтоб посылал мне уведомления (например, EN_SELCHANGE - об изменении выделенной области). А RichEdit вместо этого при движении по нему мыши и при нажатии клавиш посылает мне уведомления EN_MSGFILTER (они действительно должны посылаться при этих событиях, но только если заранее об этом попросить). Причем от того, какое уведомление я его прошу мне посылать это не зависит. Изначально я хотел отлавливать EN_CORRECTTEXT (чтобы запретить изменения текста), но в MSDN сказано, что EN_CORRECTTEXT посылается только RichEdit'ом первой версии, поэтому решил попробовать другие уведомления. Но какую бы маску уведомлений я не ставил, приходят EN_MSGFILTER (кроме нулевой маски, естественно, при которой не приходит уведомлений).
2. В MSDN насчет EN_CORRECTTEXT написано что-то мне непонятное:
Что это за синтаксис? Это нестандартный синтаксис WM_NOTIFY? Ведь при WM_NOTIFY wParam - некий идентификатор посылающего уведомление контрола, а lParam - указатель на NMHDR. Как тогда в общем случае узнать, какое уведомление пришло?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.
Вот код, описывающий то, что я делаю:
Форма:
- Код: Выделить всё
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