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

Posted

技术标签:

【中文标题】自定义函数中的 WINAPI BeginPaint 和 TextOut 多次调用【英文标题】:WINAPI BeginPaint and TextOut multiple calls within custom function 【发布时间】:2012-06-09 11:43:45 【问题描述】:

我在 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);


它在一个“控件”类中,调用如下:

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) 开始以红色显示,但第二行不打印任何内容。但是,如果我删除第一行,第二行也可以正常工作。

请注意:我在描述时可能在这里使用了同义词paint和print。

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

再次提前感谢各位, 非常感谢您的时间和答案。

【问题讨论】:

【参考方案1】:

文档很清楚地说明了

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

所以你应该每个WM_PAINT 调用一次,不要再调用了。

【讨论】:

我又去忽略简单的事情了-.-你,我的朋友,是个天才。您的回复激发了我更改代码以在 WM_PAINT 消息中调用 BeginPaint 并将该函数仅用于 TextOut() 函数。非常感谢:) @Timmy,一个常见的做法是将您从BeginPaint 获得的HDC 传递给函数。

以上是关于自定义函数中的 WINAPI BeginPaint 和 TextOut 多次调用的主要内容,如果未能解决你的问题,请参考以下文章

自定义控件,winapi

Delphi 定义外部 WinAPI 函数的类型

关于VC++的Winmain函数(WINAPI是啥?)

winApi 32 图标定义

关于VC++的Winmain函数(WINAPI是啥?)

子类化组合框时如何抑制自动搜索(Win32/WinAPI)