2013-06-20 99 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,但是,你說得對,它永遠不會被調用。 –