WIN32汇编语言教程:第09章 通用控件 · 9.4 使用Richedit控件(5)
invoke ShowWindow,hWinMain,SW_SHOWNORMAL invoke UpdateWindow,hWinMain ;******************************************************************** ; 消息循环 ;******************************************************************** .while TRUE invoke GetMessage,addr @stMsg,NULL,0,0 .break .if eax == 0 invoke TranslateAccelerator,hWinMain,\ @hAccelerator,addr @stMsg .if eax == 0 invoke TranslateMessage,addr @stMsg invoke DispatchMessage,addr @stMsg .endif .endw invoke FreeLibrary,@hRichEdit ret _WinMain endp ;#################################################################### start: call _WinMain invoke ExitProcess,NULL ;#################################################################### end start
程序的资源脚本文件Richedit.rc的内容如下:
//################################################################## #include <resource.h> //################################################################## #define ICO_MAIN 1000 #define IDA_MAIN 2000 //################################################################## #define IDM_MAIN 2000 #define IDM_OPEN 2101 #define IDM_SAVE 2102 #define IDM_EXIT 2103 #define IDM_UNDO 2201 #define IDM_REDO 2202 #define IDM_SELALL 2203 #define IDM_COPY 2204 #define IDM_CUT 2205 #define IDM_PASTE 2206 #define IDM_FIND 2207 #define IDM_FINDPREV 2208 #define IDM_FINDNEXT 2209 //################################################################## ICO_MAIN ICON "Main.ico" //################################################################## IDM_MAIN menu discardable BEGIN popup "文件(&F)" BEGIN menuitem "打开文件(&O)...\tCtrl+O", IDM_OPEN menuitem "保存文件(&S)\tCtrl+S", IDM_SAVE menuitem separator menuitem "退出(&X)", IDM_EXIT END popup "编辑(&E)" BEGIN menuitem "撤销(&Z)\tCtrl+Z", IDM_UNDO menuitem "重复(&Y)\tCtrl+Y", IDM_REDO menuitem separator menuitem "全选(&A)\tCtrl+A", IDM_SELALL menuitem "拷贝(&C)\tCtrl+C", IDM_COPY menuitem "剪切(&X)\tCtrl+X", IDM_CUT menuitem "粘贴(&V)\tCtrl+V", IDM_PASTE menuitem separator menuitem "查找(&F)...\tCtrl+F", IDM_FIND menuitem "查找上一个(&P)\tF2", IDM_FINDPREV menuitem "查找下一个(&N)\tF3", IDM_FINDNEXT END END //################################################################## IDA_MAIN accelerators BEGIN VK_F2, IDM_FINDPREV,VIRTKEY VK_F3, IDM_FINDNEXT,VIRTKEY "O", IDM_OPEN,VIRTKEY,CONTROL "S", IDM_SAVE,VIRTKEY,CONTROL "Z", IDM_UNDO,VIRTKEY,CONTROL "Y", IDM_REDO,VIRTKEY,CONTROL "A", IDM_SELALL,VIRTKEY,CONTROL "C", IDM_COPY,VIRTKEY,CONTROL "X", IDM_CUT,VIRTKEY,CONTROL "V", IDM_PASTE,VIRTKEY,CONTROL "F", IDM_FIND,VIRTKEY,CONTROL END //####################################################################
由于篇幅所限,例子中仅演示了最基本的功能,一些附加的功能并没有写进去,如没有“另存为”功能,也没有提供选择字体和颜色的对话框等,读者如果有兴趣的话,可以分析所附光盘的Chapter09\Wordpad目录中的程序,这是一个完整得多的编辑器,界面中使用了工具栏和状态栏,但全部代码的长度有900多行,所以在书中并没有列出它的代码。
Richedit.asm程序中使用了一些第08章中介绍的通用对话框:当选择“打开”文件菜单的时候,使用GetOpenFileName显示一个“打开”文件对话框来供用户选择文件;另外,在选择“查找”菜单的时候,使用FindText函数显示一个“查找文本”对话框,所以在WM_CREATE消息中程序预先使用RegisterWindowMessage函数为“查找文本”对话框注册 FINDMSGSTRING消息。对于这些内容,读者可以参看第08章中的相关章节。
9.4.1 创建Richedit控件
1. 装入Richedit控件
由于Richedit控件存在于一个单独的DLL库文件中,所以在使用前也要显式地装入库文件,装入Richedit库文件并不使用InitCommonControls之类的专用函数,一般使用通用的LoadLibrary函数来装入它,LoadLibrary函数的用法是:
invoke LoadLibrary,addr szDllName mov hDllInstance,eax
函数返回装入DLL的模块实例句柄,当不再使用库文件的时候,需要使用FreeLibrary函数将库释放。当库被装入时,库中的初始化代码会注册Richedit控件的窗口类,这样就可以在程序中利用Richedit的类名来创建控件。例子程序的_WinMain子程序中是这样进行库的装入和释放工作的:
.const szDllEdit db 'RichEd20.dll',0 ... .code invoke LoadLibrary,offset szDllEdit mov @hRichEdit,eax ... ;主程序代码——创建窗口、消息循环等 ... invoke FreeLibrary,@hRichEdit
当使用不同版本的Richedit控件时,注意要装入的库文件名是不同的。例子中使用2.0版本或3.0版本,所以装入的是RichEd20.dll文件。
上页:第09章 通用控件 · 9.4 使用Richedit控件(4) 下页:第09章 通用控件 · 9.4 使用Richedit控件(6)