GetDC(NULL)获取主监视器或虚拟屏幕?

时间:2013-02-05 19:39:31

标签: c++ c winapi

环顾网络,我发现大多数人认为GetDC(NULL)将获得整个主要监视器(左上角为0,0的监视器)的设备上下文。但是,我感觉大多数人只是说,因为这就是GetDC 的msdn页面可能所说的。

但是,如果你看下面的两个页面(至少这两个)似乎是说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)”

我一直想弄清楚它究竟是哪一个,但是众多相互矛盾的观点让我失望。

有没有人对此有任何实际经验,可以在多监视器系统上进行测试吗? (我只有一台显示器,所以我不能。)

是否有覆盖整个主监视器的DC或覆盖整个虚拟屏幕的DC?

修改

对于任何想要试用它的人,在我的系统上,如果我创建一个默认项目并在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 个答案:

答案 0 :(得分:9)

它获得覆盖整个虚拟屏幕的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坐标)。

答案 1 :(得分:2)

我目前正在尝试重写gamma setter实用程序,因为它使用的是GetDC(NULL)而不是EnumDisplayMonitors + GetDC,因此会更改整个桌面的gamma值。

您的程序类似,它将两个显示屏都涂成黑色。