Я пытаюсь нарисовать в памяти картинку (несколько строк с текстом), но почему-то выводится только последняя строчка!... Может кто чего предложит...? Код (Text): void RenderFont(int x, int y, int size, char *str, char *fontname, void *buf, int w, int h) { HDC hdc=GetDC(NULL); HDC mdc = CreateCompatibleDC(hdc); HBITMAP bm = CreateCompatibleBitmap(hdc,w,h); HFONT hf=CreateFont(size, 0, 0, 0, 400, FALSE, FALSE, FALSE, 0, 0, 0, ANTIALIASED_QUALITY, 0, fontname); //RECT r; //r.top=0; //r.left=0; //r.right=w; //r.bottom=h; SelectObject(mdc, bm); //FillRect(mdc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH)); SelectObject(mdc, hf); SetBkMode(mdc, TRANSPARENT); SetTextColor(mdc, 0xFFFFFF); TextOut(mdc, x, y, str, strlen(str)); BITMAPINFOHEADER bmi; bmi.biSize=sizeof(BITMAPINFOHEADER); bmi.biWidth=256; bmi.biHeight=256; bmi.biPlanes=1; bmi.biBitCount=32; bmi.biCompression=BI_RGB; GetDIBits(mdc,bm,0,256,buf,(BITMAPINFO *) &bmi,DIB_RGB_COLORS); DeleteObject(hf); DeleteObject(bm); } int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { int buf[256*256]; RenderFont(0,20,40,".the .test","Courier New", buf,256,120); RenderFont(2,60,40,".the .test","Courier New", buf,256,120); MessageBox(NULL,"See texture.tga","System message",MB_OK); SaveTexture("texture.tga",buf); return 0; }
NaZGuL Буфер для изображения - buf. Каждый раз в RenderFont он заполняется _новым_ изображением. Например, в RenderFont можно выполнять SetDIBits из переданного buf.
NaZGuL Код (Text): void RenderFont( DWORD x, DWORD y, DWORD size, char *str, char *fontname, void *buf, DWORD w, DWORD h) { HDC hdc = GetDC(NULL); HDC mdc = CreateCompatibleDC(hdc); HBITMAP bm = CreateCompatibleBitmap(hdc, w, h); HFONT hf = CreateFont(size, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH, fontname); SelectObject(mdc, bm); BITMAPINFO bmi; bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); bmi.bmiHeader.biWidth = w; bmi.bmiHeader.biHeight = h; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; SetDIBits(mdc, bm, 0, w, buf, &bmi, DIB_RGB_COLORS); SelectObject(mdc, hf); SetBkMode(mdc, TRANSPARENT); SetTextColor(mdc, 0xFFFFFF); TextOut(mdc, x, y, str, lstrlen(str)); GetDIBits(mdc,bm,0,256,buf,&bmi,DIB_RGB_COLORS); DeleteObject(hf); DeleteObject(bm); } int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) { int buf[256*256]; RtlZeroMemory(buf, sizeof(buf)); ...