如何使用计时器绘制文本
How to draw Text with Timer?
我在WM_TIMER中使用了DrawText函数,但它不起作用。如何解决此问题?非常感谢。
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_CREATE:
SetTimer(hwnd,23, 1000,NULL);
break;
//case WM_TIMER: ***** dont work *****
case WM_PAINT: // ***** work, but used 25% CPU *****
{
RECT rect;
HFONT hFont;
hdc = BeginPaint(hwnd, &ps);
hFont = CreateFontA(16,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY, VARIABLE_PITCH,TEXT("Arial"));
SelectObject(hdc,hFont);
SetRect(&rect, 3, 3, 90, 50);
SetTextColor(hdc, RGB(0,0,255));
time_t rawtime;
struct tm * timeinfo;
char buffer [80];
time ( &rawtime );
timeinfo = localtime ( &rawtime );
strftime (buffer,80,"%I:%M:%S %pn%m/%d/%Y",timeinfo);
wchar_t wtext[30];
mbstowcs(wtext, buffer, strlen(buffer)+1);//Plus null
LPWSTR ptr = wtext;
DrawTextW(hdc, ptr, -1,&rect, DT_NOCLIP | DT_CENTER);
DeleteObject(hFont);
InvalidateRect(hwnd, &rect, TRUE);
UpdateWindow(hwnd);
EndPaint(hwnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wparam, lparam);
}
return 0;
}
不要从WM_PAINT
调用InvalidateRect()
或UpdateWindow()
,否则将创建一个无限循环的重新绘制。
不要从WM_TIMER
开始绘制。这可以(用GetWindowDC()
而不是BeginPaint()
,但这不是一个好主意
相反,将InvalidateRect()
放在WM_TIMER
中,并将绘图代码保留在WM_PAINT
中。正如@typ1232在评论中所说,你可以通过只创建一次字体来进行优化,但这并不是绝对必要的。
UpdateWindow()
调用通常是不必要的,除非您正处于紧张的CPU循环中,并且现在需要显示窗口:如果无效是在计时器中完成的,并且超时时间不太短,则不需要它。但如果超时时间很短,则可以在InvalidateRect()
之后强制重绘调用UpdateWindow()
。
WM_TIMER代码应该准备要绘制的字符串,保存它,然后调用InvalidateRect。WM_TIMER代码无法直接绘制,其中一个原因是BeginPaint在WM_TIMER消息期间无法正常工作。BeginPaint仅在WM_PAINT消息期间定义。因此,WM_TIMER可以准备要绘制的数据,但随后使用InvalidateRect请求生成WM_PAINT。
您还必须从WM_PAINT代码中删除InvalidateRect和UpdateWindow调用。它们会造成一个无限的绘画循环。
相关文章:
- SFML 文本未绘制在窗口上
- QPainter 将 QBrush 设置为 在 QT/C++ 中绘制文本
- 绘制文本问题
- SFML 2.4.2 - 绘制文本时出现分段错误
- 在 Qt C++ 中在自定义项委托上绘制文本时的性能问题
- QTool按钮上的文本未绘制
- 如何在透视视图中绘制文本
- Qt:用不同的字体绘制文本
- Linux绘制文本模式(无GUI,桌面)
- 如何在MFC中一一绘制单独的文本
- 使用Glstipple时,Oglft绘制文本
- 绘制文本和文本剪辑
- 有效地在 QPainterPath 周围绘制文本
- DirectWrite GDI 互操作:使用"IDWriteFontFace"绘制文本的简单方法
- 如何从文本中绘制这些数据
- DrawStatustext仅在后续呼叫上不在第一次呼叫上绘制文本
- SFML 在绘制文本时崩溃
- QPainter 未正确绘制文本
- 将文本绘制到屏幕
- 如何使用 WinAPI 将文本绘制到字节数组