?? 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 + -