C语言中的WinAPI文本输出

C语言中的WinAPI文本输出,c,multithreading,winapi,text,C,Multithreading,Winapi,Text,我对WINAPI相当陌生,需要一些帮助来完成文本输出。我有一个用函数写入的像素阵列,然后使用以下函数定期在屏幕上闪烁: DWORD WINAPI tickThreadProc(HANDLE handle) { ShowWindow( hwnd, SW_SHOW ); HDC hdc = GetDC( hwnd ); hdcMem = CreateCompatibleDC( hdc ); HBITMAP hbmOld = (HBITMAP)SelectObject( hdcMem, hbmp );

我对WINAPI相当陌生,需要一些帮助来完成文本输出。我有一个用函数写入的像素阵列,然后使用以下函数定期在屏幕上闪烁:

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 );
}
这是根据我在网上找到的一些代码修改的。像素结构有4个整数表示r、g、b和a


我需要做文本输出和加载文本图片是不切实际的。有什么帮助吗?

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

要在此窗口中绘制文本,可以使用类似或使用该DC的函数(在释放它之前)


PAINTSTRUCT用于处理WM_PAINT消息(这是绘制窗口的更常见方式)。看起来你是在尝试定期直接从另一个线程中绘制。GDI不太擅长处理多线程,因此这种方法可能会有一些问题。但是如果你的BitBlt正常工作,那么文本输出也应该正常工作。

喜欢这个功能吗?是的,有点像。但是我不能使用PAINSTRUCT的东西。+1表示“PAINSTRUCT”:)线程中的循环是无限的;永远不会调用deleteDC。我不知道它为什么会出现(改编了这段代码)。当程序退出时,循环会退出。@Yuri Kahn:在MakeSurface中有一个DeleteDC,靠近代码示例的底部,就在它创建线程之前。那应该是一次释放。线程进程中的DeleteDC可能是为了清理hdcMem而不是hdc,但是,您是对的,它永远不会被调用。