爱爱小说网 > 其他电子书 > windows环境下32位汇编语言程序设计 >

第51章

windows环境下32位汇编语言程序设计-第51章

小说: windows环境下32位汇编语言程序设计 字数: 每页3500字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




                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_CENTER,ES_RIGHT和ES_LEFT——文本的对齐方式。

●   ES_WANTRETURN——允许用户按回车键插入新的行。

但下列Edit控件风格不能在Richedit控件中使用:

●   ES_LOWERCASE或ES_UPPERCASE——将控件中的文字全部转换成小写或大写。

●   ES_PASSWORD——将控件中的文字显示为密码方式(显示为星号)。

下面列出的是部分Richedit控件特有的风格:

●   ES_DISABLENOSCROLL——指定这个风格后,控件在不需要滚动条的时候(文字没有超出客户区大小)显示灰化状态的滚动条,而默认情况下,当不需要滚动条的时候,控件根本不会显示它。

●   ES_NOIME——禁止输入法(IME)操作,仅用于亚洲语言版本。

●   ES_SAVESEL——在失去键盘输入焦点的时候保存当前选择区域,默认状态下当控件在重新获得焦点的时候会将全部文本选中。

创建控件以后,需要发送EM_EXLIMITTEXT消息设置控件中能够容纳字符的总数,虽然Richedit控件中的文字长度可以支持到最大的文件尺寸,但默认情况下,控件还是将最大字符数限制为64 KB,所以如果读者发现Richedit控件也只能编辑64 KB字符的话,那并不是控件的错,而是没有告诉它具体的要求,EM_EXLIMITTEXT消息的使用方法是:

    invoke  SendMessage;hWinEdit;EM_EXLIMITTEXT;0;dwTextMax

其中dwTextMax指定了最大字符数。

9。4。2  Richedit控件的控制消息

1。 选择区域

选择区域就是用户在控件中通过拖动鼠标来选定的多个文字,选择了一段文字以后,用户以后的操作就是针对这段文字的,如按下Delete键可以删除整段文字,按Ctrl+C键将这段文字拷贝到剪贴板中,按Ctrl+V键用剪贴板中的内容替换这段文字等。

在程序中,选择区域可以被程序获取,也可以由程序自由设置,从编程角度来看,选择区域的用处有两个:

●   选定操作文本——与用户手工选定一段文本以便进行各种操作类似,程序在对文本进行操作之前也需要预先设置选择区域。

●   定位光标——控件中并没有专门的用来定位光标的控制消息,定位光标也是靠设置选择区域完成的。如果把选择区域的起始位置和结束位置设置为相同的,那么就相当于把光标定位到这个位置而不选定任何文字。

在Edit控件中,获取选择区域可以通过向控件发送EM_GETSEL消息:

    invoke  SendMessage;hRichedit;EM_GETSEL;lpdwStart;lpdwEnd

lpdwStart和lpdwEnd指向两个用来返回选定区域起始位置和结束位置的双字变量,也可以将这两个参数全部设置为NULL,因为消息的返回值也是位置数据,返回值的低16位是选定区域的起始位置,高16位是结束位置。

但是EM_GETSEL消息仅适用于控件中文本长度不超过64 KB的情况,如果Richedit中选择区域的起始位置或结束位置有一个落在了64 KB以外,那么消息仅返回?1,而不是正确的数值,所以最好还是使用EM_EXGETSEL消息,EM_EXGETSEL消息是Richedit的特有消息,不能在Edit控件中使用:

invoke  SendMessage;hRichedit;EM_EXGETSEL;0;lpchr

lpchr参数指向一个CHARRANGE结构,用来接收选择区域的起始和结束位置,该结构定义如下:

CHARRANGE STRUCT

    cpMin  DWORD      ?      ;选择区域的起始位置

    cpMax  DWORD      ?      ;选择区域的结束位置

CHARRANGE ENDS

如果cpMinx字段等于cpMax字段,表示选择区域的长度为0,而光标位于这个位置;如果cpMin等于0而cpMax等于?1,表示选定的是控件中的所有内容。

程序也可以通过发送对应的消息来设置选择区域:

invoke  SendMessage;hRichedit;EM_SETSEL;dwStart;dwEnd

    invoke  SendMessage;hRichedit;EM_EXSETSEL;0;lpchr

EM_SETSEL的参数中直接用dwStart和dwEnd指定选择区域的开始和结束位置,但是这个消息同样有64 KB长度的限制;EM_EXSETSEL消息没有这个限制,lpchr参数同样指向一个CHARRANGE结构,结构中包

返回目录 上一页 下一页 回到顶部 2 2

你可能喜欢的