给你改了代码,你看看!

程序代码:
*----------------------------------
* 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环境下运行通过! 
	
		
			
        
				
				
					
						图片附件: 游客没有浏览图片的权限,请 
登录 或 
注册