Windows标题栏上的DrawText不再起作用

时间:2019-05-20 13:52:34

标签: windows winapi titlebar nonclient-area

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

使用Win API(不是MFC)通过以下方式获取设备上下文:-

HDC hDC = GetWindowDC(hwnd);
Windows Dev Center中描述的

因此:-

  

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

没有提到此功能是Windows版本特定的,但是它所描述的内容不再起作用。用一个大的黑色矩形(-300,-300,1000,1000)代替对DrawText的调用,标题栏保持精美,表明无法绘制整个窗口矩形。

我尝试改为按以下方式获取设备上下文:-

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

,如documentation for WM_NCPAINT中所述。只要窗口类已向CS_CLASSDCCS_OWNDCCS_PARENTDC中的一个注册,就返回hDC(如果不返回零)。但是这个hDC存在完全相同的问题。

我尝试了上述内容的一种变体,因为剪裁似乎令人怀疑。我尝试过:-

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

在所有文档中都提到DCX_WINDOW:-

  

值: DCX_WINDOW

     

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

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

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

1 个答案:

答案 0 :(得分:1)

Windows Vista引入了Aero主题,并附带了Desktop Windows Manager Windows Vista中引入的桌面合成功能从根本上改变了应用程序在屏幕上显示像素的方式。启用桌面合成后,各个窗口不再像以前的Windows版本那样直接绘制到屏幕或主显示设备上。取而代之的是,将他们的图形重定向到视频内存中的屏幕外表面,然后将其渲染为桌面图像并显示在显示器上。

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