WIN32汇编语言之通用对话框的使用

以前学习过自定义的对话框,属性需要自己定义,包括边框,标题,模态与非模态等等,如果创建模态对话框(windows为它内建的消息循环),你不用再去自己写消息循环与注册窗口和显示窗口这几个部分,可以很好的偷懒,这次要介绍的是WINDOWS已经建立好的对话框(已经写好在Comdlg32.dll中),因此当你用到相关的通用对话框的时候,需要在程序的开头写上相关的声明:include comdlg32.inc  与includelib  comdlg32.lib

每当我们使用windows操作系统的时候,当你使用画图工具的时候,你选择“选择颜色”属性的时候,就会跳出一个标题为颜色的对话框ChooseColor(刚开始对于这个对话框我有一个疑问就是能不能把这个对话框的标题改为自己定义的字符串,仔细查看每个通用对话框相应的结构才发现只有“打开”和“另存为”  两个通用对话框的相关的结构中包含对话框的标题lpstrtitle  这个元素,而其他的几个通用对话框相应的结构中并没有哪一项涉及到修改对话框的标题的元素,对于这个问题现在还是很疑惑希望了解的人给与评论),这个对话框就是系统的通用对话框;当你使用QQ截图的时候你选择另存为这个选项的时候,就会弹出一个标题为"另存为"的通用对话框GetSaveFileName(这个标题是可以自己定义的),当你新建一个文本文档需要打开一个以前写好的文本的时候,就会弹出一个标题为“打开”的通用对话框GetOpenFileName(这个通用对话框的标题也是可以修改的),当你在一个文本文档里面选择“格式”--“字体”选项的时候会弹出一个标题为“字体”的通用对话框ChooseFont,用来选择需要选择的字体和字体的大小。同样还有“页面设置”这个通用对话框PageSetupDlg,“查找字符串”的通用对话框FindText      “替换字
符串”的通用对话框ReplaceText。其中每一个通用对话框都对应一个相关的数据结构,用来对对话框的一些属性值进行设置,每个对话框的名字和相应的函数以及相应的结构如下表:

通用对话框
通用对话框 使用的函数 使用的数据结构
选择颜色 ChooseColor() CHOOSECOLOR
打开文件 GetOpenFileName() OPENFILENAME
保存文件 GetSaveFileName() OPENFILENAME
页面设置 PageSetupDlg() PAGESETUPDLG
选择字体 ChooseFont() CHOOSEFONT
查找字符串 FindText() FINDREPLACE
替换字符串 ReplaceText() FINDREPLACE


介绍完了通用对画框的基本内容,下面来看一下资源文件的建立:资源文件需要三个部分

首先是最简单的程序图标文件,为了简单,我建立的是一个加粗了的“2”(IDI_ICON1),关于图标,有一个问题:因为创建的是模态对话框(DialogboxParam),不需要再去注册窗口类,写消息循环,显示窗口这几步操作,所以加载图标不需要写出来,windows自己会加载资源图标,对于这个问题当时也是很纠结,图标文件在资源文件定义的时候并没有被选择加入到对话框资源中,菜单是被选择加入到对话框的,它可以附带着对话框的的过程被载入到程序中,但是这个图标并没有相关的操作,我自己理解为是windows自己加载的,(还请了解的指点)

下面看一下资源脚本代码:

// Generated by ResEdit 1.6.6
// Copyright (C) 2006-2015
// http://www.resedit.net
#include 
#include 
#include 
#include "resource.h"
//
// Menu resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDR_MENU1 MENU
{
    POPUP "文件(&F)"
    {
        MENUITEM "打开文件(&O)", IDM_OPEN
        MENUITEM "文件另存为(&C)", IDM_SAVEAS
        MENUITEM SEPARATOR
        MENUITEM "页面设置(&P)", IDM_PAGESETUP
        MENUITEM SEPARATOR
        MENUITEM "退出(&X)", IDM_EXIT
    }
    POPUP "查看"
    {
        MENUITEM "查找字符串(&S)", IDM_FIND
        MENUITEM "替换字符串(&R)", IDM_REPLACE
        MENUITEM SEPARATOR
        MENUITEM "选择字体(&F)", IDM_SELFONT
        MENUITEM "选择颜色(&B)", IDM_SELCOLOR
    }
}
//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG1 DIALOG 0, 0, 186, 95
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
EXSTYLE WS_EX_STATICEDGE
CAPTION "通用对话框示例"
MENU IDR_MENU1
FONT 8, "Ms Shell Dlg"
{
}
//
// Icon resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDI_ICON1          ICON           "icon2.ico"


这次资源文件代码也挺短的,参数都占了一大堆,编译就不说了,都很熟悉了。


下面来看一下实现程序的功能代码的一些疑问

首先第一个问题:看下程序中这几句代码,用意就是利用wsprintf()函数将数值或者字符按指定的格式翻译成字符串,具体查看该函数的详细用法,太长了,没有出现什么问题就不详细介绍用法了。看代码:这是数据段的一个变量的定义。

szFormatFont       db'您的选择:',0dh,0ah,'字体名称:%s',0dh,0ah
db '字体颜色值:%08x,字体大小:%d ',0

