⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 008.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:
8.1 通用对话框简介

Windows操作系统为一些常用功能提供了一些通用对话框(Common Dialog Box),比如在不同的应用程序中进行打开文件、选择字体、选择颜色等操作时,不同程序显示的对话框的模样都是一样的。另外,把同样的应用程序放到不同版本的Windows下执行就会发现,这些对话框会随着操作系统版本的不同而不同,如图8.1所示,选择同样的“打开”文件菜单项时,在Windows XP下显示的对话框是左边的样子,而在Windows 98下显示的是右边的样子,但程序中并没有为不同版本的操作系统设计不同的对话框。造成这些现象的原因就是这些对话框是操作系统提供的,实现对话框的代码包括在Comdlg32.dll库文件中,由于不同版本的Comdlg32.dll在设计上可能有所不同,所以不同版本Windows下的对话框会有所不同。



图8.1  不同操作系统下的“打开”文件对话框

8.1  通用对话框简介

通用对话框函数由Comdlg32.dll提供,所以在使用之前需要在源程序中包含相应的include和includelib语句:

  include comdlg32.inc

  includelib  comdlg32.lib

Windows提供多种通用对话框,每种通用对话框都使用一个专用的函数来创建和显示,另外,提供一个数据结构供初始化对话框使用,并在同一个数据结构中返回用户在对话框中输入的数据。使用这些对话框是很简单的,只需要填写结构中的初始化数据,然后调用函数并把结构地址传入就可以了。

Comdlg32.dll中提供的通用对话框如表8.1所示,表中还包括创建这些对话框使用的函数以及数据结构名称。

 

表8.1  通用对话框列表

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

在这些对话框中,查找字符串和替换字符串的对话框是非模态的,方便用户在查找到一个字符串以后,不必关闭对话框就可以继续查找另一个字符串,其他的对话框都是模态对话框。通用对话框使用的例子可以参考所附光盘的Chapter08\CommDlg目录中的代码,包括汇编源代码CommDlg.asm和资源脚本文件CommDlg.rc。CommDlg.asm文件的内容如下:

.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 等值定义

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ICO_MAIN equ  1000

DLG_MAIN equ  1000

IDM_MAIN equ  1000

IDM_OPEN equ  1101

IDM_SAVEAS equ  1102

IDM_PAGESETUP   equ  1103

IDM_EXIT equ  1104

IDM_FIND equ  1201

IDM_REPLACE   equ  1202

IDM_SELFONT   equ  1203

IDM_SELCOLOR equ  1204

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data?

hInstance   dd     ?

hWinMain dd     ?

dwFontColor   dd     ?

dwBackColor   dd     ?

dwCustColors dd     16 dup (?)

stLogFont   LOGFONT   

szFileName db     MAX_PATH dup (?)

szBuffer db     1024 dup (?)

;********************************************************************

; 查找替换对话框使用

;********************************************************************

idFindMessage   dd   ?

stFind FINDREPLACE    

szFindText db   100 dup (?)

szReplaceText   db   100 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

db   ~All Files(*.*)~,0,~*.*~,0,0

szDefExt db   ~txt~,0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 代码段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 页面设置对话框

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_PageSetup proc

local @stPS:PAGESETUPDLG

 




8.1 通用对话框简介(2)
 


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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -