You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何增大Visual FoxPro中ACCEPT命令的条码显示字体大小?

解决Visual FoxPro中ACCEPT命令输入条码字体过小的问题

方案一:用INKEY()模拟ACCEPT命令(自定义实现)

完全基于VFP原生代码实现,无需依赖外部组件,可自由控制提示和输入内容的字体大小,适配RDP场景:

FUNCTION CustomAccept(cPrompt, nFontSize, cFontName)
    LOCAL cInput, nKey, nRow, nCol
    cInput = ""
    nRow = 5  && 可调整提示与输入内容的显示行位置
    nCol = 2  && 可调整显示列位置
    
    && 设置全局屏幕字体,也可单独为@SAY指定字体
    _screen.FontSize = nFontSize
    _screen.FontName = cFontName
    
    && 清除当前行旧内容
    @ nRow, nCol CLEAR TO nRow, 80
    
    && 显示提示文字
    @ nRow, nCol SAY cPrompt + ": "
    
    DO WHILE .T.
        nKey = INKEY(0)  && 等待按键输入
        
        DO CASE
            CASE nKey = 13  && 回车键,结束输入
                EXIT
            CASE nKey = 27  && ESC键,取消输入
                cInput = ""
                EXIT
            CASE nKey = 127  && 退格键,删除最后一个字符
                IF NOT EMPTY(cInput)
                    cInput = LEFT(cInput, LEN(cInput)-1)
                    && 更新显示内容,先清除原有输入区域
                    @ nRow, nCol + LEN(cPrompt) + 2 SAY SPACE(20)
                    @ nRow, nCol + LEN(cPrompt) + 2 SAY cInput
                ENDIF
            CASE nKey >= 32 AND nKey <= 126  && 捕获可打印字符
                cInput = cInput + CHR(nKey)
                && 实时更新显示输入的条码
                @ nRow, nCol + LEN(cPrompt) + 2 SAY cInput
        ENDCASE
    ENDDO
    
    && 可选:恢复屏幕原有字体,根据实际需求调整
    * _screen.FontSize = 10
    * _screen.FontName = "MS Sans Serif"
    
    RETURN cInput
ENDFUNC

修改原业务代码调用该函数即可:

_screen.FontSize=20
_screen.FontName='Arial'
DO WHILE .T.
    cBarCode = CustomAccept('Barcode', 20, 'Arial')
    IF EMPTY(cBarCode)
        EXIT
    ENDIF
    INSERT INTO barcodes VALUE (cBarCode)
ENDDO

该方案优势是完全可控,不会像INPUTBOX那样遮挡移动端全屏,且无需重构现有@GET或表单逻辑。

方案二:调用Windows API修改原生ACCEPT对话框字体

如果坚持使用原生ACCEPT命令,可通过Windows API定位并修改输入控件的字体,步骤如下:

  1. 先定义所需API函数:
DECLARE INTEGER FindWindow IN user32;
    STRING lpClassName, STRING lpWindowName

DECLARE INTEGER FindWindowEx IN user32;
    INTEGER hWndParent, INTEGER hWndChildAfter;
    STRING lpClassName, STRING lpWindowName

DECLARE INTEGER SendMessage IN user32;
    INTEGER hWnd, INTEGER Msg, INTEGER wParam, INTEGER lParam

DECLARE INTEGER CreateFont IN gdi32;
    INTEGER nHeight, INTEGER nWidth, INTEGER nEscapement;
    INTEGER nOrientation, INTEGER fnWeight, INTEGER fdwItalic;
    INTEGER fdwUnderline, INTEGER fdwStrikeOut, INTEGER fdwCharSet;
    INTEGER fdwOutputPrecision, INTEGER fdwClipPrecision;
    INTEGER fdwQuality, INTEGER fdwPitchAndFamily, STRING lpszFaceName

DEFINE CONSTANT WM_SETFONT = 0x0030
DEFINE CONSTANT FW_NORMAL = 400
  1. 编写包装函数,在调用ACCEPT前创建自定义字体并启动线程查找对话框:
FUNCTION AcceptWithBigFont(cPrompt, nFontSize, cFontName)
    LOCAL hFont, cResult
    cResult = ""
    
    && 创建指定大小的字体(nHeight参数需乘以2适配VFP逻辑)
    hFont = CreateFont(-nFontSize*2, 0, 0, 0, FW_NORMAL, 0, 0, 0, 0, 0, 0, 0, 0, cFontName)
    
    && 生成临时PRG文件用于异步查找对话框(避免ACCEPT阻塞主线程)
    LOCAL cTempPrg
    cTempPrg = SYS(2015) + ".prg"
    STRTOFILE("PARAMETERS hFont" + CHR(13) + ;
        "LOCAL hWndDlg, hWndEdit" + CHR(13) + ;
        "DO WHILE .T." + CHR(13) + ;
        "hWndDlg = FindWindow('#32770', 'Microsoft Visual FoxPro')" + CHR(13) + ;
        "IF hWndDlg <> 0" + CHR(13) + ;
        "EXIT" + CHR(13) + ;
        "ENDIF" + CHR(13) + ;
        "INKEY(0.1)" + CHR(13) + ;
        "ENDDO" + CHR(13) + ;
        "hWndEdit = FindWindowEx(hWndDlg, 0, 'Edit', '')" + CHR(13) + ;
        "IF hWndEdit <> 0" + CHR(13) + ;
        "SendMessage(hWndEdit, WM_SETFONT, hFont, 1)" + CHR(13) + ;
        "ENDIF", cTempPrg)
    
    && 启动异步线程执行临时PRG
    DO (cTempPrg) WITH hFont
    && 调用原生ACCEPT命令
    ACCEPT cPrompt TO cResult
    && 删除临时PRG文件
    DELETE FILE (cTempPrg)
    
    RETURN cResult
ENDFUNC

调用示例:

_screen.FontSize=20
_screen.FontName='Arial'
DO WHILE .T.
    cBarCode = AcceptWithBigFont('Barcode', 20, 'Arial')
    IF EMPTY(cBarCode)
        EXIT
    ENDIF
    INSERT INTO barcodes VALUE (cBarCode)
ENDDO

注意:该方案依赖VFP对话框的类名与标题,不同版本或特殊RDP环境下可能需要微调参数,稳定性略逊于方案一。

内容的提问来源于stack exchange,提问作者Andrus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:15:30