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

时间:2014-12-08 15:33:09

标签: winapi paint msdn

我对WM_PRINTCLIENT的MSDN页面以及相关功能有点困惑:

  1. 我应该从窗口程序返回什么值?该文档完全没有“返回值”部分。 (在Visual Studio 2012离线文档光盘的页面版本中也缺少它。)Raymond Chen's original scratch program returns zero;这是首选方案吗?

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

  3. 作为一种方便/善意,我希望WM_PAINTWM_PAINT文档中提到的wParam功能中提供DC作为选项。在这种情况下我应该如何解释LPARAM?还是有理由我不应该提供这种替代路线? (推论:如果要忽略LPARAM,我应该无条件地绘制整个客户区吗?)

  4. 感谢。

    更新改述第三部分:

    WM_PAINT的文档包含段落

      

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

    为了完整起见,除了WM_PRINTCLIENT之外,我想在我的控件中提供此行为。我不应该这样做吗?如果这样做不会受到伤害,我应该如何解释lParam,我应该绘制整个客户端吗?

1 个答案:

答案 0 :(得分:4)

  

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

返回0表示消息已处理完毕。不要调用DefWindowProc()。

  

但LPARAM列出了所有可能的WM_PRINT标志

这有点草率,从WM_PRINT文章中复制/粘贴。您应该测试的唯一标志是PRF_ERASEBKGND,但是只有在绘制方法时才需要绘制背景,并且PRF_CLIENT将始终设置为消息的常用用法。

  

在这种情况下,我该如何解释LPARAM?

很难解码这个问题,WM_PAINT没有使用lparam参数。但是,是的,您需要一个实现绘画的通用函数,以便您可以从WM_PAINT和WM_PRINTCLIENT消息处理程序中调用它。窗口过程中的Boilerplate代码应该如下所示:

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)是您常见的绘画功能。