【问题标题】:WinAPI text output in CC语言中的WinAPI文本输出
【发布时间】:2013-06-20 16:02:10
【问题描述】:

我是 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。

我需要进行文本输出并且为文本加载图片是不切实际的。有什么帮助吗?

【问题讨论】:

  • 喜欢TextOut 函数?
  • 是的,有点。但我不能使用 PAINSTRUCT 的东西。
  • “PAINSTRUCT”+1 :)

标签: c multithreading winapi text


【解决方案1】:

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

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

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

【讨论】:

  • 线程中的循环是无限的; deleteDC 永远不会被调用。我不确定它为什么在那里(改编了这段代码)。当程序退出时,循环执行。
  • @Yuri Kahn:MakeSurface 中有一个 DeleteDC,靠近代码示例的底部,就在它创建线程之前。那应该是一个 ReleaseDC。线程 proc 中的 DeleteDC 可能是为了清理 hdcMem 而不是 hdc,但是,你是对的,它永远不会被调用。
猜你喜欢
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 2021-06-21
  • 1970-01-01
  • 2017-04-08
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多