11

环顾网络,我发现大多数人认为 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);
4

2 回答 2

12

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

于 2013-02-05T19:55:00.423 回答
3

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

你的程序是相似的,它把两个显示器都涂成黑色。

于 2013-02-05T20:00:41.360 回答