📄 lion-tut-c11.htm
字号:
<HTML>
<head>
<link rel="stylesheet" href="../../asm.css">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Iczelion's win32 asm tutorial</title>
</head>
<body bgcolor="#FFFFFF" background="../../images/back01.jpg">
<P align=center><FONT color=#0000ff size=+2>第十一课 进一步学习对话框</FONT></P>
<HR SIZE=1>
本课中我们将进一步学习对话框。特别地我们将要探讨如何把对话框当成输入设备。如果您学习了上一课,那就会发现本课的例子只有少量的改动,就是把我们的对话框窗口附属到主窗口上。另外,我们还要学习通用对话框的用法。
<H3><FONT
color=#ff0000>理论:</FONT></H3>
把对话框当成一个输入设备来用确实是非常地简单,创建完主窗口后,您只要调用函数 CreatedialogParam 或 DialogBoxParam 就可以了,前一个函数只要在对话框的过程处理函数中处理相关的消息就可以,而后者你必须在消息循环段中插入函数
IsDialogMessage 的调用让它来处理键盘的按键逻辑。因为这两个程序段相对来说比较容易,我们就不详解。您可以下载并仔细研究。<BR>
下面我们来讨论通用对话框。WINDOWS已经为您准备好了预定义的对话框类,您可以拿来就用,这些通用对话框提供给用户以统一的界面。它们包括:打开文件、打印、选择颜色、字体和搜索等。您应该尽可能地用它们。处理这些对话框的代码在comdlg32.dll中,为了在您的应用程序中使用它们,就必须在链接阶段链接库文件
comdlg32.lib。然后调用其中的相关函数即可。对于打开文件通用对话框,该函数名为 GetOpenFileName,"保存为..."对话框为 GetSaveFileName,打印通用对话框是
PrintDlg, 等等。每一个这样的函数都接收一个指向一个结构体的指针的参数,您可以参考WIN32 API手册得到详细的资料,本课中我将讲解创建和使用打开文件对话框。<BR>
下面是打开对话框函数 GetOpenFileName 的原型: <br>
<BR>
<BLOCKQUOTE><B>GetOpenFileName proto
lpofn:DWORD</B></BLOCKQUOTE>
您可以看到,该函数只有一个参数,即指向结构体OPENFILENAME的指针。当用户选择了一个文件并打开,该函数返回TRUE,否则返回FALSE。接下来我们看看结构体OPENFILENAME的定义:
<br>
<BR>
<BLOCKQUOTE><B>OPENFILENAME STRUCT</B>
<BLOCKQUOTE><B> lStructSize DWORD ?</B> <BR><B> hwndOwner
HWND ?</B> <BR><B> hInstance HINSTANCE ?</B>
<BR><B> lpstrFilter LPCSTR ?</B> <BR><B> lpstrCustomFilter
LPSTR ?</B> <BR><B> nMaxCustFilter DWORD ?</B>
<BR><B> nFilterIndex DWORD ?</B> <BR><B> lpstrFile
LPSTR ?</B> <BR><B> nMaxFile DWORD ?</B>
<BR><B> lpstrFileTitle LPSTR ?</B> <BR><B> nMaxFileTitle
DWORD ?</B> <BR><B> lpstrInitialDir LPCSTR ?</B>
<BR><B> lpstrTitle LPCSTR ?</B> <BR><B> Flags
DWORD ?</B> <BR><B> nFileOffset WORD ?</B>
<BR><B> nFileExtension WORD ?</B> <BR><B> lpstrDefExt
LPCSTR ?</B> <BR><B> lCustData LPARAM ?</B>
<BR><B> lpfnHook DWORD ?</B> <BR><B> lpTemplateName
LPCSTR ?</B></BLOCKQUOTE><B>OPENFILENAME
ENDS</B></BLOCKQUOTE>好,我们再来看看该结构体中常用的成员的意义:<BR>
<CENTER>
<TABLE border=1 width="100%">
<TBODY>
<TR>
<TD>lStructSize</TD>
<TD>结构体OPENFILENAME的大小。</TD></TR>
<TR>
<TD>hwndOwner</TD>
<TD>拥有打开对话框的窗口的句柄。</TD></TR>
<TR>
<TD>hInstance</TD>
<TD>拥有该打开文件对话框的应用程序的实例句柄
。</TD></TR>
<TR>
<TD>lpstrFilter</TD>
<TD>
<P>以NULL结尾的一个或多个通配符。通配符是成对出现的,前一部分是描述部分,后一部分则是通配符的格式,譬如:
<BR> FilterString db "All Files
(*.*)",0, "*.*",0
<BR>
db "Text Files (*.txt)",0,"*.txt",0,0
<BR>注意:只有每一对中的第二部分是WINDOWS用来过滤所需选择的文件的,另外您必须在该部分后放置一个0,以示字符串的结束。</P></TD></TR>
<TR>
<TD>nFilterIndex</TD>
<TD>用来指定打开文件对话框第一次打开时所用的过滤模式串,该索引是从1开始算的,即第一个通配符模式的索引是1,第二个是2,譬如上面的例子中,若指定该值为2,则缺省显示的模式串就是"*.txt"。</TD></TR>
<TR>
<TD>lpstrFile</TD>
<TD>需要打开的文件的名称的地址,该名称将会出现在打开文件对话框的编辑控件中,该缓冲区不能超过260个字符长,当用户打开文件后,该缓冲区中包含该文件的全路径名,您可以从该缓冲区中抽取您所需要的路径或文件名等信息。</TD></TR>
<TR>
<TD>nMaxFile</TD>
<TD>lpstrFile的大小。</TD></TR>
<TR>
<TD>lpstrTitle</TD>
<TD>指向对话框标题的字符串。</TD></TR>
<TR>
<TD>Flags</TD>
<TD>该标志决定决定了对话框的风格和特点。</TD></TR>
<TR>
<TD>nFileOffset</TD>
<TD>在用户打开了一个文件后该值是全路径名称中指向文件名第一个字符的索引。譬如:若全路径名为"c:\windows\system\lz32.dll",
则该值为18。</TD></TR>
<TR>
<TD>nFileExtension</TD>
<TD>在用户打开了一个文件后该值是全路径名称中指向个文件扩展名第一个字符的索引。</TD></TR></TBODY></TABLE></CENTER>
<H3> </H3>
<H3><FONT
color=#ff0000>例子:</FONT></H3>
下例中,我们演示了当用户选择"File->Open"时,将弹出一个打开文件对话框,当用户选择了某个文件打开时,会弹出一个对话框,告知要打开的文件的全路径名,文件名和文件扩展名。
<P><B>.386</B> <BR><B>.model flat,stdcall</B> <BR><B>option casemap:none</B>
<BR><B>WinMain proto :DWORD,:DWORD,:DWORD,:DWORD</B> <BR><B>include
\masm32\include\windows.inc</B> <BR><B>include \masm32\include\user32.inc</B>
<BR><B>include \masm32\include\kernel32.inc</B> <BR><B>include
\masm32\include\comdlg32.inc</B> <BR><B>includelib \masm32\lib\user32.lib</B>
<BR><B>includelib \masm32\lib\kernel32.lib</B> <BR><B>includelib
\masm32\lib\comdlg32.lib</B>
<P><B>.const</B> <BR><B>IDM_OPEN equ 1</B> <BR><B>IDM_EXIT equ 2</B>
<BR><B>MAXSIZE equ 260</B> <BR><B>OUTPUTSIZE equ 512</B>
<P><B>.data</B> <BR><B>ClassName db "SimpleWinClass",0</B> <BR><B>AppName
db "Our Main Window",0</B> <BR><B>MenuName db "FirstMenu",0</B>
<BR><B>ofn OPENFILENAME <></B> <BR><B>FilterString db "All
Files",0,"*.*",0</B>
<BR><B>
db "Text Files",0,"*.txt",0,0</B> <BR><B>buffer db MAXSIZE dup(0)</B>
<BR><B>OurTitle db "-=Our First Open File Dialog Box=-: Choose the file to
open",0</B> <BR><B>FullPathName db "The Full Filename with Path is: ",0</B>
<BR><B>FullName db "The Filename is: ",0</B> <BR><B>ExtensionName db "The
Extension is: ",0</B> <BR><B>OutputString db OUTPUTSIZE dup(0)</B> <BR><B>CrLf
db 0Dh,0Ah,0</B>
<P><B>.data?</B> <BR><B>hInstance HINSTANCE ?</B> <BR><B>CommandLine LPSTR ?</B>
<P><B>.code</B> <BR><B>start:</B> <BR><B> invoke
GetModuleHandle, NULL</B> <BR><B> mov
hInstance,eax</B> <BR><B> invoke
GetCommandLine<BR> mov CommandLine,eax</B>
<BR><B> invoke WinMain, hInstance,NULL,CommandLine,
SW_SHOWDEFAULT</B> <BR><B> invoke ExitProcess,eax</B>
<P><B>WinMain proc
hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD</B>
<BR><B> LOCAL wc:WNDCLASSEX</B> <BR><B>
LOCAL msg:MSG</B> <BR><B> LOCAL hwnd:HWND</B>
<BR><B> mov wc.cbSize,SIZEOF WNDCLASSEX</B>
<BR><B> mov wc.style, CS_HREDRAW or CS_VREDRAW</B>
<BR><B> mov wc.lpfnWndProc, OFFSET WndProc</B>
<BR><B> mov wc.cbClsExtra,NULL</B>
<BR><B> mov wc.cbWndExtra,NULL</B>
<BR><B> push hInst</B> <BR><B>
pop wc.hInstance</B> <BR><B> mov
wc.hbrBackground,COLOR_WINDOW+1</B> <BR><B> mov
wc.lpszMenuName,OFFSET MenuName</B> <BR><B> mov
wc.lpszClassName,OFFSET ClassName</B> <BR><B> invoke
LoadIcon,NULL,IDI_APPLICATION</B> <BR><B> mov
wc.hIcon,eax</B> <BR><B> mov wc.hIconSm,eax</B>
<BR><B> invoke LoadCursor,NULL,IDC_ARROW</B>
<BR><B> mov wc.hCursor,eax</B>
<BR><B> invoke RegisterClassEx, addr wc</B>
<BR><B> invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR
ClassName,ADDR AppName,\</B>
<BR><B>
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\</B>
<BR><B>
CW_USEDEFAULT,300,200,NULL,NULL,\</B>
<BR><B>
hInst,NULL</B> <BR><B> mov hwnd,eax</B>
<BR><B> invoke ShowWindow, hwnd,SW_SHOWNORMAL</B>
<BR><B> invoke UpdateWindow, hwnd</B>
<BR><B> .WHILE TRUE</B>
<BR><B> invoke GetMessage, ADDR
msg,NULL,0,0</B> <BR><B> .BREAK .IF
(!eax)</B> <BR><B> invoke
TranslateMessage, ADDR msg</B> <BR><B>
invoke DispatchMessage, ADDR msg</B> <BR><B> .ENDW</B>
<BR><B> mov eax,msg.wParam</B>
<BR><B> ret</B> <BR><B>WinMain endp</B>
<P><B>WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM</B>
<BR><B> .IF uMsg==WM_DESTROY</B>
<BR><B> invoke
PostQuitMessage,NULL</B> <BR><B> .ELSEIF uMsg==WM_COMMAND</B>
<BR><B> mov eax,wParam</B>
<BR><B> .if ax==IDM_OPEN</B>
<BR><B> mov
ofn.lStructSize,SIZEOF ofn</B>
<BR><B> push
hWnd</B>
<BR><B>
pop ofn.hwndOwner</B>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -