GetDC(NULL) получает основной монитор или виртуальный экран?

Оглядываясь в сети, я вижу, что большинство людей думают, что GetDC(NULL) получит контекст устройства для всего основного монитора (тот, который имеет 0,0 в левом верхнем углу). Тем не менее, у меня возникает ощущение, что большинство людей просто говорят это, потому что это то, что может быть сказано на странице msdn для GetDC.

Однако, если вы посмотрите на следующие две страницы (по крайней мере, на этих двух), кажется, говорится, что GetDC(NULL) возвращает контекст устройства, который охватывает весь виртуальный экран (тот, который охватывает каждый монитор, подключенный к системе).

(1) https://www.microsoft.com/msj/0697/monitor/monitor.aspx-> найдите на странице "Это получает RECT виртуального рабочего стола" и посмотрите на фрагменты этого оператора (в частности, GetDC). (NULL) над ним).

(2) http://msdn.microsoft.com/en-gb/library/windows/desktop/dd162610%28v=vs.85%29.aspx-> поиск на странице "GetDC(NULL)"

Я пытался выяснить, что это на самом деле, но множество противоречивых мнений побеждает меня.

У кого-нибудь есть реальный опыт этого, и может ли он проверить его на системе с несколькими мониторами? (У меня только один монитор, поэтому я не могу.)

Получает ли он постоянный ток, покрывающий весь основной монитор, или постоянный ток, покрывающий весь виртуальный экран?

редактировать

Для тех, кто хочет попробовать это, в моей системе, если я создаю проект по умолчанию и помещаю следующее в WinMain, экран становится черным. Если у вас есть несколько мониторов, и вы пытаетесь это сделать, возникает вопрос: станет ли черный только ваш основной монитор ИЛИ все ваши мониторы?

HDC hdc = GetDC(NULL);
RECT r = {LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX};
FillRect(hdc, &r, (HBRUSH)(COLOR_BTNTEXT + 1));
ReleaseDC(NULL, hdc);

2 ответа

Решение

Он получает DC, который покрывает весь виртуальный экран. Я только что проверил с:

#include <windows.h>
#include <conio.h>

int main() {

    HDC screen = GetDC(NULL);

    RECT r = {-1200, 100, -200, 500};
    HBRUSH br = CreateSolidBrush(RGB(0, 255, 0));

    FillRect(screen, &r, br);

    getch();
    InvalidateRect(NULL, &r, true);

    return 0;
}

... и он успешно рисует зеленый прямоугольник на моем дополнительном экране (расположен слева от основного экрана, поэтому у него отрицательные координаты X).

В настоящее время я пытаюсь переписать утилиту установки гаммы, потому что она использует GetDC(NULL) вместо EnumDisplayMonitors + GetDC, и в результате изменяет гамму всего рабочего стола.

Ваша программа похожа, она окрашивает оба дисплея в черный.

Другие вопросы по тегам