| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1131 人关注过本帖, 1 人收藏
标题:VFP的软“BUG”,怎么突破限制?
只看楼主 加入收藏
nbwww
Rank: 8Rank: 8
等 级:贵宾
威 望:11
帖 子:333
专家分:804
注 册:2021-1-9
收藏
得分:0 
还是没看懂  上面说的只是一个字体的选择框   
表单上的字体能用吗?选择了字体以后表单上能实现?
试了一下  超过了范围还是非法值
2024-04-28 12:44
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:708
专家分:2833
注 册:2018-3-13
收藏
得分:0 
以下是引用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 改成上面函数计算出来的高度值,就是字体选择对话框的初始字号

收到的鲜花
  • kangss2024-04-29 20:06 送鲜花  1朵   附言:十分感谢

这家伙很懒,啥也没留下
2024-04-29 07:46
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
谢谢赐教,已动手实验成功!
2024-04-29 09:47
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:273
专家分:604
注 册:2014-6-12
收藏
得分:0 
以下是引用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 改成上面函数计算出来的高度值,就是字体选择对话框的初始字号
厉害!谢谢!
2024-04-29 20:01
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1732
专家分:3329
注 册:2012-2-29
收藏
得分:0 
回复 12楼 csyx
谢谢!
2024-04-30 05:50
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:273
专家分:604
注 册:2014-6-12
收藏
得分:0 
把“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
2024-04-30 10:45
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
round()好像是多余的
2024-04-30 11:17
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:708
专家分:2833
注 册:2018-3-13
收藏
得分:0 
以下是引用sych在2024-4-30 11:17:13的发言:

round()好像是多余的

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


这家伙很懒,啥也没留下
2024-04-30 11:26
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:273
专家分:604
注 册:2014-6-12
收藏
得分:0 
以下是引用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呢?
2024-04-30 11:30
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:273
专家分:604
注 册:2014-6-12
收藏
得分:0 
以下是引用sych在2024-4-30 11:17:13的发言:

round()好像是多余的
测试时忘记删除了
2024-04-30 11:31
快速回复:VFP的软“BUG”,怎么突破限制?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014273 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved