c++ - 如何在窗口周围绘制矩形而不覆盖 win32 中的标题栏

标签 c++ winapi

我想在窗口周围绘制一个矩形,但我不想覆盖标题栏。 到目前为止我在窗口回调函数中编写的是:

    case WM_NCPAINT:
    {
        HDC hdc;
        RECT rect;
        HPEN pen;

        hdc=GetDCEx(hWnd,(HRGN)wParam,DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_LOCKWINDOWUPDATE);
        GetWindowRect(hWnd,&rect);
        pen=CreatePen(PS_SOLID, 10, RGB(255, 0, 0));//red pen 10 pixels in size
        SelectObject(hdc,pen);
        Rectangle(hdc,0,0,(rect.right-rect.left),(rect.bottom-rect.top));
        DeleteObject(pen);
        ReleaseDC(hWnd,hdc);
    }
    break;

但是,这会用白色画笔绘制窗口标题栏。

如何才能使其不覆盖标题栏?我丢失了标题栏文本和菜单...

在创建笔之前,我尝试使用 HOLLOW_BRUSH,如下所示:

        HBRUSH b=CreateSolidBrush(HOLLOW_BRUSH);
        SelectObject(hdc,b);

但这只会导致标题栏根本不被绘制(黑色)。

最佳答案

通过处理WM_NCPAINT消息,您告诉窗口管理器您负责绘制整个非客户区,因此窗口管理器不会为您绘制任何区域。

如果您希望绘制原始标题栏,那么您需要首先调用 DefWindowProc(),然后在其绘制的“顶部”进行您自己的绘制。

您可能还需要使用ExcludeClipRect()如果您希望使用单个矩形一次绘制整个非客户区域,以防止客户区域被绘制。

关于c++ - 如何在窗口周围绘制矩形而不覆盖 win32 中的标题栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25552611/

相关文章:

winapi - 我怎样才能加快我的代码覆盖率工具?

c++ winapi,获取 ListView 标题文本

c++ - 嵌套类中的继承

C++ 从 .txt 文件数据制作 vector

c++ - SetWindowsHookEx WH_KEYBOARD_LL 右移不响应

c# - 为什么从服务调用时 GetWindowThreadProcessId 返回 0?

c++ - 与 alignas 语法作斗争

c++ - 如何在 Linux 中编译 C++ 程序?

c++ - C/C++ 类型定义/结构中的冗余命名

Delphi FormKeyDown ALT 键卡住