ExtTextOut 文本的持续闪烁,在一段时间后,文本将恢复为默认字体
Constant Flickering of ExtTextOut text, and after a set amount of time the text reverts to the default font
这是我的第一篇文章,所以请原谅任何错误。
我正在使用win32 c ++,我有一个基本窗口,它将提供日期和时间(包括秒(,并相应地更新。此外,我已经这样做了,以便文本将根据鼠标位置稍微改变位置(几乎就像这个演示一样,https://css-tricks.com/animate-a-container-on-mouse-over-using-perspective-and-transform/但它会根据鼠标位置移动 x 和 y,而不是 z(。但是,每当我运行代码时,我的文本都会闪烁,它会瞬间变白,然后再次出现在屏幕上。我认为这是因为我两次绘制某些像素,但我不知道如何修复它。此外,经过一段时间(例如 1-2 分钟(,文本上的字体将恢复为默认字体。在调试期间,我可以看到进程内存不断增加到 20,然后字体更改为默认值,然后再次下降。有什么想法吗? 我想在本节的某个地方我搞砸了:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
#define SECOND_TIMER 2
case WM_TIMER:
if (wParam == SECOND_TIMER)
{
InvalidateRect(hWnd, NULL, TRUE); // invalidate whole window
}
break;
//case WM_ERASEBKGND:
// return 1;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
POINT point;
GetCursorPos(&point);
ScreenToClient(hWnd, &point);
ClickAnim(point.x, point.y, hdc);
SetTimer(hWnd, SECOND_TIMER, SECOND_TIMER, NULL);
HFONT hFont = CreateFont(70, 30, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, VARIABLE_PITCH, TEXT("Segoe UI Light"));
SelectObject(hdc, hFont);
TCHAR time[100];
TCHAR date[100];
SYSTEMTIME localTime;
GetLocalTime(&localTime);
wsprintfW(time, L"%.2u:%.2u:%.2u", localTime.wHour, localTime.wMinute, localTime.wSecond);
switch (localTime.wMonth)
{
case 1:
wsprintfW(date, L"Jan %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 2:
wsprintfW(date, L"Feb %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 3:
wsprintfW(date, L"Mar %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 4:
wsprintfW(date, L"Apr %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 5:
wsprintfW(date, L"May %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 6:
wsprintfW(date, L"Jun %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 7:
wsprintfW(date, L"Jul %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 8:
wsprintfW(date, L"Aug %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 9:
wsprintfW(date, L"Sep %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 10:
wsprintfW(date, L"Oct %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 11:
wsprintfW(date, L"Nov %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
case 12:
wsprintfW(date, L"Dec %.2u, %.2u", localTime.wDay, localTime.wYear);
break;
}
RECT desktop;
// Get a handle to the desktop window
const HWND hDesktop = GetDesktopWindow();
// Get the size of screen to the variable desktop
GetClientRect(hDesktop, &desktop);
// TODO: Add any drawing code that uses hdc here...
//get dimensions of window
RECT rect;
GetClientRect(hWnd, &rect);
HWND desktophWnd = GetDesktopWindow();
ExtTextOut(hdc, rect.right / 2 - 95 - point.x / 100, rect.bottom / 2 - 40 - point.y / 100, ETO_OPAQUE, NULL, time, _tcslen(time), NULL);
HFONT smallFont = CreateFont(35, 15, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, VARIABLE_PITCH, TEXT("Segoe UI"));
SelectObject(hdc, smallFont);
ExtTextOut(hdc, rect.right / 2 - 85 - point.x / 100, rect.bottom / 2 - 70 - point.y / 100, ETO_OPAQUE, NULL, date, _tcslen(date), NULL);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
在绘制过程中调用CreateFont
几次,但从不从设备上下文中取消选择该字体,也不会删除字体对象。 由于字体始终相同,因此只需创建一次并重复使用该对象即可。 这将减少一些油漆时间。
至于闪烁,应该FALSE
要InvalidateRect
的第三个参数(以便在调用BeginPaint
时不会擦除背景(。当您去绘制窗口时,请擦除要填充的窗口部分(可能包括时间的先前位置(。 在打电话之前也要做尽可能多的工作BeginPaint
。这将减少闪烁,但可能无法完全消除它。要完全消除它,需要某种双重缓冲。
相关文章:
- 文本文件中的单词链表
- 从命令行c++发送文本文件名
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- ExtTextOut 文本的持续闪烁,在一段时间后,文本将恢复为默认字体
- 写入文本文件的数据部分损坏且无法恢复
- Flashdrive损坏的文件系统上的文本文件恢复
- qt 样式 QPalette::窗口文本颜色在应用程序启动后恢复
- 如何在MFC功能包应用程序中禁用菜单栏项中的文本恢复