如何在WinAPI中将TrueType字体绘制为像素数组?

时间:2018-08-08 18:56:42

标签: winapi fonts gdi true-type-fonts

有一些WinAPI函数将TrueType字体绘制到Windows GDI上下文中。

我想将此TrueType文本写入,但写入我自己的2维像素数组中(我只是用此代码将其涂抹在窗口上:)

int blit_mode =  STRETCH_DELETESCANS; 

void BlitFrame() 
{ 
  BITMAPINFO bmi = {  {sizeof(BITMAPINFOHEADER), frame_size_x, -frame_size_y,1,32,BI_RGB,0,0,0,0,0}, {0,0,0,0} };
  SetStretchBltMode(hdc, blit_mode); 
  int result = StretchDIBits(hdc, 
             0, 0, client_x, client_y, 
             0, 0, frame_size_x, frame_size_y, 
             frame_bitmap, 
             &bmi, 
             DIB_RGB_COLORS, 
             SRCCOPY); 
} 

这段代码在WinAPI中非常混乱,我(至少到目前为止)不知道如何做到这一点。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

tnx Barmak Shemirani

我得到了您的代码并产生了类似的内容

void BlitFrame2()
{

 BITMAPINFO bmi = {  {sizeof(BITMAPINFOHEADER), frame_size_x, -frame_size_y,1,32,BI_RGB,0,0,0,0,0}, {0,0,0,0} };


HDC  memdc = CreateCompatibleDC(hdc);
HBITMAP  hbitmap = CreateBitmap(frame_size_x, frame_size_y, 1, 32, frame_bitmap);
HGDIOBJ  oldbmp = SelectObject(memdc, hbitmap);

SetBkMode(memdc, TRANSPARENT);
SetTextColor(memdc, 0xffffff);
TextOut(memdc, 0, 0, "123", 3);

SelectObject(memdc, oldbmp);
GetDIBits(memdc, hbitmap, 0, frame_size_y, frame_bitmap, &bmi, 0);
DeleteObject(hbitmap);
DeleteDC(memdc);

//  ReleaseDC(0, hdc);

SetStretchBltMode(hdc, blit_mode);

int result = StretchDIBits(hdc,
             0, 0, client_x, client_y,
             0, 0, frame_size_x, frame_size_y,
             frame_bitmap,
             &bmi,
             DIB_RGB_COLORS,
             SRCCOPY);
}

它将稳定的文本添加到tnx的边框中

但是,如果我不理解,我还会遇到一些问题

1)也许有人可以告诉我更多信息,它的工作方式以及内存传输的位置?我对用绘制的文本更新的此像素表有简单的字节访问权限吗? (例如,对其进行后处理)

2)它可以工作,但速度明显变慢,例如,当我的原始帧为2毫秒(先绘制一些位图精灵然后变灰)时,使用此驯服器的时间会长到8毫秒

3)我可以将其中一些呼叫移出帧循环吗?

PS 在考虑这个时,我认为它像那样工作 1)在某个点(哪里?)将其像素表复制到memdc中 2)它将这些字体吸引到此memdc 3)GetDIBits使用更改后的像素更新我的原始像素表(我不确定这种情况,但几乎可以肯定) 4)我像以前一样把它弄污了

如果不是这样,我会得到3分(因为它应该慢3倍, 测量显示它更像是4次,但可能是测量误差(例如2和8可能是2.7和8.1)

如果这是三个,就可以了,但是我想我并不总是需要从memdc更新那些表格像素,有没有办法 从memdc刮掉它吗? (然后,它的速度只会比原来慢3倍,而不是原来的2倍,但令人遗憾的是,那些笨拙的例程无法将stright渲染到我自己的ram表中-那就根本不会变慢)(真的有可能吗?)