要注意的是“字体大小:%d ',0”这句,意思就是输出整数在这个位置,就是选中字体的大小,但是运行程序后可以发现其实对话框中输出的数值(即选择字体的大小)后面多一个“0”,刚开始很不理解,来看一下选择字体这个通用对话框所对应的数据结构CHOOSEFONT中的iPointSize字段的含义:返回用户选择的字号大小,单位是1/10磅,因此返回的数值等于对话框中选择的字号大小乘以10,刚开始因为不知道字体的大小使用的是什么单位,认为返回的数值和弹出的字体通用对话框中选择的字体大小相等,纠结了许久。关于字体单位大小可以参考一下下面这个表:(这个表我也是在网上看到别人写的写得很好就采用了)

WIN32汇编语言之通用对话框的使用_第1张图片


每一个通用对话框都有相对应的数据结构,每个数据结构中的字段比较多,在书写的时候,很容易出现错误,不仅仅是书写,就像上面这个疑问,就是对某个字段没有理解造成的。其他就没什么错误了,下面来看一下源代码:

               

 .386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include Comdlg32.inc
includelib Comdlg32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDI_ICON1 equ 110
IDD_DIALOG1 equ108
IDR_MENU1 equ 111
IDM_OPEN equ 100
IDM_SAVEAS equ101
IDM_PAGESETUP equ102
IDM_EXIT equ 103
IDM_FIND equ 104
IDM_REPLACE equ105
IDM_SELFONT equ106
IDM_SELCOLOR equ107
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?


hInstance dd ?
hWinMain dd ?
dwFontColor dd?
dwBackColor dd?
dwCustColors dd16 dup (?)
stLogFont LOGFONT
szFileName db MAX_PATH dup (?)
szBuffer db 1024 dup (?)
;********************************************************************
; 查找替换对话框使用
;********************************************************************
idFindMessage dd?
stFind FINDREPLACE
szFindText db 100 dup (?)
szReplaceText db100 dup (?)


.const
FINDMSGSTRING db'commdlg_FindReplace',0
szSaveCaption db'请输入保存的文件名',0
szFormatColor db'您选择的颜色值:%08x',0
szFormatFont db'您的选择:',0dh,0ah,'字体名称:%s',0dh,0ah
db '字体颜色值:%08x,字体大小:%d ',0
szFormatFind db'您按下了“%s”按钮',0dh,0ah,'查找字符串:%s',0dh,0ah
db '替换字符串:%s',0
szFormatPrt db'您选择的打印机:%s',0
szCaption db '执行结果',0
szFindNext db '查找下一个',0
szReplace db '替换',0
szReplaceAll db'全部替换',0
szFilter db 'Text Files(*.txt)',0,'*.txt',0,'All Files(*.*)',0,'*.*',0,0
szDefExt db 'txt',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 页面设置对话框
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_PageSetup proc
local @stPS:PAGESETUPDLG


invoke RtlZeroMemory,addr @stPS,sizeof @stPS
mov @stPS.lStructSize,sizeof @stPS
push hWinMain
pop @stPS.hwndOwner
invoke PageSetupDlg,addr @stPS
.if eax && @stPS.hDevMode
mov eax,@stPS.hDevMode
mov eax,[eax]
invoke wsprintf,addr szBuffer,addr szFormatPrt,eax
invoke MessageBox,hWinMain,addr szBuffer,addr szCaption,MB_OK
.endif
ret


_PageSetup endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 显示“保存文件”对话框
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_SaveAs proc
local @stOF:OPENFILENAME


invoke RtlZeroMemory,addr @stOF,sizeof @stOF
mov @stOF.lStructSize,sizeof @stOF
push hWinMain
pop @stOF.hwndOwner
mov @stOF.lpstrFilter,offset szFilter
mov @stOF.lpstrFile,offset szFileName
mov @stOF.nMaxFile,MAX_PATH
mov @stOF.Flags,OFN_PATHMUSTEXIST
mov @stOF.lpstrDefExt,offset szDefExt
mov @stOF.lpstrTitle,offset szSaveCaption
invoke GetSaveFileName,addr @stOF
.if eax
invoke MessageBox,hWinMain,addr szFileName,addr szCaption,MB_OK
.endif
ret


_SaveAs endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 显示“打开文件”对话框
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_OpenFile proc
local @stOF:OPENFILENAME


invoke RtlZeroMemory,addr @stOF,sizeof @stOF
mov @stOF.lStructSize,sizeof @stOF
push hWinMain
pop @stOF.hwndOwner
mov @stOF.lpstrFilter,offset szFilter
mov @stOF.lpstrFile,offset szFileName
mov @stOF.nMaxFile,MAX_PATH
mov @stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
invoke GetOpenFileName,addr @stOF
.if eax
invoke MessageBox,hWinMain,addr szFileName,addr szCaption,MB_OK
.endif
ret


_OpenFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 选择颜色
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ChooseColor proc
local @stCC:CHOOSECOLOR


