gpt4 book ai didi

c++ - WM_TIMER 动画闪烁

转载 作者:太空宇宙 更新时间:2023-11-04 15:51:23 25 4
gpt4 key购买 nike

好吧,我正在使用一个 50 毫秒消逝时间的计时器来制作一些移动文本的动画(从技术上讲,它在文本之间滚动)。
问题是,如果你仔细观察,你会看到文字在闪烁,我希望它不要闪烁..

所以我不太擅长动画,但是我可以做些什么来减少闪烁吗?也许更快的流逝时间?或者我什至应该为此使用计时器吗?

编辑:
所以我尝试实现双缓冲,显然我正在做一些事情。

这是没有双缓冲的代码,它工作正常但有点闪烁。

void PaintScrollingText(ScrollingText *Settings, WPARAM wParam)
{
HDC hdc;
PAINTSTRUCT ps;
HANDLE hOldFont;
RECT rect;

hdc = wParam ? (HDC)wParam : BeginPaint(Settings->hWnd, &ps);

hOldFont = SelectObject(hdc, Settings->hFont);

SetTextColor(hdc, Settings->crForeGnd);
SetBkColor(hdc, Settings->crBackGnd);

GetClientRect(Settings->hWnd, &rect);

rect.right -= Settings->txt1XOffset;
DrawText(hdc, Settings->szText1, -1, &rect, DT_RIGHT);

rect.right += Settings->txt1XOffset - Settings->txt2XOffset;
DrawText(hdc, Settings->szText2, -1, &rect, DT_RIGHT);

SelectObject(hdc, hOldFont);

if (!wParam) EndPaint(Settings->hWnd, &ps);
}

这是我的代码,双缓冲。

void PaintScrollingText(ScrollingText *Settings, WPARAM wParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;

GetClientRect(Settings->hWnd, &rect);

hdc = wParam ? (HDC)wParam : BeginPaint(Settings->hWnd, &ps);

// Create off-screen DC
HDC hdcMem = CreateCompatibleDC(hdc);

// Create a bitmap to draw on
HBITMAP MemBitmap = CreateCompatibleBitmap(hdc, rect.right - rect.left, rect.bottom - rect.top);

// Select bitmap into off-screen DC
HGDIOBJ OldBitmap = SelectObject(hdcMem, MemBitmap);

// Erase background
HBRUSH hbrBkGnd = CreateSolidBrush(0x000000);
FillRect(hdcMem, &rect, hbrBkGnd);
DeleteObject(hbrBkGnd);

// Set font and color
HGDIOBJ hOldFont = SelectObject(hdcMem, Settings->hFont);
SetTextColor(hdcMem, Settings->crForeGnd);
SetBkColor(hdcMem, Settings->crBackGnd);

// Draw text
rect.right -= Settings->txt1XOffset;
DrawText(hdcMem, Settings->szText1, -1, &rect, DT_RIGHT);

rect.right += Settings->txt1XOffset - Settings->txt2XOffset;
DrawText(hdcMem, Settings->szText2, -1, &rect, DT_RIGHT);

// Blt the changes to the screen DC.
BitBlt(hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, hdcMem, 0, 0, SRCCOPY);

// Select old font
SelectObject(hdcMem, hOldFont);

// Done with offscreen DC and bitmap
SelectObject(hdcMem, OldBitmap);
DeleteObject(MemBitmap);
DeleteDC(hdcMem);

if (!wParam) EndPaint(Settings->hWnd, &ps);
}

第一个文本打印正常,但第二个看起来像这样:

这里是没有双缓冲的完整代码:http://dl.dropbox.com/u/35314071/ScrollingTextClass.zip
这里是双缓冲的完整代码:http://dl.dropbox.com/u/35314071/ScrollingTextClass2.zip

最佳答案

好吧,我调试了这个程序(如果你只是逐行调试代码,你会发现令人惊讶的东西),并且在你调用 BitBlt 的地方,你传递参数

BitBlt(hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, hdcMem, 0, 0, SRCCOPY); 

检查调试器中的值显示 rect.right - rect.left 不是窗口的完整大小,而是窗口的一部分,因为您仍然有 rect 中的值.right 从该行遗留下来

rect.right += Settings->txt1XOffset - Settings->txt2XOffset;  

您忘记将 rect.right 设置回其原始值。

rect.right += Settings->txt2XOffset;

关于c++ - WM_TIMER 动画闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7680792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com