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)

第09章 通用控件

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号