📄 lion-tut-c11.htm
字号:
<BR><B> push
hInstance</B>
<BR><B>
pop ofn.hInstance</B>
<BR><B>
mov ofn.lpstrFilter, OFFSET FilterString</B>
<BR><B>
mov ofn.lpstrFile, OFFSET buffer</B>
<BR><B>
mov ofn.nMaxFile,MAXSIZE</B>
<BR><B>
mov ofn.Flags, OFN_FILEMUSTEXIST or \</B>
<BR><B>
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\</B>
<BR><B>
OFN_EXPLORER or OFN_HIDEREADONLY</B>
<BR><B>
mov ofn.lpstrTitle, OFFSET OurTitle</B>
<BR><B> invoke
GetOpenFileName, ADDR ofn</B>
<BR><B> .if
eax==TRUE</B>
<BR><B>
invoke lstrcat,offset OutputString,OFFSET FullPathName</B>
<BR><B>
invoke lstrcat,offset OutputString,ofn.lpstrFile</B>
<BR><B>
invoke lstrcat,offset OutputString,offset CrLf</B>
<BR><B>
invoke lstrcat,offset OutputString,offset FullName</B>
<BR><B>
mov eax,ofn.lpstrFile</B>
<BR><B>
push ebx</B>
<BR><B>
xor ebx,ebx</B>
<BR><B>
mov bx,ofn.nFileOffset</B>
<BR><B>
add eax,ebx</B>
<BR><B>
pop ebx</B>
<BR><B>
invoke lstrcat,offset OutputString,eax</B>
<BR><B>
invoke lstrcat,offset OutputString,offset CrLf</B>
<BR><B>
invoke lstrcat,offset OutputString,offset ExtensionName</B>
<BR><B>
mov eax,ofn.lpstrFile</B>
<BR><B>
push ebx</B>
<BR><B>
xor ebx,ebx</B>
<BR><B>
mov bx,ofn.nFileExtension</B>
<BR><B>
add eax,ebx</B>
<BR><B>
pop ebx</B>
<BR><B>
invoke lstrcat,offset OutputString,eax</B>
<BR><B>
invoke MessageBox,hWnd,OFFSET OutputString,ADDR AppName,MB_OK</B>
<BR><B>
invoke RtlZeroMemory,offset OutputString,OUTPUTSIZE</B>
<BR><B>
.endif</B> <BR><B> .else</B>
<BR><B> invoke
DestroyWindow, hWnd</B> <BR><B>
.endif</B> <BR><B> .ELSE</B>
<BR><B> invoke
DefWindowProc,hWnd,uMsg,wParam,lParam</B>
<BR><B> ret</B>
<BR><B> .ENDIF</B> <BR><B>
xor eax,eax</B> <BR><B> ret</B>
<BR><B>WndProc endp</B> <BR><B> end start</B> <BR>
<HR width="100%">
<H3><FONT
color=#ff0000>分析:</FONT></H3><B>
mov ofn.lStructSize,SIZEOF ofn</B>
<BR><B> push
hWnd</B>
<BR><B>
pop ofn.hwndOwner</B>
<BR><B> push
hInstance</B>
<BR><B>
pop ofn.hInstance</B>
<P>我们在此填充结构体OPENFILENAME变量ofn的有关成员。
<P><B>
mov ofn.lpstrFilter, OFFSET FilterString</B>
<P>这里FilterString 是文件过滤模式的字符串地址,我们指定的过滤模式字符串如下:
<BLOCKQUOTE><B>FilterString db "All Files",0,"*.*",0</B>
<BR><B>
db "Text
Files",0,"*.txt",0,0</B></BLOCKQUOTE>注意:所有的模式串都是配对的,前一个是描述,后一个才是真正的模式,次处"*.*"和"*.txt"是WIONDOWS用来寻找匹配的欲打开的文件的。我们当能可以指定任何模式,但是不要忘记在结尾处加0以代表字符串已结束,否则您的对话框在操作时可能不稳定。
<P><B>
mov ofn.lpstrFile, OFFSET buffer</B>
<BR><B>
mov ofn.nMaxFile,MAXSIZE</B>
<P>这里是把缓冲区的地址放到结构体中,同时必须设定大小。以后我们可以随意编辑在该缓冲区中返回的信息。
<P><B>
mov ofn.Flags, OFN_FILEMUSTEXIST or \</B>
<BR><B>
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\</B>
<BR><B>
OFN_EXPLORER or OFN_HIDEREADONLY</B>
<P>Flags 中放入的是对话框的风格和特性值。<BR>其中OFN_FILEMUSTEXIST和
OFN_PATHMUSTEXIST要求用户在打开对话框的编辑控件中输入的文件名或路径名必须存在。<BR>OFN_LONGNAMES 告诉对话框显示长文件名。
<BR>OFN_EXPLORER 告诉WINDOWS对话框的外观必须类似资源管理器。<BR>OFN_HIDEREADONLY
指定不要显示只读文件(既使它的扩展名符合过滤模式)。 <BR>除此之外,还有许多其它的标志位,您可以参考有关WIN32 API手册。
<P><B>
mov ofn.lpstrTitle, OFFSET OurTitle</B>
<P>指定打开文件对话框的标题名。
<P><B> invoke
GetOpenFileName, ADDR ofn</B>
<P>调用GetOpenFileName函数,并传入指向结构体ofn的指针。
<BR>这时候,打开文件对话框就显示出来了,GetOpenFileName函数要一直等到用户选择了一个文件后才会返回,或者当用户按下了CANCEL键或关闭对话框时。<BR>当用户选择了打开一个文件时,该函数返回TRUE,
否则返回FALSE。
<P><B> .if
eax==TRUE</B>
<BR><B>
invoke lstrcat,offset OutputString,OFFSET FullPathName</B>
<BR><B>
invoke lstrcat,offset OutputString,ofn.lpstrFile</B>
<BR><B>
invoke lstrcat,offset OutputString,offset CrLf</B>
<BR><B>
invoke lstrcat,offset OutputString,offset FullName</B>
<P>当用户选择打开一个文件时,我们就在一个对话框中显示一个字符串,我们先给OutputString变量分配内存,然后调用PAI
函数lstrcat,把所有的字符串连到一起,为了让这些字符串分行显示,我们必须在每个字符串后面加一个换行符。
<P><B>
mov eax,ofn.lpstrFile</B>
<BR><B>
push ebx</B>
<BR><B>
xor ebx,ebx</B>
<BR><B>
mov bx,ofn.nFileOffset</B>
<BR><B>
add eax,ebx</B>
<BR><B>
pop ebx</B>
<BR><B>
invoke lstrcat,offset OutputString,eax</B>
<P>上面这几行可能需要一些解释。nFileOffset的值等于被打开文件的全路径名中的文件名的第一个字符的索引,由于nFileOffset是一个WORD型变量,而lpstrFile是一个DWORD形的指针,所以我们就要作一转换把nFileOffset存入ebx寄存器的底字节,然后再加到eax寄存器中得到DWORD型的指针。
<P><B>
invoke MessageBox,hWnd,OFFSET OutputString,ADDR AppName,MB_OK</B>
<P>我们在对话框中显示该字符串。
<P><B>
invoke RtlZerolMemory,offset OutputString,OUTPUTSIZE</B>
<P>为了下一次能正确地显示,必须清除缓冲区,我们调用函数RtlZerolMemory来做这件事。 <BR><STRONG><BR></STRONG>
<hr size="1">
<div align="center">
<script language="JavaScript1.1" src=http://ad.t2t2.com/textclick.asp?user=bigluo&style=4&bkcolor=no></script>
<br>
</div>
<!-- 10:1 文本广告交换 -->
<div align="center">
<script language="JavaScript1.1" src=http://coolsite21.com:90/c21.dll?Type=PT&id=1047&col=6&ReferID=1047&v=0></script>
<!-- 10:1 文本广告交换 --> </div>
<DIV align=center>翻译:Lxx,阿龙.LuoYunBin's Win32 ASM Page, <A
href="http://asm.yeah.net/">http://asm.yeah.net</A></DIV>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -