如何使用winapi将文本绘制到字节数组

时间:2013-09-18 16:13:03

标签: c++ winapi

我需要将文本绘制到字节数组,以便稍后将其转换为DirectX11纹理。 我正在尝试许多想法,比如这样:

HDC hdc= GetDC( g_hWnd );
int w= 600;
int h= 450;
    unsigned* buf= new unsigned [w*h];
for( int a=0;a<w*h;a++)buf[a]= 0x0;
HBITMAP hbmp= CreateBitmap( w, h, 1, 4*8, buf );    
if(!hbmp)throw "error bmp";
HDC vhdc= CreateCompatibleDC( hdc );
if(!vhdc)throw "error vhdc";
SelectObject( vhdc, hbmp );
TextOut( vhdc, 0, 0, L"TEST", 4 );

但那之后buf仍然是空的。 我需要它介绍64KB,所以我不能使用大型库。

这是我尝试的另一个不能正常工作的代码:

unsigned* buf= new unsigned [w*h];
for( int a=0;a<w*h;a++)buf[a]= 0x0;
HDC vhdc= CreateCompatibleDC( hdc );    if(!vhdc)throw "vhdc is hard";
HBITMAP hbmp= CreateCompatibleBitmap( hdc, w, h );
BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER),w,-h,1,32,BI_RGB,0,0,0,0,0},{0,0,0,0}};
SelectObject( vhdc, hbmp );
TextOut( vhdc, 0, 0, L"TEST", 4 );

BITMAPINFO bmpi;
ZeroMemory( &bmpi, sizeof(bmpi) );
//GetDIBits(vhdc, hbmp, 0, h, buf, &bmpi, NULL);
GetDIBits(vhdc, hbmp, 0, h, buf, &bmpi, BI_RGB);

我使用vhdc和hdc作为GetDIBits参数,不是它的工作原理。

2 个答案:

答案 0 :(得分:1)

jlahd已经回答了这个问题。 但是,如果有人需要,我会发布工作代码。

HDC hdc= GetDC( g_hWnd );  /// g_hWnd is my windows handle type HWND
int w= 1024;
int h= 768;

unsigned* buf= new unsigned [w*h];

HDC vhdc= CreateCompatibleDC( hdc );    if(!vhdc)throw "error with vhdc";
HBITMAP hbmp= CreateCompatibleBitmap( hdc, w, h );
BITMAPINFO bmpi = {{sizeof(BITMAPINFOHEADER),w,-h,1,32,BI_RGB,0,0,0,0,0},{0,0,0,0}};
SelectObject( vhdc, hbmp );
TextOut( vhdc, 10, 10, L"HELLO WORLD", 11 );
GetDIBits(vhdc, hbmp, 0, h, buf, &bmpi, BI_RGB);

之后,代码buf存储了带有“HELLO WORLD”图像的数据。

答案 1 :(得分:0)

CreateBitmap仅使用给定数据作为输入。在绘制缓冲区时不会更新缓冲区。您应该使用CreateDIBSection代替。