|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cyChar = tm.tmHeight + tm.tmExternalLeading;
cxChar = tm.tmAveCharWidth;
cxCat = (tm.tmPitchAndFamily & 1) ? 3 : 2 / 2 * cxChar;
ReleaseDC(hwnd, hdc);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
for (i = 0; i < 100; i++)
{
StringCchPrintf(szBuffer1, 128, TEXT("%d: %s"), i + 1, TEXT("I Love fish.com!"));
StringCchLength(szBuffer1, 128, &iTarget1);
TextOut(hdc, 0, i *cyChar, szBuffer1, iTarget1);
StringCchPrintf(szBuffer2, 128, TEXT("%s"), TEXT("My Fist Windows BianCheng Xue xi!"));
StringCchLength(szBuffer2, 128, &iTarget2);
TextOut(hdc, 30 * cxCat , i * cyChar, szBuffer2, iTarget2);
}
EndPaint(hwnd, &ps);
szBuffer1里总共才19个字符, 我第二列 用30 * cxCat 为什么还会重叠在一起
是的,在您的代码中,`cxChar` 和 `cxCat` 的计算都是基于单个字符的宽度,而不是整个文本的宽度。
具体来说:
- **`cxChar`:** 这是 `tm.tmAveCharWidth`,表示字体的平均字符宽度。这个值是单个字母的平均宽度,并不针对具体的某个字母,而是整个字体的一个平均值。
- **`cxCat`:** 您的计算方式(`3` 或 `2 / 2 * cxChar`)是在针对单个字符或一部分字符的宽度来决定 `cxCat`。默认情况下这个计算是基于单个字符的,如果使用 `cxChar` 计算,也是表示单个字符的宽度。
在您的应用场景中,如果要为特定的列计算位置(比如通过 `30 * cxCat`),通常意味着您在为每行的列之间预留足够的宽度,以便适应平均字符宽度情况下的字符排列。
如果您需要计算整个文本的宽度,应该使用如 `GetTextExtentPoint32` 这类函数来计算文本整体宽度。这将针对整段文本计算它实际需要的像素宽度。这样可以更好地处理文本中混合大小写和不同字符造成的宽度变化。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|