| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 832 人关注过本帖, 1 人收藏
标题:VFP的软“BUG”,怎么突破限制?
取消只看楼主 加入收藏
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:241
专家分:508
注 册:2014-6-12
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:7 
VFP的软“BUG”,怎么突破限制?
图片附件: 游客没有浏览图片的权限,请 登录注册

VFP的软“BUG”,怎么突破限制?
搜索更多相关主题的帖子: BUG 限制 VFP 
2024-04-26 10:29
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:241
专家分:508
注 册:2014-6-12
收藏(1)
得分:0 
以下是引用easyppt在2024-4-27 08:34:47的发言:



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

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

非常感谢楼上各位的回答。百度半天windows api,看代码太复杂太难了。这个方法确实高级。谢谢!
2024-04-27 19:42
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:241
专家分:508
注 册: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
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:241
专家分:508
注 册: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
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:241
专家分:508
注 册: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
帖 子:241
专家分:508
注 册:2014-6-12
收藏
得分:0 
以下是引用sych在2024-4-30 11:17:13的发言:

round()好像是多余的
测试时忘记删除了
2024-04-30 11:31
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:241
专家分:508
注 册:2014-6-12
收藏
得分:0 
找到了:
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
2024-04-30 11:45
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:241
专家分:508
注 册:2014-6-12
收藏
得分:0 
不仅仅是打大字,设计器用。VFP限制这里的数字只能是4~127
图片附件: 游客没有浏览图片的权限,请 登录注册
2024-05-07 17:44
快速回复:VFP的软“BUG”,怎么突破限制?
数据加载中...
 
   



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

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