invoke RtlZeroMemory,addr @stCC,sizeof @stCC
mov @stCC.lStructSize,sizeof @stCC
push hWinMain
pop @stCC.hwndOwner
push dwBackColor
pop @stCC.rgbResult
mov @stCC.Flags,CC_RGBINIT or CC_FULLOPEN
mov @stCC.lpCustColors,offset dwCustColors
invoke ChooseColor,addr @stCC
.if eax
push @stCC.rgbResult
pop dwBackColor
invoke wsprintf,addr szBuffer,addr szFormatColor,dwBackColor
invoke MessageBox,hWinMain,addr szBuffer,addr szCaption,MB_OK
.endif
ret


_ChooseColor endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 选择字体
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ChooseFont proc
local @stCF:CHOOSEFONT


invoke RtlZeroMemory,addr @stCF,sizeof @stCF
mov @stCF.lStructSize,sizeof @stCF
push hWinMain
pop @stCF.hwndOwner
mov @stCF.lpLogFont,offset stLogFont
push dwFontColor
pop @stCF.rgbColors
mov @stCF.Flags,CF_SCREENFONTS or CF_INITTOLOGFONTSTRUCT or CF_EFFECTS
invoke ChooseFont,addr @stCF
.if eax
push @stCF.rgbColors
pop dwFontColor
invoke wsprintf,addr szBuffer,addr szFormatFont,addr stLogFont.lfFaceName,\
dwFontColor,@stCF.iPointSize
invoke MessageBox,hWinMain,addr szBuffer,addr szCaption,MB_OK
.endif
ret


_ChooseFont endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain procuses ebx edi esi hWnd,wMsg,wParam,lParam
local @szBuffer[128]:byte

mov eax,wMsg
.if eax ==WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
;********************************************************************
; 注册“查找”对话框消息,初始化“查找”对话框的结构
;********************************************************************
mov eax,hWnd
mov hWinMain,eax
mov stFind.hwndOwner,eax
mov stFind.lStructSize,sizeof stFind
mov stFind.Flags,FR_DOWN
mov stFind.lpstrFindWhat,offset szFindText
mov stFind.wFindWhatLen,sizeof szFindText
mov stFind.lpstrReplaceWith,offset szReplaceText
mov stFind.wReplaceWithLen,sizeof szReplaceText
invoke RegisterWindowMessage,addr FINDMSGSTRING
mov idFindMessage,eax
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax ==IDM_EXIT
invoke EndDialog,hWnd,NULL
.elseif ax == IDM_OPEN
invoke _OpenFile
.elseif ax == IDM_SAVEAS
invoke _SaveAs
.elseif ax == IDM_PAGESETUP
invoke _PageSetup
.elseif ax == IDM_FIND
and stFind.Flags,not FR_DIALOGTERM
invoke FindText,addr stFind
.elseif ax == IDM_REPLACE
and stFind.Flags,not FR_DIALOGTERM
invoke ReplaceText,addr stFind
.elseif ax == IDM_SELFONT
invoke _ChooseFont
.elseif ax == IDM_SELCOLOR
invoke _ChooseColor
.endif
;********************************************************************
.elseif eax == idFindMessage
xor ecx,ecx
.if stFind.Flags & FR_FINDNEXT
mov ecx,offset szFindNext
.elseif stFind.Flags & FR_REPLACE
mov ecx,offset szReplace
.elseif stFind.Flags & FR_REPLACEALL
mov ecx,offset szReplaceAll
.endif
.if ecx
invoke wsprintf,addr szBuffer,addr szFormatFind,\
ecx,addr szFindText,addr szReplaceText
invoke MessageBox,hWinMain,addr szBuffer,addr szCaption,MB_OK
.endif
;********************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret


_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start



win32汇编程序总会有许多相似的东西,就就像是一些固定的模板代码总是大同小异。关于源代码不再多赘述,也没什么问题了,下面来介绍一下本次遇到的一些新的API函数,以及新的结构类型:

结构体:

FINDREPLACEA           STRUCT
  lStructSize         DWORD   ?     ;结构长度
  hwndOwner           DWORD   ?     ;所属窗口
  hInstance           DWORD   ?     
  Flags               DWORD   ?     ;标志
  LpstrFindWhat       DWORD   ?     ;查找字符串
  lpstrReplaceWith    DWORD   ?     ;替换字符串
  wFindWhatLen        WORD    ?     ;查找字符串长度
  wReplaceWithLen     WORD    ?     ;替换字符串长度
  lCustData           DWORD   ?     
  lpfnHook            DWORD   ?     
  lpTemplateName      DWORD   ?     
FINDREPLACEA          ENDS
FINDREPLACE           EQU       



OPENFILENAMEA         STRUCT
  lStructSize         DWORD  ?       ;结构的长度
  hwndOwner           DWORD  ?       ;所属窗口,可以为NULL
  hInstance           DWORD  ?       ;
  lpstrFilter         DWORD  ?       ;文件筛选字符串
  lpstrCustomFilter   DWORD  ?       
  nMaxCustFilter      DWORD  ?       
  nFilterIndex        DWORD  ?
  lpstrFile           DWORD  ?       ;全路径的文件名缓冲区
  nMaxFile            DWORD  ?       ;文件名缓冲区长度
  lpstrFileTitle      DWORD  ?       ;不包含路径的文件名缓冲区
  nMaxFileTitle       DWORD  ?       ;文件名缓冲区长度
  lpstrInitialDir     DWORD  ?       ;初始目录
  lpstrTitle          DWORD  ?       ;对话框标题
  Flags               DWORD  ?       ;标志
  nFileOffset         WORD   ?       ;文件名在字符串中的起始位置
  nFileExtension      WORD   ?       ;扩展名在字符串中的起始位置
  lpstrDefExt         DWORD  ?       ;默认扩展名
  lCustData           DWORD  ?       ;
  lpfnHook            DWORD  ?       
  lpTemplateName      DWORD  ?     
OPENFILENAMEA         ENDS
OPENFILENAME          equ   
参数介绍:
折叠lStructSize


指定这个结构的大小,以字节为单位。


Windows 95/98和Windows NT 4.0:特意为Windows 95/98或Windows NT 4.0,及带有WINVER和_WIN32_WINNT >= 0x0500编译时,为这个成员使用OPENFILENAME_SIZE_VERSION_400。


Windows 2000及更高版本:这个参数使用sizeof (OPENFILENAME) 。


折叠hwndOwner


指向所有者对话框窗口的句柄。这个成员可以是任意有效窗口句柄,或如果对话框没有所有者它可以为NULL。


折叠hInstance


如果在Flags成员中设置了OFN_ENABLETEMPLATEHANDLE标记,hInstance成员指向包含一个对话框模板的内存对象。如果OFN_ENABLETEMPLATE标记被设置,hInstance是一个指向通过lpTemplateName成员命名的对话框模板的模块。如果两者都没有被设置,这个成员被忽略。


如果OFN_EXPLORER标记被设置,系统使用Explorer风格的默认对话框的子窗口作为指定模板来建立一个对话框。如果OFN_EXPLORER标记没有被设置,系统使用模板建立一个旧风格的对话框。


折叠lpstrFilter


指向一对以空字符结束的过滤字符串的一个缓冲。缓冲中的最后一个字符串必须以两个NULL字符结束。


第一个字符串是过滤器描述的显示字符串(例如,"文本文件"),第二个字符指定过滤样式(例如,"*.TXT")。要为一个显示字符串指定多个过滤样式,使用分号(";")分隔样式(例如,"*.TXT;*.DOC;*.BAK")。一个样式字符串中可以包含有效的文件名字字符及星号(*)通配符。不能在样式字符串中包含空格。


系统不能改变过滤器的次序。它按lpstrFilter指定的次序显示在文件类型组合框中。


如果lpstrFilter是NULL,对话框不能显示任何过滤器。


折叠lpstrCustomFilter


指向一个静态缓冲,它包含了一对以空字符结束的过滤器字符串,这个字符串是为了保留用户选择的过滤样式。第一个字符串是描述定制过滤器的显示字符串,第二个字符串是被用户选择的过滤器样式。第一次你的应用程序建立对话框,你指定的第一个字符串可以是任何非空的字符串。当用户选择了一个文件时,对话框复制当前过滤样式到第二个字符串。保留过滤样式可以是在lpstrFilter缓冲中指定的样式之一,或是用户输入的过滤器样式。在下一次对话框被建立时系统使用这个字符串去初始化用户自定义的文件过滤器。如果nFilterIndex成员是0,对话框使用定制过滤器。


如果这个成员是NULL,对话框不能保留用户自定义过滤器样式。


如果这个成员不是NULL,nMaxCustFilter成员的值必须指定以TCHARs为单位的lpstrCustomFilter缓冲的大小。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。


折叠nMaxCustFilter


指定特意为lpstrCustomFilter准备的以TCHARs为单位的缓冲大小。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。这缓冲应该最小在40个字符长。如果lpstrCustomFilter成员是NULL或是指向NULL的字符串,这个成员被忽略。


折叠nFilterIndex


指定在文件类型控件中当前选择的过滤器的索引。缓冲指向被lpstrFilter包含的一对定义了的过滤器的字符串。过滤器的第一对字符串的索引值为1,第二对为2,等等。0索引指出是通过lpstrCustomFilter指定的定制过滤器。你可以为对话框指定一个索引作为最初的过滤器描述及过滤器样式。当用户选择了一个文件时,nFilterIndex返回当前显示的过滤器的索引。


如果nFilterIndex是0及lpstrCustomFilter是NULL,系统使用在lpstrFilter缓冲中的第一个过滤器。如果所有的三个成员都是0或NULL,系统不使用任何过滤器,在对话框的列表文件中不显示任何文件。


折叠lpstrFile


指向包含初始化文件名编辑控件使用的文件名的缓冲。如果不需要初始值,这个缓冲的第一个字符必须是NULL。当GetOpenFileName或GetSaveFileName函数返回成功时,这个缓冲包含驱动器,路径,文件名,及所选择的文件的扩展名。


