1

为了在标题栏的右端写一些文本,我的程序捕获WM_NCPAINT,获取设备上下文,计算写文本的位置,然后调用DrawText. 此代码过去可以工作,但在 Windows 8 和 Windows 10 中,它不再工作。在这些较新版本的 Windows 中,您似乎根本无法在标题栏上绘画。

使用 Win API(不是 MFC)获取设备上下文如下:-

HDC hDC = GetWindowDC(hwnd);

Windows 开发中心中对此进行了描述:-

GetWindowDC函数检索整个窗口的设备上下文 (DC),包括标题栏、菜单和滚动条。窗口设备上下文允许在窗口中的任何位置进行绘制,因为设备上下文的来源是窗口的左上角而不是客户区。

没有提及此功能是特定于 Windows 版本的,但它所描述的内容不再有效。DrawText用一个大的黑色矩形 (-300,-300,1000,1000)替换对的调用,使标题栏保持完好无损,表明绘制整个窗口矩形是不可能的。

我尝试按如下方式获取设备上下文:-

HDC hDC = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);

如. _ WM_NCPAINT只要窗口类使用或之一注册CS_CLASSDC,则返回 an (如果不返回零)。但这有完全相同的问题。CS_OWNDCCS_PARENTDChDChDC

我尝试了上面的变体,因为剪辑看起来很可疑。我试过了:-

HDC hDC = GetDCEx(hwnd, 0, DCX_WINDOW);

毕竟文档都说DCX_WINDOW:-

值: DCX_WINDOW

含义:返回对应于窗口矩形而不是客户矩形的 DC。

此设备上下文也展示了相同的行为。

如何获得允许我DrawText在标题栏上或确实绘制任何内容的设备上下文?

4

1 回答 1

2

Windows Vista 引入了 Aero 主题和桌面 Windows 管理器: Windows Vista中引入的桌面组合功能从根本上改变了应用程序在屏幕上显示像素的方式。启用桌面合成后,各个窗口不再像在以前版本的 Windows 中那样直接绘制到屏幕或主显示设备上。相反,他们的绘图被重定向到视频内存中的屏幕外表面,然后渲染成桌面图像并呈现在显示器上。

使用 DWM 自定义窗口框架一文演示了如何使用桌面窗口管理器 (DWM) API 为您的应用程序创建自定义窗口框架。这包括在窗口的标题栏上绘制文本。Windows Vista 和 Windows 7 允许用户关闭 Aero 主题,以允许程序以与 XP 和早期版本相同的方式操作程序的标题栏。从 Windows 8 开始,桌面合成始终处于启用状态。

于 2019-05-20T14:10:09.270 回答