RichEdit 控件提供了一个更好的方案,它可以把这些消息通知父窗口。 为了注册得到通知消息,父窗口发送 EM_SETEVENTMASK 消息给 RichEdit 控件, 指定它对哪些消息感兴趣。 EM_SETEVENTMASK 具有以下的语法: EM_SETEVENTMASK wParam == 没有使用,必须为 0 。 lParam == 事件掩码值。他可以是以下表格里标志值的任意组合。 ENM_CHANGE发送 EN_CHANGE 通知ENM_CORRECTTEXT发送 EN_CORRECTTEXT 通知ENM_DRAGDROPDONE发送 EN_DRAGDROPDONE 通知ENM_DROPFILES发送 EN_DROPFILES 通知ENM_KEYEVENTS为键盘消息发送 EN_MSGFILTER 通知ENM_LINKRich Edit 2.0 或以后版本: 当鼠标在具有 CFE_LINK 风格的正文上面移过,而且执行了一个或几个鼠标动作时,就发送 EN_LINK 通知。ENM_MOUSEEVENTS为鼠标消息发送 EN_MSGFILTER 通知。ENM_OBJECTPOSITIONS发送 EN_OBJECTPOSITIONS 通知ENM_PROTECTED发送 EN_PROTECTED 通知ENM_REQUESTRESIZE发送 EN_REQUESTRESIZE 通知ENM_SCROLL发送 EN_HSCROLL 和 EN_VSCROLL 通知ENM_SCROLLEVENTS为鼠标滑轮发送 EN_MSGFILTER 通知。ENM_SELCHANGE发送 EN_SELCHANGE 通知ENM_UPDATE
发送 EN_UPDATE 通知 Rich Edit 2.0 和以后版本: 这个标志值会被忽略,而经常发送 EN_UPDATE 通知。然而如果 RichEdit 3.0 模拟 RichEdit 1.0的话,你必须使用这个标志值来发送 EN_UPDATE 通知
上面的所有通知都被做为 WM_NOTIFY 消息来发送:你必须检查 NMHDR 结构的 code 成员来得到通知消息。譬如,如果你想注册得到鼠标消息(也就是说, 你想提供一给上下文相关的弹出菜单), 你需要象下面这样做: invoke SendMessage,hwndRichEdit,EM_SETEVENTMASK,0,ENM_MOUSEEVENTS ..... ..... WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD ..... .... .elseif uMsg==WM_NOTIFY push esi mov esi,lParam assume esi:ptr NMHDR .if [esi].code==EN_MSGFILTER .... [ do something here] .... .endif pop esi
例子:
下面的例子是第33篇指南里的 IczEdit 的改进版。 它为程序增加了搜索/替换功能和加速键。同时它处理鼠标消息,点右键时会出现一个弹出菜单。 .386.model flat,stdcalloption casemap:noneinclude \masm32\include\windows.incinclude \masm32\include\user32.incinclude \masm32\include\comdlg32.incinclude \masm32\include\gdi32.incinclude \masm32\include\kernel32.incincludelib \masm32\lib\gdi32.libincludelib \masm32\lib\comdlg32.libincludelib \masm32\lib\user32.libincludelib \masm32\lib\kernel32.libWinMain proto :DWORD,:DWORD,:DWORD,:DWORD.constIDR_MAINMENU equ 101IDM_OPEN equ 40001IDM_SAVE equ 40002IDM_CLOSE equ 40003IDM_SAVEAS equ 40004IDM_EXIT equ 40005IDM_COPY equ 40006IDM_CUT equ 40007IDM_PASTE equ 40008IDM_DELETE equ 40009IDM_SELECTALL equ 40010IDM_OPTION equ 40011IDM_UNDO equ 40012IDM_REDO equ 40013IDD_OPTIONDLG equ 101IDC_BACKCOLORBOX equ 1000IDC_TEXTCOLORBOX equ 1001IDR_MAINACCEL equ 105IDD_FINDDLG equ 102IDD_GOTODLG equ 103IDD_REPLACEDLG equ 104IDC_FINDEDIT equ 1000IDC_MATCHCASE equ 1001IDC_REPLACEEDIT equ 1001IDC_WHOLEWORD equ 1002IDC_DOWN equ 1003IDC_UP equ 1004IDC_LINENO equ 1005IDM_FIND equ 40014IDM_FINDNEXT equ 40015IDM_REPLACE equ 40016IDM_GOTOLINE equ 40017IDM_FINDPREV equ 40018RichEditID equ 300.dataClassName db "IczEditClass",0AppName db "IczEdit version 2.0",0RichEditDLL db "riched20.dll",0RichEditClass db "RichEdit20A",0NoRichEdit db "Cannot find riched20.dll",0ASMFilterString db "ASM Source code (*.asm)",0,"*.asm",0 db "All Files (*.*)",0,"*.*",0,0OpenFileFail db "Cannot open the file",0WannaSave db "The data in the control is modified. Want to save it?",0FileOpened dd FALSEBackgroundColor dd 0FFFFFFh ; default to whiteTextColor dd 0 ; default to blackhSearch dd ? ; handle to the search/replace dialog boxhAccel dd ?.data?hInstance dd ?hRichEdit dd ?hwndRichEdit dd ?FileName db 256 dup(?)AlternateFileName db 256 dup(?)CustomColors dd 16 dup(?)FindBuffer db 256 dup(?)ReplaceBuffer db 256 dup(?)uFlags dd ?findtext FINDTEXTEX <>.codestart: mov byte ptr [FindBuffer],0 mov byte ptr [ReplaceBuffer],0 invoke GetModuleHandle, NULL mov hInstance,eax invoke LoadLibrary,addr RichEditDLL .if eax!=0 mov hRichEdit,eax invoke WinMain, hInstance,0,0, SW_SHOWDEFAULT invoke FreeLibrary,hRichEdit .else invoke MessageBox,0,
上一篇:DFCG破解入门第四课
下一篇:CuteFTP最新版V4.2.5build3.7.1官方简体中文版破解
|