如果OFN_ALLOWMULTISELECT标记被设置并且用户选择了多个文件,缓冲包含了当前目录下被选择文件的文件名。对于Explorer风格对话框,目录和文件名字符串是被NULL分开的,在文件名之后有一个额外的NULL。对于旧风格对话框,字符串是被空格分开的并且函数为带有空格的文件名使用短文件名。你可以使用FindFirstFile函数在长短文件名之间转换。如果用户只选择了一个文件,lpstrFile字符串在路径和文件名之间没有分隔。


如果缓冲太小,函数返回FALSE并且CommDlgExtendedError函数返回FNERR_BUFFERTOOSMALL.。既然这样,lpstrFile缓冲的首先两个字节包含必需的大小(字节或字符)。


折叠nMaxFile


指定lpstrFile缓冲的大小,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。这个缓冲必须足够存储路径和文件名字符串,包含结尾的null字符。如果缓冲太小,GetOpenFileName和GetSaveFileName函数返回假(FALSE)缓冲最小应该在256个字符长。


折叠lpstrFileTitle


指向接收选择的文件的文件名和扩展名的缓冲(不带路径信息)。这个成员可以是NULL。


折叠nMaxFileTitle


指定lpstrFileTitle缓冲的大小,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。如果lpstrFileTitle是NULL,这个成员被忽略。


折叠lpstrInitialDir


指向以空字符结束的字符串,可以在这个字符串中指定初始目录。Pointer to a null terminated string that can specify the initial directory. 在不同的平台上,为选择初始目录有不同的运算法则。


Windows 7:


如果lpstrInitialDir与应用程序第一次使用打开或另存为对话框的值相同,路径由用户选择作为初始目录。


否则,如果lpstrFile包含路径,路径是初始目录。


否则,如果lpstrInitialDir不是NULL,它指定初始目录。


如果lpstrInitialDir为NULL,并且当前目录包含有一些指定过滤器类型的文件,初始目录是当前目录。


否则,初始目录是当前用户的个人目录(即我的文档)。


否则,初始目录是桌面文件夹。


Windows 2000:


如果lpstrFile包含了一个路径,这个路径就是初始目录。


否则,lpstrInitialDir指定的为初始目录。


如果lpstrInitialDir为NULL,并且当前目录下包含有一些指定过滤器类型的文件,初始目录就是当前目录。


否则,如果应用程序在过去使用过打开哐另存为对话框,使用最近选择的路径作为初始目录。然而,如果一个应用程序长时间没有运行过,它保存的选择的路径将被丢弃。


否则,初始目录是当前用户的私人文件目录(即我的文档)。


否则,初始目录是桌面文件夹。


Windows 98:


lpstrInitialDir指定初始目录。


如果lpstrInitialDir是NULL并且lpstrFile包含了一个路径,那么这个路径就是初始目录。


否则,如果当前目录包含了一些指定的过滤类型的文件,那么初始化目录是当前目录。


否则,初始目录是当前用户的私人文件目录(即我的文档)。


Windows和Windows NT/ 2000的早期版本:


lpstrInitialDir指定初始目录。


如果lpstrInitialDir是NULL并且lpstrFile包含了一个路径,那么这个路径就是初始目录。


否则,初始目录是当前目录。


折叠lpstrTitle


指向在对话框的标题栏中放置的字符串。如果这个成员是NULL,系统使用默认标题(另存为或打开)


折叠Flags


位标记的设置,你可以使用来初始化对话框。当对话框返回时,它设置的这些标记指出用户的输入。这个成员可以是下列标记的组合。 标记 含意


OFN_ALLOWMULTISELECT 指定文件名列表框允许多选。如果同时你设置了OFN_EXPLORER标记,对话框使用Explorer风格用户界面;否则它使用旧风格用户界面。


如果用户选择了一个以上的文件,lpstrFile缓冲返回当前目录下所有被选择的文件的文件名。nFileOffset成员是到第一个文件名的偏移量(字节或字符),并且nFileExtension成员不被使用。对于Explorer风格对话框,目录和文件名是被NULL分隔的,在最后的文件名后带有额外的NULL。这个格式使Explorer风格的对话框能返回包含空格的长文件名。对于旧风格对话框,目录和文件字符串是被空格分隔的,函数为带有空格的文件名使用短文件名。你可以使用FindFirstFile函数在短文件名和长文件名之间转换。


如果你为一个旧风格对话框指定了一个定制的模板,文件名列表框的定义必须包含LBS_EXTENDEDSEL值。


OFN_CREATEPROMPT 如果用户指定了一个不存在的文件,这个标记使用对话框能提示用户是否新建这个文件。如果用户选择了新建这个文件,对话框关闭并且函数返回指定的名字;否则,对话框继续停留。如果你使用带有OFN_ALLOWMULTISELECT标记的这个标记,对话框允许用户去指定一个不存在的文件。


OFN_DONTADDTORECENT Windows 2000:防止系统为选择的文件增加快捷链接到最近使用文档中。要找回目录的位置,调用还有CSIDL_RECENT标记的SHGetSpecialFolderLocation函数。


OFN_ENABLEHOOK 激活在lpfnHook成员中指定的钩子函数。


