gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:32:41 25 4
gpt4 key购买 nike

我对 WM_PRINTCLIENT 的 MSDN 页面以及相关功能的几个方面感到有点困惑:

  1. 我应该从窗口过程返回什么值?该文档完全缺少“返回值”部分。 (该页面的 Visual Studio 2012 脱机文档光盘版本中也缺少此内容。) Raymond Chen's original scratch program returns zero ;这是首选选项吗?

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

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

谢谢。

更新重新表述第三部分:

WM_PAINT 的文档包含以下段落

For some common controls, the default WM_PAINT message processing checks the wParam parameter. If wParam is non-NULL, the control assumes that the value is an HDC and paints using that device context.

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

最佳答案

What value should I return from my window procedure?

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

but the LPARAM lists all the possible WM_PRINT flags

这有点草率,是 WM_PRINT 文章中的复制/粘贴错误。您应该测试的唯一标志是 PRF_ERASEBKGND(但前提是您的绘制方法需要绘制背景)和 PRF_CLIENT(始终在消息的常见用法中设置)。

How should I interpret LPARAM in this case?

很难解码这个问题,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) 是常用的绘制函数。

关于winapi - WM_PRINTCLIENT(及相关)文档混淆相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27361318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com