WINAPI BeginPaint和TextOut在自定义函数中多次调用
问题描述:
我已经在我的printText函数中打了另一面墙,并且一直在寻找一段时间,但没有运气的解决方案。WINAPI BeginPaint和TextOut在自定义函数中多次调用
基本上,在WM_PAINT消息中调用printText函数来将文本绘制到win32窗口。它工作正常,但只有一个电话。如果我尝试用不同的参数第二次调用该函数,则不会出现任何情况。
我确定我只是完全忽略了一些东西,但我看不出它可能是什么。
的功能如下:
void controls::printText(unsigned char R, unsigned char G, unsigned char B, int x, int y, LPCSTR text, HWND parent, PAINTSTRUCT pss, HDC hdc)
{
hdc = BeginPaint(parent, &pss);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(R,G,B));
TextOut(hdc, x, y, text, strlen(text));
EndPaint(parent, &pss);
}
这是一个 '对照' 类内部和呼叫如下:
HDC hdc, hdc2;
PAINTSTRUCT ps, ps2;
ctrls->printText(255,0,0,30,50,"Test text",hWnd,ps,hdc);
ctrls->printText(255,0,0,30,80,"test text 2",hWnd,ps2,hdc2);
有两个(2)HDC和PAINTSTRUCT声明作为我一直在玩代码试图找到一个解决方案;我尝试从函数中删除paintstruct和hdc参数,并让它们在函数内部作为本地声明(这对我来说没有多大意义)而没有成功。
基本上,第一线,
ctrls->printText(255,0,0,30,50,"Test text",hWnd,ps,hdc);
会做,因为它应该和打印“测试文本”,在红,从(30,50),但第二行不显示任何信息。如果我删除第一行,但是,第二行也可以正常工作。
请注意:在描述时,我可能在这里使用油漆和同义字。
我想我已经包括了相关的一切在这里,但如果需要任何其他的代码只是让我知道,我会尽快发布它,因为我看到消息:)提前
再次感谢球员, 你的时间和答案非常感谢。
答
的文档很清楚地指出
应用程序不应调用BeginPaint除了响应 WM_PAINT消息。
因此,您应该每WM_PAINT
调用一次,不再更多。
在那里,我再次忽略简单的事情-.- 你,我的朋友,是一个天才。您的响应激发了我在WM_PAINT消息中更改了调用BeginPaint的代码,并仅将该函数用于TextOut()函数。 非常感谢:) – Timmy
@Timmy,常见的做法是将'BeginPaint'中的'HDC'传递给函数。 – chris