OFN_ENABLEINCLUDENOTIFY Windows 2000:当用户打开一个文件夹时,引起对话框发送CDN_INCLUDEITEM通知消息到你的OFNHookProc程序。对话框为在最近打开的文件夹中的每一个项目发送一个通知。这些消息使你能够控制那些在对话框中显示的文件夹项目的列表。


OFN_ENABLESIZING Windows 2000,Windows 98:使Explorer风格的对话框可以使用鼠标或键盘调整大小。缺省时,Explorer风格的打开和另存为对话框允许被调整大小,不顾这个标记是否被设置。这标记仅在你提供了一个钩子程序或定制模板时是必需的。旧风格的对话框不允许调整大小。


OFN_ENABLETEMPLATE 指出lpTemplateName成员是指向对话框模板资源的名字,这个模板资源在能被hInstance成员识别的模块中。


如果OFN_EXPLORER标记被设置,系统使用指定的模板去建立一个对话框,是默认Explorer风格对话框的子窗口。如果OFN_EXPLORER标记没有被设置,系统使用旧风格的对话框替代默认的对话框。


OFN_ENABLETEMPLATEHANDLE 指出hInstance成员能识别的包含预载对话框模板的数据块。如果这个标记被指定的,系统忽略lpTemplateName。


如果OFN_EXPLORER标记被设置,系统使用指定的模板去建立一个对话框,是默认Explorer风格对话框的子窗口。如果OFN_EXPLORER标记没有被设置,系统使用模板去建立一个旧风格对话框替代默认对话框。


OFN_EXPLORER 指出任何打开或另存为对话框使用新的Explorer风格的用户化模块。关于更多的信息,参见Explorer-Style Hook Procedures和Explorer-Style Custom Templates。


缺省下,打开和另存为对话框使用Explorer风格用户界面,不顾这个标记是否设置。这个标记仅在你提供了一个钩子程序或定制模板或设置了OFN_ALLOWMULTISELECT标记时是必需的。


如果你想使用旧风格的界面,省略OFN_EXPLORER 标记,并且提供一个代替的旧风格模板或钩子程序。如果你想用旧风格但不需要一个定制模板或钩子程序,简单的提供一个钩子程序,让它返回FALSE。


OFN_EXTENSIONDIFFERENT 指定用户输入的一个文件的扩展名与lpstrDefExt指定的扩展名不同。如果lpstrDefExt是NULL,函数不使用这个标记。


OFN_FILEMUSTEXIST 指定用户仅可以在打开文件名输入字段中输入已存在的文件的名字。如果这个标记被指定的并且用户输入了一个无效的名字,对话框程序显示一个等待消息框。如果这个标记被指定,OFN_PATHMUSTEXIST标记也被使用。


OFN_FORCESHOWHIDDEN Windows 2000:强制显示系统和隐藏属性的文件,从而压倒用户设置的显示或不显示隐藏文件。否则,带有系统和隐藏标记的文件不被显示。


OFN_HIDEREADONLY 隐藏只读复选框。


OFN_LONGNAMES 对于旧风格对话框,这个标记引起对话框使用长文件名。如果这个标记没有被指定,或如果OFN_ALLOWMULTISELECT标记也被设置,旧风格对话框为带有空格的文件名使用短文件名(8.3格式)。


Explorer风格对话框忽略这个标记,通常显示长文件名。


OFN_NOCHANGEDIR 如果当搜索文件时用户改变了目录的时候,恢复当前目录到它的初始值。


OFN_NODEREFERENCELINKS 引导对话框为选择的快捷方式(.LNK)文件返回路径和文件名。如果这个值没有被指定,对话框返回这个快捷方式所引用文件的路径和文件名。


OFN_NOLONGNAMES 对于旧风格对话框,这个标识引起对话框去使用短文件名(8.3格式)。


Explorer风格对话框忽略这个标记,通常显示长文件名。


OFN_NONETWORKBUTTON 隐藏和显示风格按钮。


OFN_NOREADONLYRETURN 指定返回的文件不带有只读复选框,不是在写保护的目录中。


OFN_NOTESTFILECREATE 指定文件不是在对话框关闭前建立的。如果应用程序保存文件到一个建立的非映象风格共享上,这个标记应该被指定的。当一个应用程序指定了这标记,库不能检查写保护,磁盘满,打开驱动器门或网络保护。应用程序使用这个标记必须小心执行文件操作,因为一旦文件被关闭,它不能重新打开。


OFN_NOVALIDATE 指定公共对话框允许在返回的文件名中有无效的字符。典型的,正在调用的程序使用一个钩子程序通过FILEOKSTRING消息检查文件名。如果在编辑控件中的文本框是空的或只包含了空格,那么文件和目录列表框是被更新的。如果编辑控件中的文本框包含了别的东西,那么nFileOffset和nFileExtension的设置值是通过分析文本产生的。没有默认的扩展名被添加到文本,也没有文本被复制到lpstrFileTitle指定的缓冲。


如果通过nFileOffset指定的值比0小,文件是无效的。否则,文件名是有效的。如果OFN_NOVALIDATE没有被指定,nFileExtension和nFileOffset可以被使用。


