【问题标题】:C programmin WM_PAINT causes bad behaviorC 编程 WM_PAINT 导致不良行为
【发布时间】:2017-10-11 09:26:28
【问题描述】:

我创建了一个父窗口,它有许多子窗口,如按钮、静态文本除外。它们都是可见的并且可以正常工作,但是当我将一段代码添加到我的窗口回调时,它们都会消失+我看不到我刚刚尝试从函数中绘制的线。

我该如何解决这个问题?

case WM_PAINT:
    {
        HDC hdc = GetDC(hwnd);
        HGDIOBJ hp = CreatePen(0 ,5,RGB(0,100,0));
        SelectObject(hdc,hp);
        MoveToEx(hdc, 825, 0, 0);
        LineTo(hdc, 825, 1000);
        ReleaseDC(hwnd, hdc);
    }
break;

【问题讨论】:

  • 如果没有好的minimal reproducible example,没有人可以做出明确的评论。但这里明显的问题是您不使用BeginPaintEndPaint。这样做的各种原因。首先更改您的代码以使用这些方法来获取 DC。然后,如果您仍有问题,请回复minimal reproducible example
  • 或者,向我们这些曾经担任过您职位的人提供一些建议。认识到你有很多东西要学,并尝试去学习它。获取 Petzold 经典作品的副本。请仔细阅读。
  • 代码有一个非常糟糕的句柄泄漏。这不会永远持续下去,在 10,000 次绘制之后,操作系统停止允许程序泄漏更多。这不会花费很长时间,它会生成绘画,哦,每秒数千次,因为它从不验证绘画区域。现在,每个控件在无法再创建绘图对象时都会出现异常。

标签: c windows winapi


【解决方案1】:
  1. 您不使用 BeginPaint/EndPaint

  2. 如果您在父窗口中绘图,您必须注意不要覆盖任何内容。参见样式 WS_CLIPCHILDREN。

  3. 因为您没有使用 BeginPaint/EndPaint,所以没有准备好背景。如果您将消息传递给默认窗口过程,那里的代码将调用 BeginPaint/EndPaint,这将导致背景被擦除。

  4. 您创建了一支笔,将其选择到 DC 中,并且您永远不会破坏这支笔,而且您每次重新绘制时都会创建一支新笔。

请阅读一些有关使用 Windows GDI 的书籍!当您了解基本知识时,我写的所有内容都可以轻松修复...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2021-06-03
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多