【问题标题】:WM_PAINT and MOUSE Event. MFC/WIN32 APIWM_PAINT 和鼠标事件。 MFC/WIN32 API
【发布时间】:2018-12-04 17:38:31
【问题描述】:

我的 WM_PAINT 中有两个矩形,一旦触发了每个矩形上的切换的 WM_MOUSE CLICK EVENT,我想在其上绘制 Frame Rect。这甚至可能吗?

【问题讨论】:

  • 您需要详细说明您的问题。 A 它站在这里它完全不清楚而且太宽泛。
  • 您需要让鼠标单击处理程序保存正在单击的矩形,然后使窗口无效,以便触发新的WM_PAINT,然后它可以在单击的矩形周围绘制一个框架。

标签: c++ winapi mfc win32gui


【解决方案1】:

请参阅上面的@RemyLebeau 关于您的鼠标点击的评论。然后,在您的 WndProc 中,类似:

switch (uMsg)
{
    // ...

    case WM_PAINT:
    {
        PaintStruct ps;
        HDC hDC = BeginPaint (hWnd, &ps);
        HBRUSH hBrush = (HBRUSH) GetStockObject (LTGRAY_BRUSH);   // say
        if (draw_first_rectangle)
            FrameRect (hDC, &my_first_rectangle, hBrush);
        if (draw_second_rectangle)
            FrameRect (hDC, &my_second_rectangle, hBrush);
        EndPaint (hWnd, &ps);
        return 0;
    }

    // ...

}

return DefWindowProc (hWnd, uMsg, wParam, lParam);

我相信你可以填空。

【讨论】:

  • 嗯是的,但这意味着我每次收到 WM_MOUSECLICK 消息时都需要使 WM_PAINT 消息无效,对吗?如果是这种情况,每次我点击我的矩形时都会导致闪烁。
  • 啊,闪烁。那完全是另一个问题。看看这对你来说是否真的是个问题,如果是,请提出一个新问题。
  • 和accepting the answer 会很好,谢谢。
  • 谢谢,非常感谢。实际上,我确实发布了一些关于编写无闪烁 WM_PAINT 处理程序的内容,请参阅:stackoverflow.com/a/50656524/5743288。除了那里所说的之外,您还必须将您的类背景画笔设置为 GetStockObject (NULL_BRUSH) 并在您的 WM_PAINT 处理程序中绘制整个窗口 - 背景和所有内容。你可以先用(比如说)一个 WHITE_BRUSH 填充 hDC,然后绘制你的矩形和其他任何东西。然后,当您调用EndBufferedPaint () 时,它会在一次操作中全部显示在屏幕上,因此不会闪烁。
  • 但这一切都只是顺风顺水。如果你想得到一个正确的答案,请发布一个新问题。
猜你喜欢
  • 2011-01-19
  • 2023-03-14
  • 1970-01-01
  • 2013-09-02
  • 2014-03-29
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多