OFN_OVERWRITEPROMPT 如果选择的文件已经存在,使用另存为对话框产生一个消息框。用户必须确认是否覆盖这个文件。


OFN_PATHMUSTEXIST 指定用户仅能输入的路径和文件名。如果这个标记被使用并且用户在文件名输入字段中键入了一个用效的路径和文件名,对话框函数显示一个等待消息。


OFN_READONLY 当对话框建立时,显示被选择的只读复选框。这个标记指出当对话框被关闭时只读复选框的状态。


OFN_SHAREAWARE 指出如果调用OpenFile函数因为网络共享冲突而失败,这个错误被忽略并且对话框返回选择的文件名。


如果这个标记没有被设置,当用户选择的文件名发生网络共享冲突时,对话框发送通知到你的钩子程序。如果你设置了OFN_EXPLORER标记,对话框发送CDN_SHAREVIOLATION消息到钩子程序。如果你没有设置OFN_EXPLORER,对话框发送SHAREVISTRING注册的消息到钩子程序。


OFN_SHOWHELP 使对话框显示帮助按钮。hwndOwner成员必须指定一个窗口,这个窗口作为接收对话框发送的HELPMSGSTRING注册的消息,当用户单击帮助按钮时对话框发送这个消息。


当用户单击帮助按钮时,一个Explorer风格的对话框发送CDN_HELP通知消息到你的钩子程序。


折叠nFileOffset


指定从路径开始到通过lpstrFile指定的文件名字符串基于0的偏移,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。例如,如果lpstrFile指向下列的字符串,"c:\dir1\dir2\file.ext",这个成员包含指出"file.ext"字符串偏移的位置值13。


如果用户选择了多于一个的文件,nFileOffset是到第一个文件名的偏移。


折叠nFileExtension


指定从路径开始到通过lpstrFile指定的文件名字符串中扩展名基于0的偏移,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。例如,如果lpstrFile指向下列的字符串,"c:\dir1\dir2\file.ext",这个成员包含的值是18。如果用户没有输入一个扩展名并且lpstrDefExt是NULL,这个成员指定的偏移是结束字符NULL。如果用户在文件名中输入一个"."作为最后的字符,这个成员是0。


折叠lpstrDefExt


指向包含默认扩展名的缓冲。如果用户忘记输入扩展名,GetOpenFileName和GetSaveFileName附加这个扩展名到文件名中。这个字符串可以是任一长度,但但只有头三个字符被附加。字符串不应该包含一个句点(.)。如果这个成员是NULL并且用户忘记了输入一个扩展名,那么将没有扩展名被附加。


折叠lCustData


指定应用程序定义的数据,这数据是能被lpfnHook成员识别的系统传到的钩子程序。当系统发送WM_INITDIALOG消息到程序,消息的lParam参数指向当对话框建立时指定的OPENFILENAME结构。钩子程序可以使用这个指针获得lCustData的值。


折叠lpfnHook


指向一个钩子程序。除非Flags成员中包含OFN_ENABLEHOOK标记,要么这个成员将被忽略。


如果在Flags成员中OFN_EXPLORER标记没有被设置,lpfnHook指向一个OFNHookProcOldStyle钩子程序,这个程序有意的从对话框接收消息。钩子程序返回FALSE传递一个消息到默认的对话框程序或返回TRUE丢弃消息。


如果OFN_EXPLORER被设置,lpfnHook指向一个OFNHookProc钩子程序。这个钩子程序接收从对话框发出的通知消息。这个钩子程序也接收你通过一个子对话框模板定义的附加控件的消息。钩子程序不有意接收默认对话框的标准控件的消息。


折叠lpTemplateName


指向一个以空字符结束的字符串,字符串是对话框模板资源的名字,资源保存在能被hInstance成员识别的模块中。对于有限的对话框资源,这可以是通过MAKEINTRESOURCE返回的值。除非在Flags成员中设置了OFN_ENABLETEMPLATE标记,要么这个成员被忽略。


如果OFN_EXPLORER标记被设置,系统使用指定的模板去建立一个对话框,是默认Explorer风格对话框的子窗口。如果OFN_EXPLORER标记没有被设置,系统使用模板去建立一个旧风格的对话框来替代默认对话框。


pvReserved


保留。


dwReserved


保留。


FlagsEx


Windows 2000:设置位标记,你可以使用来初始化对话框。这个成员可以是下列标记的组合。 标记 含意


OFN_EX_NOPLACESBAR 如果这个标记被设置,则位置栏被不显示。如果这个标记没有设置,则Explorer风格的对话框包含一般使用文件图标的位置栏,例如像收藏夹和桌面。


切记:#include 




CHOOSEFONT            STRUCT
  lStructSize         DWORD  ?          ;结构长度  
  hwndOwner           DWORD  ?          ;所处窗口
  hdc                 DWORD  ?   
  lpLogFont           DWORD  ?          ;指向一个LOGFONT结构
  iPointSize          DWORD  ?          ;选择的字体大小
  Flags               DWORD  ?          ;标志
  rgbColors           DWORD  ?          ;选择的字体颜色
  lCustData           DWORD  ?          ;
  lpfnHook            DWORD  ? 
  lpTemplateName      DWORD  ?   
  hInstance           DWORD  ?
  lpszStyle           DWORD  ?
  nFontType           WORD   ?
  Alignment           WORD   ?
  nSizeMin            DWORD  ?
  nSizeMax            DWORD  ?
