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调用一次,不再更多。

+0

在那里,我再次忽略简单的事情-.- 你,我的朋友,是一个天才。您的响应激发了我在WM_PAINT消息中更改了调用BeginPaint的代码,并仅将该函数用于TextOut()函数。 非常感谢:) – Timmy

+0

@Timmy,常见的做法是将'BeginPaint'中的'HDC'传递给函数。 – chris