注册 登录
编程论坛 VFP论坛

VFP的软“BUG”,怎么突破限制?

kangss 发布于 2024-04-26 10:29, 702 次点击
只有本站会员才能查看附件,请 登录

VFP的软“BUG”,怎么突破限制?
27 回复
#2
csyx2024-04-26 12:33
何必跟它死磕,换用微软的公用对话框(),调用它的 ShowFont 方法得了
不喜 ocx 的话,用 ChooseFont api 也行

[此贴子已经被作者于2024-4-26 20:20编辑过]

#3
easyppt2024-04-26 14:16
二楼能看到图片?
我为什么看不到
#4
laowan0012024-04-26 15:52
回复 3楼 easyppt
用edge可看
#5
sych2024-04-26 16:13
这个没办法,如果需要字号大于127,单独搞个text记录
或者你可以在后台自动翻倍,比如选择10,自动乘2,相当于20,这样最大就可以达到254了
#6
easyppt2024-04-27 08:34
以下是引用laowan001在2024-4-26 15:52:39的发言:

用edge可看


用EDGE登录,确实可以看到了,谢谢 !

用2楼的方法代码:
loFont = createobject('')
loFont.ShowFont()
messagebox(loFont.fontsize)

#7
吹水佬2024-04-27 10:11
以下是引用easyppt在2024-4-26 14:16:55的发言:

二楼能看到图片?
我为什么看不到

可能是“证书”的问题
如果点击图标或复制图片连接打开,有提示 bbs_bccn_net.bccnsoft.com 字样时,点击页面空白处并键入thisisunsafe 返回原图片页面就可以。




#8
kangss2024-04-27 19:42
以下是引用easyppt在2024-4-27 08:34:47的发言:



用EDGE登录,确实可以看到了,谢谢 !

用2楼的方法代码:
loFont = createobject('')
loFont.ShowFont()
messagebox(loFont.fontsize)

非常感谢楼上各位的回答。百度半天windows api,看代码太复杂太难了。这个方法确实高级。谢谢!
#9
csyx2024-04-27 22:59
以下是引用kangss在2024-4-27 19:42:40的发言:
百度半天windows api,看代码太复杂太难了。这个方法确实高级。谢谢!

现成的,很容易改成自己的增强型 GetFont 函数
https://


[此贴子已经被作者于2024-4-27 23:02编辑过]

#10
sych2024-04-28 11:34
**代码就是上面网站里的
**不知道默认字体大小在哪里设置?
clea
DECLARE INTEGER ChooseFont IN comdlg32 STRING @lpcf
DECLARE INTEGER GlobalFree IN kernel32 INTEGER hMem
DECLARE INTEGER GlobalAlloc IN kernel32;
    INTEGER wFlags,;
    INTEGER dwBytes

#DEFINE LF_FACESIZE               32
#DEFINE FW_NORMAL                400
#DEFINE DEFAULT_CHARSET            1
#DEFINE OUT_DEFAULT_PRECIS         0
#DEFINE CLIP_DEFAULT_PRECIS        0
#DEFINE DEFAULT_QUALITY            0
#DEFINE DEFAULT_PITCH              0
#DEFINE CF_SCREENFONTS             1
#DEFINE CF_INITTOLOGFONTSTRUCT    64
#DEFINE CF_EFFECTS               256
#DEFINE CF_FORCEFONTEXIST      65536

LOCAL lcChooseFont, lcLogFont, hLogFont, lcFontFace
lcLogFont = bintoc(16,"rs") +;
    bintoc(0,"rs")  +;
    bintoc(0,"rs")  +;
    bintoc(0,"rs")  +;
    bintoc(FW_NORMAL,"rs") +;  &&粗体900,常规400
    Chr(0) +;  &&斜体
    Chr(0) +;  &&下划线
    Chr(0) +;  &&删除线
    Chr(DEFAULT_CHARSET)     +;
    Chr(OUT_DEFAULT_PRECIS)  +;
    Chr(CLIP_DEFAULT_PRECIS) +;
    Chr(DEFAULT_QUALITY)     +;
    Chr(DEFAULT_PITCH)       +;
    PADR("Times New Roman"+Chr(0),32)  &&字体名称
