按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
xor eax;eax
ret
_ProcWinMain endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
local @hAccelerator;@hRichEdit
invoke LoadLibrary;offset szDllEdit
mov @hRichEdit;eax
invoke GetModuleHandle;NULL
mov hInstance;eax
invoke LoadMenu;hInstance;IDM_MAIN
mov hMenu;eax
invoke LoadAccelerators;hInstance;IDA_MAIN
mov @hAccelerator;eax
;********************************************************************
; 注册窗口类
;********************************************************************
invoke RtlZeroMemory;addr @stWndClass;sizeof @stWndClass
invoke LoadIcon;hInstance;ICO_MAIN
mov @stWndClass。hIcon;eax
mov @stWndClass。hIconSm;eax
invoke LoadCursor;0;IDC_ARROW
mov @stWndClass。hCursor;eax
push hInstance
pop @stWndClass。hInstance
mov @stWndClass。cbSize;sizeof WNDCLASSEX
mov @stWndClass。style;CS_HREDRAW or CS_VREDRAW
mov @stWndClass。lpfnWndProc;offset _ProcWinMain
mov @stWndClass。hbrBackground;COLOR_BTNFACE+1
mov @stWndClass。lpszClassName;offset szClassName
invoke RegisterClassEx;addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx;NULL;
offset szClassName;offset szCaptionMain;
WS_OVERLAPPEDWINDOW;
CW_USEDEFAULT;CW_USEDEFAULT;700;500;
NULL;hMenu;hInstance;NULL
mov hWinMain;eax
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第9章 通用控件
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
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
#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
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
由于篇幅所限,例子中仅演示了最基本的功能,一些附加的功能并没有写进去,如没有“另存为”功能,也没有提供选择字体和颜色的对话框等,读者如果有兴趣的话,可以分析所附光盘的Chapter09Wordpad目录中的程序,这是一个完整得多的编辑器,界面中使用了工具栏和状态栏,但全部代码的长度有900多行,所以在书中并没有列出它的代码。
Richedit。asm程序中使用了一些第8章中介绍的通用对话框:当选择“打开”文件菜单的时候,使用GetOpenFileName显示一个“打开”文件对话框来供用户选择文件;另外,在选择“查找”菜单的时候,使用FindText函数显示一个“查找文本”对话框,所以在WM_CREATE消息中程序预先使用RegisterWindowMessage函数为“查找文本”对话框注册 FINDMSGSTRING消息。对于这些内容,读者可以参看第8章中的相关章节。
9。4。1 创建Richedit控件
1。 装入Richedit控件
由于Richedit控件存在于一个单独的DLL库文件中,所以在使用前也要显式地装入库文件,装入Richedit库文件并不使用InitmonControls之类的专用函数,一般使用通用的LoadLibrary函数来装入它,LoadLibrary函数的用法是:
invoke LoadLibrary;addr szDllName
mov hDllInstance;eax
函数返回装入DLL的模块实例句柄,当不再使用库文件的时候,需要使用FreeLibrary函数将库释放。当库被装入时,库中的初始化代码会注册Richedit控件的窗口类,这样就可以在程序中利用Richedit的类名来创建控件。例子程序的_WinMain子程序中是这样进行库的装入和释放工作的:
nst
szDllEdit db 'RichEd20。dll';0
。。。
de
invoke LoadLibrary;offset szDllEdit
mov @hRichEdit;eax
。。。
;主程序代码——创建窗口、消息循环等
。。。
invoke FreeLibrary;@hRichEdit
当使用不同版本的Richedit控件时,注意要装入的库文件名是不同的。例子中使用2。0版本或3。0版本,所以装入的是RichEd20。dll文件。
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第9章 通用控件
9。4 使用Richedit控件(6)
2。 创建Richedit控件
创建Richedit控件的工作一般在主窗口的WM_CREATE消息中完成,创建的办法是使用CreateWindowEx函数:
nst
szClassEdit db 'RichEdit20A';0
。。。
de
invoke CreateWindowEx;WS_EX_CLIENTEDGE;offset szClassEdit;NULL;
WS_CHILD OR WS_VISIBLE OR WS_VSCROLL OR WS_HSCROLL
OR ES_MULTILINE or ES_NOHIDESEL;
0;0;0;0;hWinMain;0;hInstance;NULL
mov hWinEdit;eax
注意类名使用上的区别:1。0版使用“RichEdit”,2。0和3。0版本的类名有两种,ANSI版本使用的类名是“RichEdit20A”,Unicode版本使用的类名是“RichEdit20W”,例子中使用的是ANSI版本。
Richedit控件可以使用的风格有3组:标准的窗口风格、Edit控件风格和Richedit控件特有的风格。
在Edit控件可以使用的风格中,可供Richedit控件使用的有:
● ES_MULTILINE——可以编辑多行文字。
● ES_AUTOHSCROLL和ES_AUTOVSCROLL——自动滚动。
● ES_NOHIDESEL——失去键盘输入焦点的时候仍然显示选择区域。
● ES_READONLY——只读属性。
● ES_CENTE