环顾网络,我发现大多数人认为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);
答案 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值。
您的程序类似,它将两个显示屏都涂成黑色。