lnLogFontSize = 60
hLogFont = GlobalAlloc(0, lnLogFontSize)
= SYS(2600,hLogFont, lnLogFontSize, lcLogFont)
lcChooseFont = bintoc(60,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(hLogFont-2^31,"r") +;
    BINTOC(4000,"rs") +;  &&字体大小,好像是这里但没起作用
    bintoc(CF_SCREENFONTS + CF_EFFECTS +CF_INITTOLOGFONTSTRUCT + CF_FORCEFONTEXIST,"rs") +;
    bintoc(RGB(255,0,0),"rs") +;  &&颜色
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs")

IF ChooseFont (@lcChooseFont) <> 0
    lcLogFont=SYS(2600,hLogFont, lnLogFontSize)
    ? "*** CHOOSEFONT Structure:"
    ? "Point size:", CTOBIN(SUBSTR(lcChooseFont, 17,4),"rs")/10
    ? "RGB color: ", ctobin(SUBSTR(lcChooseFont, 25,4),"rs")

    ?
    ? "*** LOGFONT Structure:"
    ? "Font Weight:", ctobin(SUBSTR(lcLogFont, 17,4),"rs")
    ? "Italic:     ", Iif(Asc(SUBSTR(lcLogFont, 21,1))=0, "No","Yes")
    ? "Underline:  ", Iif(Asc(SUBSTR(lcLogFont, 22,1))=0, "No","Yes")
    ? "Strikeout:  ", Iif(Asc(SUBSTR(lcLogFont, 23,1))=0, "No","Yes")

    lcFontFace = SUBSTR(lcLogFont, 29)
    lcFontFace = SUBSTR(lcFontFace, 1, AT(Chr(0),lcFontFace)-1)
    ? "Font Face:  ", lcFontFace
ENDIF

= GlobalFree (hLogFont)
RETURN
**不知道默认字体大小在哪里设置?
#11
nbwww2024-04-28 12:44
还是没看懂  上面说的只是一个字体的选择框   
表单上的字体能用吗?选择了字体以后表单上能实现?
试了一下  超过了范围还是非法值
#12
csyx2024-04-29 07:46
以下是引用sych在2024-4-28 11:34:55的发言:
**不知道默认字体大小在哪里设置?

LogFont 结构的第一个成员 lfHeight 就是,不过要指定的是字体逻辑高度,而非字号
例如:对于 DPI 为 120 的屏幕来说,80 -> 48点,267 -> 160点
lfHeight 的算法:
Function lfHeight(iPoint)
    *-- 省略了 api 函数 GetDC、ReleaseDC、GetDeviceCaps、MulDiv 的 Declare
    Local hDC, iHeight
    hDC = GetDC(_Screen.hWnd)
    iHeight = - MulDiv(iPoint, GetDeviceCaps(hDC, 90), 72)    && 90 <- LOGPIXELSY
    ReleaseDC(_Screen.hWnd, hDC)
    Return iHeight
EndFunc

把 lcLogFont = bintoc(16,"rs") +; .... 这里的 16 改成上面函数计算出来的高度值,就是字体选择对话框的初始字号

#13
sych2024-04-29 09:47
谢谢赐教,已动手实验成功!
#14
kangss2024-04-29 20:01
以下是引用csyx在2024-4-29 07:46:21的发言:


LogFont 结构的第一个成员 lfHeight 就是,不过要指定的是字体逻辑高度,而非字号
例如:对于 DPI 为 120 的屏幕来说,80 -> 48点,267 -> 160点
lfHeight 的算法:
Function lfHeight(iPoint)
    *-- 省略了 api 函数 GetDC、ReleaseDC、GetDeviceCaps、MulDiv 的 Declare
    Local hDC, iHeight
    hDC = GetDC(_Screen.hWnd)
    iHeight = - MulDiv(iPoint, GetDeviceCaps(hDC, 90), 72)    && 90 <- LOGPIXELSY
    ReleaseDC(_Screen.hWnd, hDC)
    Return iHeight
EndFunc

把 lcLogFont = bintoc(16,"rs") +; .... 这里的 16 改成上面函数计算出来的高度值,就是字体选择对话框的初始字号
厉害!谢谢!
#15
schtg2024-04-30 05:50
回复 12楼 csyx
谢谢!
#16
kangss2024-04-30 10:45
把“lfHeight()”补全
FUNCTION lfHeight(iPoint)
    DECLARE LONG GetDC IN win32api LONG
    DECLARE LONG ReleaseDC IN win32api LONG, LONG
    DECLARE LONG GetDeviceCaps IN win32api LONG, LONG
    DECLARE LONG MulDiv IN win32api LONG, LONG, LONG

    LOCAL hDC, iHeight
    hDC = GetDC(_SCREEN.HWND)        && 0 是取windows系统的
    * 2024.04.30 测试执行该函数
    * MulDiv(iPoint, GetDeviceCaps(hDC, 90), 72):传入数字“字体逻辑高度”返回“字号”
    * MulDiv(iPoint, 72, GetDeviceCaps(hDC, 90)):传入数字“字号”返回“字体逻辑高度”
    iHeight = ROUND(MulDiv(iPoint, GetDeviceCaps(hDC, 90), 72),1)    && 90 <- LOGPIXELSY
    ReleaseDC(_SCREEN.HWND, hDC)

    RETURN iHeight
ENDFUNC
#17
sych2024-04-30 11:17
round()好像是多余的
#18
csyx2024-04-30 11:26
以下是引用sych在2024-4-30 11:17:13的发言:

round()好像是多余的

是的,MulDiv 只会返回整数。实际上,MulDiv(x,y,z) 就是 Round(x*y/z, 0)

#19
kangss2024-04-30 11:30
以下是引用sych在2024-4-28 11:34:55的发言:

**代码就是上面网站里的
**不知道默认字体大小在哪里设置?
clea
DECLARE INTEGER ChooseFont IN comdlg32 STRING @lpcf
DECLARE INTEGER GlobalFree IN kernel32 INTEGER hMem
DECLARE INTEGER GlobalAlloc IN kernel32;
    INTEGER wFlags,;
    INTEGER dwBytes

#DEFINE LF_FACESIZE               32
#DEFINE FW_NORMAL                400
#DEFINE DEFAULT_CHARSET            1
#DEFINE OUT_DEFAULT_PRECIS         0
#DEFINE CLIP_DEFAULT_PRECIS        0
#DEFINE DEFAULT_QUALITY            0
#DEFINE DEFAULT_PITCH              0
#DEFINE CF_SCREENFONTS             1
#DEFINE CF_INITTOLOGFONTSTRUCT    64
#DEFINE CF_EFFECTS               256
#DEFINE CF_FORCEFONTEXIST      65536

LOCAL lcChooseFont, lcLogFont, hLogFont, lcFontFace
lcLogFont = bintoc(16,"rs") +;
    bintoc(0,"rs")  +;
    bintoc(0,"rs")  +;
    bintoc(0,"rs")  +;
    bintoc(FW_NORMAL,"rs") +;  &&粗体900,常规400
    Chr(0) +;  &&斜体
    Chr(0) +;  &&下划线
    Chr(0) +;  &&删除线
    Chr(DEFAULT_CHARSET)     +;
    Chr(OUT_DEFAULT_PRECIS)  +;
    Chr(CLIP_DEFAULT_PRECIS) +;
    Chr(DEFAULT_QUALITY)     +;
    Chr(DEFAULT_PITCH)       +;
    PADR("Times New Roman"+Chr(0),32)  &&字体名称
lnLogFontSize = 60
hLogFont = GlobalAlloc(0, lnLogFontSize)
= SYS(2600,hLogFont, lnLogFontSize, lcLogFont)
lcChooseFont = bintoc(60,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(hLogFont-2^31,"r") +;
    BINTOC(4000,"rs") +;  &&字体大小,好像是这里但没起作用
    bintoc(CF_SCREENFONTS + CF_EFFECTS +CF_INITTOLOGFONTSTRUCT + CF_FORCEFONTEXIST,"rs") +;
    bintoc(RGB(255,0,0),"rs") +;  &&颜色
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs") +;
    bintoc(0,"rs")

IF ChooseFont (@lcChooseFont) <> 0
    lcLogFont=SYS(2600,hLogFont, lnLogFontSize)
    ? "*** CHOOSEFONT Structure:"
    ? "Point size:", CTOBIN(SUBSTR(lcChooseFont, 17,4),"rs")/10
    ? "RGB color: ", ctobin(SUBSTR(lcChooseFont, 25,4),"rs")

    ?
    ? "*** LOGFONT Structure:"
    ? "Font Weight:", ctobin(SUBSTR(lcLogFont, 17,4),"rs")
    ? "Italic:     ", Iif(Asc(SUBSTR(lcLogFont, 21,1))=0, "No","Yes")
    ? "Underline:  ", Iif(Asc(SUBSTR(lcLogFont, 22,1))=0, "No","Yes")
    ? "Strikeout:  ", Iif(Asc(SUBSTR(lcLogFont, 23,1))=0, "No","Yes")

    lcFontFace = SUBSTR(lcLogFont, 29)
    lcFontFace = SUBSTR(lcFontFace, 1, AT(Chr(0),lcFontFace)-1)
    ? "Font Face:  ", lcFontFace
ENDIF

= GlobalFree (hLogFont)
RETURN
**不知道默认字体大小在哪里设置?
我测试的结果:粗体为啥是700呢?
#20
kangss2024-04-30 11:31
以下是引用sych在2024-4-30 11:17:13的发言:

round()好像是多余的
测试时忘记删除了
#21
kangss2024-04-30 11:45
找到了:
0    FW_DONTCARE
100    FW_THIN
200    FW_EXTRALIGHT或FW_ULTRALIGHT
300    FW_LIGHT
400    FW_NORMAL或FW_REGULAR
500    FW_MEDIUM
600    FW_SEMIBOLD或FW_DEMIBOLD
700    FW_BOLD
800    FW_EXTRABOLD或FW_ULTRABOLD
900    FW_HEAVY或FW_BLACK
#22
sych前天 07:59
只有本站会员才能查看附件,请 登录

我原来搞的小玩意,字号这块就束手无策,不得不增加了个文本框单独设置
#23
星光悠蓝前天 09:27
想要超大号字体,可以调用WORD来在打印,没必要死嗑VFP;
也可以用USE命令打开FRX报表文件,直接在表中更改!
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
#24
kangss前天 17:44
不仅仅是打大字,设计器用。VFP限制这里的数字只能是4~127
只有本站会员才能查看附件,请 登录
#25
星光悠蓝前天 20:25
以下是引用kangss在2024-5-7 17:44:42的发言:

不仅仅是打大字,设计器用。VFP限制这里的数字只能是4~127

是什么喜好,交互界面设计需要这么大的字号
#26
sych前天 22:39
只有本站会员才能查看附件,请 登录

比如这里的红5月,字号超过了127
#27
schtg昨天 05:47
回复 26楼 sych
高!
#28
星光悠蓝昨天 09:09
以下是引用sych在2024-5-7 22:39:49的发言:


比如这里的红5月,字号超过了127

仁者见仁,智者见智,实现的方法有多种。
1