WM_PRINTCLIENT(及相关)文档混淆相关问题

问题描述 投票:0回答:1

我对 MSDN 页面的

WM_PRINTCLIENT
和相关功能在几个方面有点困惑:

  1. 我应该从窗口过程返回什么值?该文档完全缺少“返回值”部分。 (该页面在 Visual Studio 2012 离线文档光盘版本中也缺失。) Raymond Chen 的原始暂存程序返回零;这是首选吗?

  2. WM_PRINTCLIENT
    的摘要和备注部分表明我应该只绘制客户区,但LPARAM列出了所有可能的
    WM_PRINT
    标志 - 所以我应该做什么,忽略它并无条件只绘制客户区或绘制一切要求? (我提出这个问题的目的不是对文档进行事后猜测;我只是想正确地实现此消息。)

  3. 为了方便/善意,我也想在

    WM_PAINT
    文档中提到的 wParam 功能中为
    WM_PAINT
    提供 DC 作为选项。在这种情况下我应该如何解释 LPARAM?或者我有什么理由不应该提供这条替代路线? (推论:如果要忽略LPARAM,我是否应该无条件绘制整个客户区?)

谢谢。

更新 改写第三部分:

WM_PAINT
的文档包括段落

对于一些常用控件,默认的WM_PAINT消息处理会检查wParam参数。如果 wParam 为非 NULL,则控件假定该值是 HDC 并使用该设备上下文进行绘制。

为了完整起见,除了

WM_PRINTCLIENT
之外,我还想在我的控制范围内提供此行为。我有理由不应该这样做吗?如果这样做不会造成伤害,我应该如何解释 lParam,以及我应该绘制整个客户端矩形吗?

winapi paint msdn
1个回答
6
投票

我应该从窗口过程返回什么值?

您返回 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;
}

其中

void Draw(HDC hdc)
是你常用的绘画功能。

© www.soinside.com 2019 - 2024. All rights reserved.