当前位置:中国易下载软件教材中心文章中心编程语言汇编语言 → 汇编语言教学(11)

汇编语言教学(11)

减小字体 增大字体 作者:佚名  来源:不详  发布时间:2007-8-21 1:04:08
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
喜欢这些内容嘛,请告诉你身边的朋友,易下载中心-QQ资源-itnetcn.com一起享受这份乐趣,本站内容来源互联网
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

第十一课 进一步学习对话框NvB海岸线网络安全资讯站
本课中我们将进一步学习对话框。特别地我们将要探讨如何把对话框当成输入设备。如果您学习了上一课,那就会发现本课的例子只有少量的改动,就是把我们的对话框窗口附属到主窗口上。另外,我们还要学习通用对话框的用法。 NvB海岸线网络安全资讯站
理论:NvB海岸线网络安全资讯站
把对话框当成一个输入设备来用确实是非常地简单,创建完主窗口后,您只要调用函数 CreatedialogParam 或 DialogBoxParam 就可以了,前一个函数只要在对话框的过程处理函数中处理相关的消息就可以,而后者你必须在消息循环段中插入函数 IsDialogMessage 的调用让它来处理键盘的按键逻辑。因为这两个程序段相对来说比较容易,我们就不详解。您可以下载并仔细研究NvB海岸线网络安全资讯站
下面我们来讨论通用对话框。WINDOWS已经为您准备好了预定义的对话框类,您可以拿来就用,这些通用对话框提供给用户以统一的界面。它们包括:打开文件、打印、选择颜色、字体和搜索等。您应该尽可能地用它们。处理这些对话框的代码在comdlg32.dll中,为了在您的应用程序中使用它们,就必须在链接阶段链接库文件 comdlg32.lib。然后调用其中的相关函数即可。对于打开文件通用对话框,该函数名为 GetOpenFileName,"保存为..."对话框为 GetSaveFileName,打印通用对话框是 PrintDlg, 等等。每一个这样的函数都接收一个指向一个结构体的指针的参数,您可以参考WIN32 API手册得到详细的资料,本课中我将讲解创建和使用打开文件对话框。NvB海岸线网络安全资讯站
下面是打开对话框函数 GetOpenFileName 的原型: NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
GetOpenFileName proto lpofn:DWORDNvB海岸线网络安全资讯站
您可以看到,该函数只有一个参数,即指向结构体OPENFILENAME的指针。当用户选择了一个文件并打开,该函数返回TRUE,否则返回FALSE。接下来我们看看结构体OPENFILENAME的定义: NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
OPENFILENAME STRUCT NvB海岸线网络安全资讯站
lStructSize DWORD ? NvB海岸线网络安全资讯站
hwndOwner HWND ? NvB海岸线网络安全资讯站
hInstance HINSTANCE ? NvB海岸线网络安全资讯站
lpstrFilter LPCSTR ? NvB海岸线网络安全资讯站
lpstrCustomFilter LPSTR ? NvB海岸线网络安全资讯站
nMaxCustFilter DWORD ? NvB海岸线网络安全资讯站
nFilterIndex DWORD ? NvB海岸线网络安全资讯站
lpstrFile LPSTR ? NvB海岸线网络安全资讯站
nMaxFile DWORD ? NvB海岸线网络安全资讯站
lpstrFiletitle LPSTR ? NvB海岸线网络安全资讯站
nMaxFiletitle DWORD ? NvB海岸线网络安全资讯站
lpstrInitialDir LPCSTR ? NvB海岸线网络安全资讯站
lpstrtitle LPCSTR ? NvB海岸线网络安全资讯站
Flags DWORD ? NvB海岸线网络安全资讯站
nFileOffset WORD ? NvB海岸线网络安全资讯站
nFileExtension WORD ? NvB海岸线网络安全资讯站
lpstrDefExt LPCSTR ? NvB海岸线网络安全资讯站
lCustData LPARAM ? NvB海岸线网络安全资讯站
lpfnHook DWORD ? NvB海岸线网络安全资讯站
lpTemplateName LPCSTR ?NvB海岸线网络安全资讯站
OPENFILENAME ENDSNvB海岸线网络安全资讯站
好,我们再来看看该结构体中常用的成员的意义:NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
lStructSize 结构体OPENFILENAME的大小。 NvB海岸线网络安全资讯站
hwndOwner 拥有打开对话框的窗口的句柄。 NvB海岸线网络安全资讯站
hInstance 拥有该打开文件对话框的应用程序的实例句柄 。 NvB海岸线网络安全资讯站
lpstrFilter 以NULL结尾的一个或多个通配符。通配符是成对出现的,前一部分是描述部分,后一部分则是通配符的格式,譬如: NvB海岸线网络安全资讯站
FilterString db "All Files (*.*)",0, "*.*",0 NvB海岸线网络安全资讯站
db "Text Files (*.txt)",0,"*.txt",0,0 NvB海岸线网络安全资讯站
注意:只有每一对中的第二部分是WINDOWS用来过滤所需选择的文件的,另外您必须在该部分后放置一个0,以示字符串的结束。NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
nFilterIndex 用来指定打开文件对话框第一次打开时所用的过滤模式串,该索引是从1开始算的,即第一个通配符模式的索引是1,第二个是2,譬如上面的例子中,若指定该值为2,则缺省显示的模式串就是"*.txt"。 NvB海岸线网络安全资讯站
lpstrFile 需要打开的文件的名称的地址,该名称将会出现在打开文件对话框的编辑控件中,该缓冲区不能超过260个字符长,当用户打开文件后,该缓冲区中包含该文件的全路径名,您可以从该缓冲区中抽取您所需要的路径或文件名等信息。 NvB海岸线网络安全资讯站
nMaxFile lpstrFile的大小。 NvB海岸线网络安全资讯站
lpstrtitle 指向对话框标题的字符串。 NvB海岸线网络安全资讯站
Flags 该标志决定决定了对话框的风格和特点。 NvB海岸线网络安全资讯站
nFileOffset 在用户打开了一个文件后该值是全路径名称中指向文件名第一个字符的索引。譬如:若全路径名为"c:\windows\system\lz32.dll", 则该值为18。 NvB海岸线网络安全资讯站
nFileExtension 在用户打开了一个文件后该值是全路径名称中指向个文件扩展名第一个字符的索引。 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
例子:NvB海岸线网络安全资讯站
下例中,我们演示了当用户选择"File->Open"时,将弹出一个打开文件对话框,当用户选择了某个文件打开时,会弹出一个对话框,告知要打开的文件的全路径名,文件名和文件扩展名。 NvB海岸线网络安全资讯站
.386 NvB海岸线网络安全资讯站
.model flat,stdcall NvB海岸线网络安全资讯站
option casemap:none NvB海岸线网络安全资讯站
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD NvB海岸线网络安全资讯站
include \masm32\include\windows.inc NvB海岸线网络安全资讯站
include \masm32\include\user32.inc NvB海岸线网络安全资讯站
include \masm32\include\kernel32.inc NvB海岸线网络安全资讯站
include \masm32\include\comdlg32.inc NvB海岸线网络安全资讯站
includelib \masm32\lib\user32.lib NvB海岸线网络安全资讯站
includelib \masm32\lib\kernel32.lib NvB海岸线网络安全资讯站
includelib \masm32\lib\comdlg32.lib NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
.const NvB海岸线网络安全资讯站
IDM_OPEN equ 1 NvB海岸线网络安全资讯站
IDM_EXIT equ 2 NvB海岸线网络安全资讯站
MAXSIZE equ 260 NvB海岸线网络安全资讯站
OUTPUTSIZE equ 512 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
.data NvB海岸线网络安全资讯站
ClassName db "SimpleWinClass",0 NvB海岸线网络安全资讯站
AppName db "Our Main Window",0 NvB海岸线网络安全资讯站
MenuName db "FirstMenu",0 NvB海岸线网络安全资讯站
ofn OPENFILENAME <> NvB海岸线网络安全资讯站
FilterString db "All Files",0,"*.*",0 NvB海岸线网络安全资讯站
db "Text Files",0,"*.txt",0,0 NvB海岸线网络安全资讯站
buffer db MAXSIZE dup(0) NvB海岸线网络安全资讯站
Ourtitle db "-=Our First Open File Dialog Box=-: Choose the file to open",0 NvB海岸线网络安全资讯站
FullPathName db "The Full Filename with Path is: ",0 NvB海岸线网络安全资讯站
FullName db "The Filename is: ",0 NvB海岸线网络安全资讯站
ExtensionName db "The Extension is: ",0 NvB海岸线网络安全资讯站
OutputString db OUTPUTSIZE dup(0) NvB海岸线网络安全资讯站
CrLf db 0Dh,0Ah,0 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
.data? NvB海岸线网络安全资讯站
hInstance HINSTANCE ? NvB海岸线网络安全资讯站
CommandLine LPSTR ? NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
.code NvB海岸线网络安全资讯站
start: NvB海岸线网络安全资讯站
invoke GetModuleHandle, NULL NvB海岸线网络安全资讯站
mov hInstance,eax NvB海岸线网络安全资讯站
invoke GetCommandLineNvB海岸线网络安全资讯站
mov CommandLine,eax NvB海岸线网络安全资讯站
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT NvB海岸线网络安全资讯站
invoke ExitProcess,eax NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD NvB海岸线网络安全资讯站
LOCAL wc:WNDCLASSEX NvB海岸线网络安全资讯站
LOCAL msg:MSG NvB海岸线网络安全资讯站
LOCAL hwnd:HWND NvB海岸线网络安全资讯站
mov wc.cbSize,SIZEOF WNDCLASSEX NvB海岸线网络安全资讯站
mov wc.style, CS_HREDRAW or CS_VREDRAW NvB海岸线网络安全资讯站
mov wc.lpfnWndProc, OFFSET WndProc NvB海岸线网络安全资讯站
mov wc.cbClsExtra,NULL NvB海岸线网络安全资讯站
mov wc.cbWndExtra,NULL NvB海岸线网络安全资讯站
push hInst NvB海岸线网络安全资讯站
pop wc.hInstance NvB海岸线网络安全资讯站
mov wc.hbrBackground,COLOR_WINDOW+1 NvB海岸线网络安全资讯站
mov wc.lpszMenuName,OFFSET MenuName NvB海岸线网络安全资讯站
mov wc.lpszClassName,OFFSET ClassName NvB海岸线网络安全资讯站
invoke LoadIcon,NULL,IDI_APPLICATION NvB海岸线网络安全资讯站
mov wc.hIcon,eax NvB海岸线网络安全资讯站
mov wc.hIconSm,eax NvB海岸线网络安全资讯站
invoke LoadCursor,NULL,IDC_ARROW NvB海岸线网络安全资讯站
mov wc.hCursor,eax NvB海岸线网络安全资讯站
invoke RegisterClassEx, addr wc NvB海岸线网络安全资讯站
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\ NvB海岸线网络安全资讯站
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ NvB海岸线网络安全资讯站
CW_USEDEFAULT,300,200,NULL,NULL,\ NvB海岸线网络安全资讯站
hInst,NULL NvB海岸线网络安全资讯站
mov hwnd,eax NvB海岸线网络安全资讯站
invoke ShowWindow, hwnd,SW_SHOWNORMAL NvB海岸线网络安全资讯站
invoke UpdateWindow, hwnd NvB海岸线网络安全资讯站
.WHILE TRUE NvB海岸线网络安全资讯站
invoke GetMessage, ADDR msg,NULL,0,0 NvB海岸线网络安全资讯站
.BREAK .IF (!eax) NvB海岸线网络安全资讯站
invoke TranslateMessage, ADDR msg NvB海岸线网络安全资讯站
invoke DispatchMessage, ADDR msg NvB海岸线网络安全资讯站
.ENDW NvB海岸线网络安全资讯站
mov eax,msg.wParam NvB海岸线网络安全资讯站
ret NvB海岸线网络安全资讯站
WinMain endp NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM NvB海岸线网络安全资讯站
.IF uMsg==WM_DESTROY NvB海岸线网络安全资讯站
invoke PostQuitMessage,NULL NvB海岸线网络安全资讯站
.ELSEIF uMsg==WM_COMMAND NvB海岸线网络安全资讯站
mov eax,wParam NvB海岸线网络安全资讯站
.if ax==IDM_OPEN NvB海岸线网络安全资讯站
mov ofn.lStructSize,SIZEOF ofn NvB海岸线网络安全资讯站
push hWnd NvB海岸线网络安全资讯站
pop ofn.hwndOwner NvB海岸线网络安全资讯站
push hInstance NvB海岸线网络安全资讯站
pop ofn.hInstance NvB海岸线网络安全资讯站
mov ofn.lpstrFilter, OFFSET FilterString NvB海岸线网络安全资讯站
mov ofn.lpstrFile, OFFSET buffer NvB海岸线网络安全资讯站
mov ofn.nMaxFile,MAXSIZE NvB海岸线网络安全资讯站
mov ofn.Flags, OFN_FILEMUSTEXIST or \ NvB海岸线网络安全资讯站
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\ NvB海岸线网络安全资讯站
OFN_EXPLORER or OFN_HIDEREADONLY NvB海岸线网络安全资讯站
mov ofn.lpstrtitle, OFFSET Ourtitle NvB海岸线网络安全资讯站
invoke GetOpenFileName, ADDR ofn NvB海岸线网络安全资讯站
.if eax==TRUE NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,OFFSET FullPathName NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,ofn.lpstrFile NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,offset CrLf NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,offset FullName NvB海岸线网络安全资讯站
mov eax,ofn.lpstrFile NvB海岸线网络安全资讯站
push ebx NvB海岸线网络安全资讯站
xor ebx,ebx NvB海岸线网络安全资讯站
mov bx,ofn.nFileOffset NvB海岸线网络安全资讯站
add eax,ebx NvB海岸线网络安全资讯站
pop ebx NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,eax NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,offset CrLf NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,offset ExtensionName NvB海岸线网络安全资讯站
mov eax,ofn.lpstrFile NvB海岸线网络安全资讯站
push ebx NvB海岸线网络安全资讯站
xor ebx,ebx NvB海岸线网络安全资讯站
mov bx,ofn.nFileExtension NvB海岸线网络安全资讯站
add eax,ebx NvB海岸线网络安全资讯站
pop ebx NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,eax NvB海岸线网络安全资讯站
invoke MessageBox,hWnd,OFFSET OutputString,ADDR AppName,MB_OK NvB海岸线网络安全资讯站
invoke RtlZeroMemory,offset OutputString,OUTPUTSIZE NvB海岸线网络安全资讯站
.endif NvB海岸线网络安全资讯站
.else NvB海岸线网络安全资讯站
invoke DestroyWindow, hWnd NvB海岸线网络安全资讯站
.endif NvB海岸线网络安全资讯站
.ELSE NvB海岸线网络安全资讯站
invoke DefWindowProc,hWnd,uMsg,wParam,lParam NvB海岸线网络安全资讯站
ret NvB海岸线网络安全资讯站
.ENDIF NvB海岸线网络安全资讯站
xor eax,eax NvB海岸线网络安全资讯站
ret NvB海岸线网络安全资讯站
WndProc endp NvB海岸线网络安全资讯站
end start NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
--------------------------------------------------------------------------------NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
分析:NvB海岸线网络安全资讯站
mov ofn.lStructSize,SIZEOF ofn NvB海岸线网络安全资讯站
push hWnd NvB海岸线网络安全资讯站
pop ofn.hwndOwner NvB海岸线网络安全资讯站
push hInstance NvB海岸线网络安全资讯站
pop ofn.hInstance NvB海岸线网络安全资讯站
我们在此填充结构体OPENFILENAME变量ofn的有关成员。 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
mov ofn.lpstrFilter, OFFSET FilterString NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
这里FilterString 是文件过滤模式的字符串地址,我们指定的过滤模式字符串如下: NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
FilterString db "All Files",0,"*.*",0 NvB海岸线网络安全资讯站
db "Text Files",0,"*.txt",0,0NvB海岸线网络安全资讯站
注意:所有的模式串都是配对的,前一个是描述,后一个才是真正的模式,次处"*.*"和"*.txt"是WIONDOWS用来寻找匹配的欲打开的文件的。我们当能可以指定任何模式,但是不要忘记在结尾处加0以代表字符串已结束,否则您的对话框在操作时可能不稳定。 NvB海岸线网络安全资讯站
mov ofn.lpstrFile, OFFSET buffer NvB海岸线网络安全资讯站
mov ofn.nMaxFile,MAXSIZE NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
这里是把缓冲区的地址放到结构体中,同时必须设定大小。以后我们可以随意编辑在该缓冲区中返回的信息。 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
mov ofn.Flags, OFN_FILEMUSTEXIST or \ NvB海岸线网络安全资讯站
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\ NvB海岸线网络安全资讯站
OFN_EXPLORER or OFN_HIDEREADONLY NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
Flags 中放入的是对话框的风格和特性值。NvB海岸线网络安全资讯站
其中OFN_FILEMUSTEXIST和 OFN_PATHMUSTEXIST要求用户在打开对话框的编辑控件中输入的文件名或路径名必须存在。NvB海岸线网络安全资讯站
OFN_LONGNAMES 告诉对话框显示长文件名。 NvB海岸线网络安全资讯站
OFN_EXPLORER 告诉WINDOWS对话框的外观必须类似资源管理器。NvB海岸线网络安全资讯站
OFN_HIDEREADONLY 指定不要显示只读文件(既使它的扩展名符合过滤模式)。 NvB海岸线网络安全资讯站
除此之外,还有许多其它的标志位,您可以参考有关WIN32 API手册。 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
mov ofn.lpstrtitle, OFFSET Ourtitle NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
指定打开文件对话框的标题名。 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
invoke GetOpenFileName, ADDR ofn NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
调用GetOpenFileName函数,并传入指向结构体ofn的指针。 NvB海岸线网络安全资讯站
这时候,打开文件对话框就显示出来了,GetOpenFileName函数要一直等到用户选择了一个文件后才会返回,或者当用户按下了CANCEL键或关闭对话框时。NvB海岸线网络安全资讯站
当用户选择了打开一个文件时,该函数返回TRUE, 否则返回FALSE。 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
.if eax==TRUE NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,OFFSET FullPathName NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,ofn.lpstrFile NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,offset CrLf NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,offset FullName NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
当用户选择打开一个文件时,我们就在一个对话框中显示一个字符串,我们先给OutputString变量分配内存,然后调用PAI 函数lstrcat,把所有的字符串连到一起,为了让这些字符串分行显示,我们必须在每个字符串后面加一个换行符。 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
mov eax,ofn.lpstrFile NvB海岸线网络安全资讯站
push ebx NvB海岸线网络安全资讯站
xor ebx,ebx NvB海岸线网络安全资讯站
mov bx,ofn.nFileOffset NvB海岸线网络安全资讯站
add eax,ebx NvB海岸线网络安全资讯站
pop ebx NvB海岸线网络安全资讯站
invoke lstrcat,offset OutputString,eax NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
上面这几行可能需要一些解释。nFileOffset的值等于被打开文件的全路径名中的文件名的第一个字符的索引,由于nFileOffset是一个WORD型变量,而lpstrFile是一个DWORD形的指针,所以我们就要作一转换把nFileOffset存入ebx寄存器的底字节,然后再加到eax寄存器中得到DWORD型的指针。 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
invoke MessageBox,hWnd,OFFSET OutputString,ADDR AppName,MB_OK NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
我们在对话框中显示该字符串。 NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
invoke RtlZerolMemory,offset OutputString,OUTPUTSIZE NvB海岸线网络安全资讯站
NvB海岸线网络安全资讯站
为了下一次能正确地显示,必须清除缓冲区,我们调用函数RtlZerolMemory来做这件事。NvB海岸线网络安全资讯站