Winapi 使用TextOut逐字符渲染水平线与同时使用所有字符渲染水平线时的差异

Winapi 使用TextOut逐字符渲染水平线与同时使用所有字符渲染水平线时的差异,winapi,Winapi,我正在编写一个模拟控制台应用程序的win32低级gui应用程序。我使用固定宽度字体,我的测试使用Cascadia Mono,但我对任何固定宽度字体都有相同的问题 控制台应用程序正在尝试使用U2500字符绘制水平线 我一个接一个地输出应用程序传递给我的字符。当我这样做的时候,我得到了水平线之间的空格,当我在一个调用中输出文本输出时,这些空格被填补了 我使用VS C++窗口应用程序模板,并将此代码添加到WMXPrice处理< /P> auto nHeight = -MulDiv(48

我正在编写一个模拟控制台应用程序的win32低级gui应用程序。我使用固定宽度字体,我的测试使用Cascadia Mono,但我对任何固定宽度字体都有相同的问题

控制台应用程序正在尝试使用U2500字符绘制水平线

我一个接一个地输出应用程序传递给我的字符。当我这样做的时候,我得到了水平线之间的空格,当我在一个调用中输出文本输出时,这些空格被填补了

我使用VS C++窗口应用程序模板,并将此代码添加到WMXPrice处理< /P>

        auto nHeight = -MulDiv(48, GetDeviceCaps(hdc, LOGPIXELSY), 72);
        auto hfont = CreateFont(
            nHeight,
            0,
            0,
            0,
            100,//200,
            0,
            0,
            0,
            DEFAULT_CHARSET,
            OUT_OUTLINE_PRECIS,
            CLIP_DEFAULT_PRECIS,
            CLEARTYPE_QUALITY,
            FIXED_PITCH,
            L"Cascadia Mono"
            );
        TEXTMETRIC tm;
        SelectObject(hdc, hfont);

        GetTextMetrics(hdc, &tm);
        auto str = L"kkkkkk─────k";
        TextOut(hdc, 0, 0, L"kkkkkk─────k", 12);
        for (int i = 0; i < 12; i++)
        {
            TextOut(hdc, i * tm.tmAveCharWidth, tm.tmHeight,  &str[i], 1);
        }
auto-nHeight=-MulDiv(48,GetDeviceCaps(hdc,LOGPIXELSY),72);
auto-hfont=CreateFont(
嗯,
0,
0,
0,
100,//200,
0,
0,
0,
默认字符集,
在大纲和细节上,
剪辑\u默认值\u精确值,
CLEARTYPE_质量,
固定螺距,
L“卡斯卡迪亚莫诺”
);
textmetricTM;
选择对象(hdc、hfont);
GetTextMetrics(hdc和tm);
自动str=L“kkkk─────k”;
文本输出(hdc,0,0,L“kkkk─────k“,12);
对于(int i=0;i<12;i++)
{
TextOut(hdc,i*tm.tmavicharwidth,tm.tmHeight和str[i],1);
}
这显示

你可以看到,这不是因为我计算错了字符单元的宽度,字符串是精确对齐的,只是在上面的一个中添加了一些像素,还注意到连接处的一些额外的“旋钮”。V奇怪。还要注意的是,行开始前最后一个K的右边缘在char-by-char-one中被稍微截断,但在all-on-one中没有


那么为什么我要逐字符进行操作,因为我需要为每个单元格指定字体大小、bg、fg。

您可以使用更高级的文本输出,而不是使用TextOut,如下所示:

for (int i = 0; i < 12; i++)
{
    RECT rc;
    rc.left = i * tm.tmAveCharWidth;
    rc.top = tm.tmHeight;
    rc.right = rc.left + 50; // todo: make sure this is ok
    rc.bottom = rc.top + 100;
    DrawText(hdc, (LPWSTR)&str[i], 1, &rc, 0);
}
for(int i=0;i<12;i++)
{
RECT-rc;
rc.left=i*tm.tmAveCharWidth;
rc.top=tm.tmHeight;
rc.right=rc.left+50;//todo:确保这是正确的
rc.bottom=rc.top+100;
DrawText(hdc,(LPWSTR)和str[i],1和rc,0);
}
它似乎修复了它的“线条”,尽管它不是100%完全相同(有些像素显示出不同):


不知道光栅字体和/或
DrawText
是否也会发生同样的情况。如果两个连字符连在一起,可能就是连字。字体的一个功能。@JonathanPotter那么我应该怎么做?将您的调用分组到一起,以便在一次调用中呈现尽可能多的字符串。如果您实际更改每个字符的字体/颜色,则只需要逐个字符。JonathanPotter我刚刚在Windows终端上测试过,他们可以用不同的颜色绘制一条连续的水平线。我知道我可以批量处理类似的项目,并计划进行优化,但如果每个破折号都是不同的颜色,我就做不到。我想我需要了解他们是如何呈现文本的(我想是DirectText)