给你改了代码,你看看!

程序代码:
*----------------------------------
* API 函数声明
DECLARE INTEGER ChooseFont IN comdlg32.dll STRING @lpChooseFont
DECLARE INTE GlobalAlloc IN WIN32API integer,integer
DECLARE INTE GlobalFree IN win32api integer
* 常量定义
#DEFINE CF_SCREENFONTS 0x0001
#DEFINE CF_PRINTERFONTS 0x0002
#DEFINE CF_BOTH (CF_SCREENFONTS + CF_PRINTERFONTS)
#DEFINE CF_EFFECTS 0x0100
#DEFINE CF_FORCEFONTEXIST 0x10000
#DEFINE CF_INITTOLOGFONTSTRUCT 0x0040
#DEFINE CF_LIMITSIZE 0x2000
#DEFINE CF_NOVECTORFONTS 0x0800
#DEFINE CF_NOSCRIPTSEL 0x800000
#DEFINE CF_SCRIPTSONLY CF_NOSCRIPTSEL
#DEFINE CF_SELECTSCRIPT 0x400000
#DEFINE CF_APPLY 0x0200
#DEFINE CF_ANSIONLY 0x0400
#DEFINE CF_NOVERTFONTS 0x1000000
* LOGFONT 结构定义
#DEFINE LF_FACESIZE 32
* 字体权重常量
#DEFINE FW_NORMAL 400
#DEFINE FW_BOLD 700
* 字符集常量
#DEFINE ANSI_CHARSET 1
*----------------------------------
*创建一个表单,添加一个按钮,并在按钮的 Click 事件中使用以下代码:
LOCAL lcResult, laFont[7], lcMessage
* 调用字体对话框
lcResult = ShowFontDialog(_VFP.HWnd, 8, 72, "Arial", 12, .F., .F., RGB(0,0,0))
IF !EMPTY(lcResult)
* 解析返回结果
ALINES(laFont, lcResult, 0, CHR(0))
* 显示选择结果
lcMessage = "字体: " + laFont[1] + CHR(13) + ;
"字号: " + laFont[2] + CHR(13) + ;
"粗体: " + IIF(laFont[3] = "1", "是", "否") + CHR(13) + ;
"斜体: " + IIF(laFont[4] = "1", "是", "否") + CHR(13) + ;
"下划线: " + IIF(laFont[5] = "1", "是", "否") + CHR(13) + ;
"删除线: " + IIF(laFont[6] = "1", "是", "否") + CHR(13) + ;
"颜色值: " + laFont[7]
MESSAGEBOX(lcMessage, 64, "字体选择结果")
ELSE
MESSAGEBOX("用户取消了字体选择", 64, "提示")
ENDIF
FUNCTION CreateLogFont(tcFaceName, tnHeight, tnWeight, tnItalic, tnUnderline, tnStrikeOut)
LOCAL lcLogFont
* LOGFONT 结构 (60字节)
* 注意: VFP 中使用字符串模拟结构,需要按顺序填充所有字段
* lfHeight (Long)
lcLogFont = INT2WORD(LOWORD(tnHeight)) + INT2WORD(HIWORD(tnHeight))
* lfWidth (Long)
lcLogFont = lcLogFont + REPLICATE(CHR(0), 4)
* lfEscapement (Long)
lcLogFont = lcLogFont + REPLICATE(CHR(0), 4)
* lfOrientation (Long)
lcLogFont = lcLogFont + REPLICATE(CHR(0), 4)
* lfWeight (Long)
lcLogFont = lcLogFont + INT2WORD(LOWORD(tnWeight)) + INT2WORD(HIWORD(tnWeight))
* lfItalic (Byte)
lcLogFont = lcLogFont + CHR(tnItalic)
* lfUnderline (Byte)
lcLogFont = lcLogFont + CHR(tnUnderline)
* lfStrikeOut (Byte)
lcLogFont = lcLogFont + CHR(tnStrikeOut)
* lfCharSet (Byte)
lcLogFont = lcLogFont + CHR(ANSI_CHARSET)
* lfOutPrecision (Byte)
lcLogFont = lcLogFont + CHR(0)
* lfClipPrecision (Byte)
lcLogFont = lcLogFont + CHR(0)
* lfQuality (Byte)
lcLogFont = lcLogFont + CHR(0)
* lfPitchAndFamily (Byte)
lcLogFont = lcLogFont + CHR(0)
* lfFaceName (32 bytes)
lcLogFont = lcLogFont + PADR(tcFaceName, LF_FACESIZE, CHR(0))
RETURN lcLogFont
ENDFUNC
FUNCTION CreateChooseFont(tnStructSize, tnhWndOwner, tnhDC, tnlpLogFont, ;
tniPointSize, tnFlags, tnrgbColors, tnlCustData, ;
tnlpfnHook, tclpTemplateName, tnhInstance, tclpszStyle, ;
tniFontType, tniSizeMin, tniSizeMax)
LOCAL lcChooseFont
* CHOOSEFONT 结构 (60字节)
* 注意: 需要按顺序填充所有字段
* lStructSize (Long)
lcChooseFont = INT2WORD(LOWORD(tnStructSize)) + INT2WORD(HIWORD(tnStructSize))
* hwndOwner (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tnhWndOwner)) + INT2WORD(HIWORD(tnhWndOwner))
* hDC (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tnhDC)) + INT2WORD(HIWORD(tnhDC))
* lpLogFont (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tnlpLogFont)) + INT2WORD(HIWORD(tnlpLogFont))
* iPointSize (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tniPointSize)) + INT2WORD(HIWORD(tniPointSize))
* Flags (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tnFlags)) + INT2WORD(HIWORD(tnFlags))
* rgbColors (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tnrgbColors)) + INT2WORD(HIWORD(tnrgbColors))
* lCustData (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tnlCustData)) + INT2WORD(HIWORD(tnlCustData))
* lpfnHook (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tnlpfnHook)) + INT2WORD(HIWORD(tnlpfnHook))
* lpTemplateName (String - 4 bytes pointer)
lcChooseFont = lcChooseFont + REPLICATE(CHR(0), 4)
* hInstance (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tnhInstance)) + INT2WORD(HIWORD(tnhInstance))
* lpszStyle (String - 4 bytes pointer)
lcChooseFont = lcChooseFont + REPLICATE(CHR(0), 4)
* nFontType (Integer)
lcChooseFont = lcChooseFont + INT2WORD(tniFontType)
* 对齐填充 (2 bytes)
lcChooseFont = lcChooseFont + REPLICATE(CHR(0), 2)
* nSizeMin (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tniSizeMin)) + INT2WORD(HIWORD(tniSizeMin))
* nSizeMax (Long)
lcChooseFont = lcChooseFont + INT2WORD(LOWORD(tniSizeMax)) + INT2WORD(HIWORD(tniSizeMax))
RETURN lcChooseFont
ENDFUNC
* 辅助函数
FUNCTION INT2WORD(tnValue)
RETURN CHR(MOD(tnValue, 256)) + CHR(INT(tnValue/256))
ENDFUNC
FUNCTION LOWORD(tnValue)
RETURN MOD(tnValue, 65536)
ENDFUNC
FUNCTION HIWORD(tnValue)
RETURN INT(tnValue/65536)
ENDFUNC
FUNCTION ShowFontDialog
LPARAMETERS ;
tnhWndOwner, ;
tniSizeMin, ;
tniSizeMax, ;
tcInitFontName, ;
tniInitFontSize, ;
tlInitBold, ;
tlInitItalic, ;
tnInitColor, ;
tlShowEffects, ;
tlShowPrinterFonts
LOCAL lcLogFont, lcChooseFont, lnFlags, lnResult
LOCAL lcLogFontBuffer, lnLogFontPtr, lcReturn
* 设置默认参数
tnhWndOwner = IIF(EMPTY(tnhWndOwner), _VFP.HWnd, tnhWndOwner)
tniSizeMin = IIF(EMPTY(tniSizeMin), 0, tniSizeMin)
tniSizeMax = IIF(EMPTY(tniSizeMax), 0, tniSizeMax)
tcInitFontName = IIF(EMPTY(tcInitFontName), "Arial", tcInitFontName)
tniInitFontSize = IIF(EMPTY(tniInitFontSize), 10, tniInitFontSize)
tlInitBold = IIF(EMPTY(tlInitBold), .F., tlInitBold)
tlInitItalic = IIF(EMPTY(tlInitItalic), .F., tlInitItalic)
tnInitColor = IIF(EMPTY(tnInitColor), RGB(0,0,0), tnInitColor)
tlShowEffects = IIF(EMPTY(tlShowEffects), .T., tlShowEffects)
tlShowPrinterFonts = IIF(EMPTY(tlShowPrinterFonts), .F., tlShowPrinterFonts)
* 创建 LOGFONT 结构:转换为逻辑单位,无下划线,无删除线
lcLogFont = CreateLogFont(tcInitFontName, ;
-1 * (tniInitFontSize * 20), ;
IIF(tlInitBold, FW_BOLD, FW_NORMAL), ;
IIF(tlInitItalic, 1, 0), ;
0, ;
0)
* 为 LOGFONT 分配内存
lcLogFontBuffer = REPLICATE(CHR(0), LEN(lcLogFont))
lnLogFontPtr = STRTOVAR(lcLogFont, lcLogFontBuffer)
* 设置标志
lnFlags = CF_BOTH + CF_EFFECTS + CF_INITTOLOGFONTSTRUCT
IF tlShowEffects = .F.
lnFlags = BITAND(lnFlags, BITNOT(CF_EFFECTS))
ENDIF
IF tlShowPrinterFonts = .T.
lnFlags = BITAND(lnFlags, BITNOT(CF_SCREENFONTS)) + CF_PRINTERFONTS
ENDIF
IF tniSizeMin > 0 OR tniSizeMax > 0
lnFlags = lnFlags + CF_LIMITSIZE
ENDIF
* 创建 CHOOSEFONT 结构
lcChooseFont = CreateChooseFont(60, ; && lStructSize
tnhWndOwner, ; && hwndOwner
0, ; && hDC
lnLogFontPtr, ; && lpLogFont
0, ; && iPointSize
lnFlags, ; && Flags
tnInitColor, ; && rgbColors
0, ; && lCustData
0, ; && lpfnHook
"", ; && lpTemplateName
0, ; && hInstance
"", ; && lpszStyle
0, ; && nFontType
tniSizeMin, ; && nSizeMin
tniSizeMax) && nSizeMax
* 调用字体对话框
lnResult = ChooseFont(@lcChooseFont)
IF lnResult <> 0
* 从 CHOOSEFONT 结构中提取信息
LOCAL lnPointSize, lnColor, lcFaceName
* 获取点大小 (单位是1/10点)
lnPointSize = CTOBIN(SUBSTR(lcChooseFont, 17, 2), "2RS") * 65536 + ;
CTOBIN(SUBSTR(lcChooseFont, 19, 2), "2RS")
lnPointSize = lnPointSize / 10
* 获取颜色
lnColor = CTOBIN(SUBSTR(lcChooseFont, 25, 2), "2RS") * 65536 + ;
CTOBIN(SUBSTR(lcChooseFont, 27, 2), "2RS")
* 从 LOGFONT 结构中获取字体名称
lcFaceName = SUBSTR(lcLogFontBuffer, 29, LF_FACESIZE)
lcFaceName = LEFT(lcFaceName, AT(CHR(0), lcFaceName) - 1)
* 从 LOGFONT 结构中获取样式信息
LOCAL lnWeight, llBold, llItalic, llUnderline, llStrikeOut
lnWeight = CTOBIN(SUBSTR(lcLogFontBuffer, 17, 2), "2RS") * 65536 + ;
CTOBIN(SUBSTR(lcLogFontBuffer, 19, 2), "2RS")
llBold = (lnWeight >= FW_BOLD)
llItalic = (ASC(SUBSTR(lcLogFontBuffer, 21, 1)) <> 0)
llUnderline = (ASC(SUBSTR(lcLogFontBuffer, 22, 1)) <> 0)
llStrikeOut = (ASC(SUBSTR(lcLogFontBuffer, 23, 1)) <> 0)
* 返回结果
lcReturn = lcFaceName + CHR(0) + ;
TRANSFORM(lnPointSize) + CHR(0) + ;
IIF(llBold, "1", "0") + CHR(0) + ;
IIF(llItalic, "1", "0") + CHR(0) + ;
IIF(llUnderline, "1", "0") + CHR(0) + ;
IIF(llStrikeOut, "1", "0") + CHR(0) + ;
TRANSFORM(lnColor)
ELSE
lcReturn = ""
ENDIF
* 释放内存
= VarFree(lnLogFontPtr)
RETURN lcReturn
ENDFUNC
* 辅助函数 [color=#808080]- 将字符串复制到内存并返回指针[/color]
FUNCTION STRTOVAR(tcString, tcBuffer)
LOCAL lnPtr
* lnPtr [color=#808080]= SYS(2600, 0, LEN(tcBuffer))[/color]
lnPtr = globalalloc(0x42,LEN(tcBuffer))
= SYS(2600, lnPtr, LEN(tcBuffer), tcString)
RETURN lnPtr
ENDFUNC
* 辅助函数 [color=#808080]- 释放内存[/color]
FUNCTION VarFree(tnPtr)
IF tnPtr <> 0
* [color=#808080]= SYS(2600, tnPtr, 0, REPLICATE(CHR(0), 0))[/color]
=globalfree(tnPtr)
ENDIF
ENDFUNC
在win7+vfp9.0环境下运行通过!
图片附件: 游客没有浏览图片的权限,请
登录 或
注册