如何增大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定位并修改输入控件的字体,步骤如下:
- 先定义所需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
- 编写包装函数,在调用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
相关产品推荐
相关产品推荐

