2013-06-20 65 views
0

我对WINAPI相当陌生,我需要一些帮助进行文本输出。我有写与功能,然后定期的blit到使用以下功能屏幕的像素的阵列:WinAPI文本输出C

DWORD WINAPI tickThreadProc(HANDLE handle) { 
ShowWindow(hwnd, SW_SHOW); 
HDC hdc = GetDC(hwnd); 
hdcMem = CreateCompatibleDC(hdc); 
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hbmp); 
int delay = 1000/fps; 
InitPhys(); 
LoadIMGs(); 
for (;;) { 
    onFrame(pixels); 

    BitBlt(hdc, gLeft, gTop, width, height, hdcMem, 0, 0, SRCCOPY); 
    // Wait 
    Sleep(delay); 
    // Physics 
    SimPhys(); 
} 
SelectObject(hdcMem, hbmOld); 
DeleteDC(hdc); 
return 0; 
} 


void MakeSurface(HWND hwnd) { 
BITMAPINFO bmi; 
bmi.bmiHeader.biSize = sizeof(BITMAPINFO); 
bmi.bmiHeader.biWidth = width; 
bmi.bmiHeader.biHeight = -height; // Order pixels from top to bottom 
bmi.bmiHeader.biPlanes = 1; 
bmi.bmiHeader.biBitCount = 32; // last byte not used, 32 bit for alignment 
bmi.bmiHeader.biCompression = BI_RGB; 
bmi.bmiHeader.biSizeImage = 0; 
bmi.bmiHeader.biXPelsPerMeter = 0; 
bmi.bmiHeader.biYPelsPerMeter = 0; 
bmi.bmiHeader.biClrUsed = 0; 
bmi.bmiHeader.biClrImportant = 0; 
bmi.bmiColors[0].rgbBlue = 0; 
bmi.bmiColors[0].rgbGreen = 0; 
bmi.bmiColors[0].rgbRed = 0; 
bmi.bmiColors[0].rgbReserved = 0; 
HDC hdc = GetDC(hwnd); 
// Create DIB section to always give direct access to pixels 
hbmp = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void**)&pixels, NULL, 0); 
DeleteDC(hdc); 
// Create a new thread to use as a timer 
hTickThread = CreateThread(NULL, 0, &tickThreadProc, NULL,0, NULL); 
} 

此被修改过的一些代码我在互联网上找到。像素结构对r,g,b和a有4个整数。

我需要做文本输出和加载文本的图片是不切实际的。任何帮助?

+3

像['TextOut'](http://msdn.microsoft.com/en-us/library/windows/desktop/dd145133%28v=vs.85%29.aspx)函数? –

+1

是的,有点。但我不能使用PAINSTRUCT的东西。 –

+0

'PAINSTRUCT':) +1 –

回答

1

首先,如果您使用GetDC获取设备上下文的句柄,则必须在完成后使用ReleaseDC。对于您创建的设备上下文,DeleteDC仅为

要在此窗口中绘制文本,您可以使用像TextOutDrawText这样的函数使用该DC(释放之前)。

PAINTSTRUCT用于处理WM_PAINT消息(这是更常见的绘制窗口方式)。它看起来像你正在试图直接从另一个线程定期绘制。 GDI并不擅长处理多线程,因此您可能会遇到这种方法的一些问题。但是如果你的BitBlts正在工作,那么TextOut也应该可以工作。

+1

线程中的循环是无限的; deleteDC永远不会被调用。我不知道为什么它在那里(改编此代码)。程序退出时,循环会执行。 –

+0

@Yuri Kahn:在创建线程之前,在代码示例附近的MakeSurface中有一个DeleteDC。这应该是一个ReleaseDC。线程proc中的DeleteDC可能是为了清理hdcMem而不是hdc,但是,你说得对,它永远不会被调用。 –