按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
invoke StrokePath,hDC ;(1)
invoke FillPath,hDC ;(2)
invoke StrokeAndFillPath,hDC ;(3)
第(1)个函数沿着路径用当前画笔绘画线条,第(2)个函数使用当前画刷填充路径围起来的区域,第(3)个函数既使用当前画笔绘画边线也使用当前画刷填充中间区域。当执行了任何一个函数的时候,路径都会被破坏掉。实际上,这些函数完成的功能就相当于7。2。3
节中的画线和填充函数,那么为什么要这样大动干戈呢?惟一的好处就是用这种方法可以操作很复杂的形状,因为定义路径时可以使用任何画线函数,包括画弧与画贝塞尔曲线函数等,而用普通的填充函数是无法填充出一个由贝塞尔曲线围成的区域的。
路径的另一个用途是定义一个复杂形状的区域,可以使用下面的函数将路径转化成区域:
invoke PathToRegion,hDC
mov hRgn,eax
理由是同样的,因为用区域创建函数创建出来的只能是椭圆、矩形、多边形等形状的组合,用先创建路径再转化成区域的方法可以定义形状复杂得多的区域。同样,执行了PathToRegion函数以后,原有的路径定义就会被破坏掉。
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第8章 通用对话框
8。1 通用对话框简介
Windows操作系统为一些常用功能提供了一些通用对话框(mon Dialog Box),比如在不同的应用程序中进行打开文件、选择字体、选择颜色等操作时,不同程序显示的对话框的模样都是一样的。另外,把同样的应用程序放到不同版本的Windows下执行就会发现,这些对话框会随着操作系统版本的不同而不同,如图8。1所示,选择同样的“打开”文件菜单项时,在Windows XP下显示的对话框是左边的样子,而在Windows 98下显示的是右边的样子,但程序中并没有为不同版本的操作系统设计不同的对话框。造成这些现象的原因就是这些对话框是操作系统提供的,实现对话框的代码包括在dlg32。dll库文件中,由于不同版本的dlg32。dll在设计上可能有所不同,所以不同版本Windows下的对话框会有所不同。
图8。1 不同操作系统下的“打开”文件对话框
8。1 通用对话框简介
通用对话框函数由dlg32。dll提供,所以在使用之前需要在源程序中包含相应的include和includelib语句:
include dlg32。inc
includelib dlg32。lib
Windows提供多种通用对话框,每种通用对话框都使用一个专用的函数来创建和显示,另外,提供一个数据结构供初始化对话框使用,并在同一个数据结构中返回用户在对话框中输入的数据。使用这些对话框是很简单的,只需要填写结构中的初始化数据,然后调用函数并把结构地址传入就可以了。
dlg32。dll中提供的通用对话框如表8。1所示,表中还包括创建这些对话框使用的函数以及数据结构名称。
表8。1 通用对话框列表
通用对话框
使 用 函 数
使用数据结构
选择颜色
ChooseColor
CHOOSECOLOR
查找字符串
FindText
FINDREPLACE
替换字符串
ReplaceText
FINDREPLACE
选择字体
ChooseFont
CHOOSEFONT
打开文件
GetOpenFileName
OPENFILENAME
保存文件
GetSaveFileName
OPENFILENAME
页面设置
PageSetupDlg
PAGESETUPDLG
在这些对话框中,查找字符串和替换字符串的对话框是非模态的,方便用户在查找到一个字符串以后,不必关闭对话框就可以继续查找另一个字符串,其他的对话框都是模态对话框。通用对话框使用的例子可以参考所附光盘的Chapter08mDlg目录中的代码,包括汇编源代码mDlg。asm和资源脚本文件mDlg。rc。mDlg。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 dlg32。inc
includelib dlg32。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 (?)
nst
FINDMSGSTRING db 'mdlg_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
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 代码段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
de
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 页面设置对话框
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_PageSetup proc
local @stPS:PAGESETUPDLG
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第8章 通用对话框
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
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》