WINAPI BeginPaint和TextOut自定义函数中的多个调用

时间:2012-06-09 11:43:45

标签: c++ winapi

我在printText函数中遇到了另一面墙,现在已经找了一段时间找不到运气的解决方案。

基本上,在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);

}

它在'controls'类中,调用如下:

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声明,因为我一直在尝试寻找解决方案的代码;我尝试从函数中删除painttruct和hdc参数,并将它们在函数内部声明为locals(这对我来说没有多大意义)但没有成功。

基本上,第一行,

ctrls->printText(255,0,0,30,50,"Test text",hWnd,ps,hdc);

将按照应有的方式打印“测试文本”,红色,从(30,50)开始,但第二行不打印任何内容。但是,如果我删除第一行,第二行也能正常工作。

请注意:我可能在描述时使用了油漆和同义词。

我想我已经包含了所有相关的内容,但是如果需要任何其他代码,请告诉我,我会在看到消息后立即发布:)

再次感谢你们, 非常感谢您的时间和答案。

1 个答案:

答案 0 :(得分:4)

文件清楚地说明了

  

应用程序不应该调用BeginPaint,除非响应a   WM_PAINT消息。

因此,您应该按WM_PAINT调用一次,而不是更多。