CHOOSEFONT            ENDS




CHOOSECOLOR           STRUCT ? 
  LStructSize         DWORD  ?           ;结构长度
  HwndOwner           DWORD  ?           ;所属窗口
  HInstance           DWORD  ?
  rgbResult           DWORD  ?           ;用户选择的颜色值
  lpCustColors        DWORD  ?           ;用户自定义颜色缓冲区
  Flags               DWORD  ?           ;标志
  lCustData           DWORD  ?           
  lpfnHook            DWORD  ?
  lpTemplataName      DWORD  ?
CHOOSECOLOR           ENDS




PAGESETUPDLG          STRUCT ?
  LStructSize         DWORD  ?            ;结构长度
  HwndOwner           DWORD  ?            ;所属窗口
  hDevMode            DWORD  ?            ;指向DEVMODE结构
  hDevNames           DWORD  ?            ;指向DEVNAMES结构
  Flags               DWORD  ?            ;标志
  PtPaperSize         POINT  ?            ;返回纸张尺寸
  RtMinMargin         RECT   ?            ;返回最小允许的页边距
  rtMargin            RECT   ?            ;返回用户选择的页边距
  hInstance           DWORD  ?            
  lCustData           DWORD  ?            
  lpfnPageSetupHook   DWORD  ? 
  lpfnPagePaintHook   DWORD  ?
  lpPageSetupTemplateName   DWORD  ?
  hPageSetupTemplate  DWORD   ?
PAGESETUPDLG          ENDS

API函数:

PageSetupDlg()

功能:
该函数创建一个PageSetup对话框,此对话框能使用户指定打印页的属性。这些属性包括纸张大小和来源,送纸方向和页边距。

原型:
BOOL PageSetupDlg(LPPAGESETUPDLGI ppsd)
参数:
Ippsd:指向一个包含初始化对话框信息的PAGESETUPDLG结构。当函数返回时,该结构存放有关用户选择的信息

返回值:
返回如果用户点击OK钮,返回值为非零值,Ippsp参数指向的PAGESETUPDLG结构中的成员显示用户的选择。如果用户取消或关闭PageSetup对话框或错误出现,返回值为零


GetSaveFileName()
功能:
该函数创建一个Save公共对话框,以便用户指定驱动器、目录和文件名
原型:
BOOL GetSaveFileName(LPOPENFILENAME Ipofn)
参数:
Ipofn:指向一个包含初始化对话框信息的OPENFILENAME结构。当GetsaveFileName函数返回时,此结构含有关于用户文件选择的信息。
返回值:
如果用户指定了一个文件名且点击OK按钮,返回值为非零值。由OPENFILENAME结构中的归IpstrFile成员指向的缓冲区含有全路径和用户指定的文件名。如果用户取消或关闭Save对话框或错误出现,返回值为零


GetOpenFileName()

功能:
创建一个Open公共对话框,使用户指定驱动器、目录和文件名、或使用户打开文件
原型:
BOOL GetOpenFileName(LPOPENFILENAME Ipofn);
参数;
Ipofn:指向包含初始化对话框的信息的一个OPENFILENAME结构。当OpenfileName函数返回时,此结构包含有关用户文件选择的信息。
返回值:
如果用户指定了一个文件名,点击OK按钮,返回值为非零。由OPENFILENAME结构的IPstrFile成员指向的缓冲区含有全路径和用户指定的文件名。如果用户取消或关闭Open对话框或错误出现,返回值为零。


ChooseColor()
功能:
该函数创建一个能使用户从中选择颜色的通用颜色对话框
原型:
BOOL ChooseColor(LPCHOOSECOLOR IpCC);
参数;
lpCC:指向一个包括初始化对话框信息的CHOOSECOLOR结构。当ChooseColor函数返回时,此结构含有有关用户颜色选择的信息。
返回值:
如果用户点击对话框中的OK按钮,返回值为非零值。CHOOSECOLOR结构中的rgbResult成员含有用户选择的颜色的RGB颜色值。如果用户取消或关闭Color对话框或错误出现,返回值为零。


ChooseFont()

功能:
该函数创建一个使用户选择逻辑字体属性的对话框,这些属性包括字体名称、字体风格(如粗体、斜体或正常体)、字号、效果(如强调线,下划线或字体颜色)和手写体(或字符集)。
原型:
BOOL ChooseFont(LPCHOOSEFONT Ipcf)
参数:
Ipcf:指向一个含有初始化对话框信息的CHOOSEFONT结构。当返回ChooseFont函数时,此结构含有用户对字体选择的信息。

返回值:

如果用户点击对话框的OK按钮,返回值为非零值,CHOOSEFONT结构中的成员表明用户的选择。如果用户取消或关闭Font对话框或出现错误信息,返回值为零。





你可能感兴趣的:(汇编)