Чтобы написать текст в правом конце строки заголовка, моя программа перехватывает 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
, CS_OWNDC
или CS_PARENTDC
, возвращается hDC
(если возвращается не ноль). Но у этого hDC
точно такая же проблема.
Я попробовал вариацию вышеописанного, потому что отсечение показалось сомнительным. Я попытался:-
HDC hDC = GetDCEx(hwnd, 0, DCX_WINDOW);
после того, как вся документация говорит о DCX_WINDOW
: -
Значение: DCX_WINDOW.
Значение. Возвращает DC, соответствующий прямоугольнику окна, а не прямоугольнику клиента.
Этот контекст устройства также демонстрирует такое же поведение.
Как мне получить контекст устройства, который позволяет мне DrawText
или рисовать что-либо в строке заголовка?