我对 MSDN 页面WM_PRINTCLIENT和相关功能的以下几个方面感到有些困惑:
我应该从窗口过程返回什么值?该文档完全缺少“返回值”部分。(在 Visual Studio 2012 离线文档光盘版本的页面中也没有。)Raymond Chen 的原始暂存程序返回零;这是首选吗?
的摘要和备注部分WM_PRINTCLIENT表明我应该只绘制客户区,但 LPARAM 列出了所有可能的WM_PRINT标志 - 那么我应该怎么做,忽略它并无条件地只绘制客户区或绘制所有请求的内容?(我对这个问题的意图不是对文档进行二次猜测;我只是希望正确实施此消息。)
为了方便/善意,我也想提供文档中WM_PAINT提到的 wParam 功能中的 DCWM_PAINT作为一个选项。在这种情况下我应该如何解释 LPARAM?或者有什么理由我不应该提供这条替代路线?(推论:如果 LPARAM 被忽略,我应该无条件绘制整个客户区吗?)
谢谢。
更新改写第三部分:
的文档WM_PAINT包括段落
对于一些常用控件,默认的 WM_PAINT 消息处理会检查 wParam 参数。如果 wParam 为非 NULL,则控件假定该值是 HDC 并使用该设备上下文进行绘制。
除了WM_PRINTCLIENT为了完整性之外,我还想在我的控制范围内提供这种行为。有什么理由我不应该这样做吗?如果这样做不会造成伤害,我应该如何解释 lParam,我应该如何绘制整个客户端矩形?
我应该从窗口过程返回什么值?
返回 0 表示消息已处理。不要调用 DefWindowProc()。
但 LPARAM 列出了所有可能的 WM_PRINT 标志
这有点草率,是 WM_PRINT 文章中的复制/粘贴错误。您应该测试的唯一标志是 PRF_ERASEBKGND(但前提是您的绘制方法需要绘制背景)和 PRF_CLIENT(始终在消息的常见用法中设置)。
在这种情况下我应该如何解释 LPARAM?
很难解码这个问题,WM_PAINT 不使用 lparam 参数。但是,是的,您需要一个实现绘画的通用函数,以便您可以从 WM_PAINT 和 WM_PRINTCLIENT 消息处理程序中调用它。窗口过程中的样板代码应该如下所示:
case WM_PAINT: {
HDC hdc = BeginPaint(hWnd, &ps);
Draw(hdc);
EndPaint(hWnd, &ps);
break;
}
case WM_PRINTCLIENT: {
HDC hdc = (HDC)wParam;
DWORD flags = (DWORD)lParam;
if (flags & PRF_ERASEBKGND) SendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hdc, NULL);
if (flags & PRF_CLIENT) Draw(hdc);
break;
}
Run Code Online (Sandbox Code Playgroud)
void Draw(HDC hdc)你常用的绘画功能在哪里?
| 归档时间: |
|
| 查看次数: |
839 次 |
| 最近记录: |