11

ネットを調べてみると、ほとんどの人は GetDC(NULL) がプライマリモニター全体 (左上に 0,0 を持つモニター) のデバイス コンテキストを取得すると考えているようです。ただし、GetDC の msdn ページがそう言っている可能性があるため、ほとんどの人がそう言っているように感じます。

ただし、次の 2 つのページ (少なくともこれら 2 つ) を見ると、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

EnumDisplayMonitors + GetDC の代わりに GetDC(NULL) を使用しているため、現在、ガンマ セッター ユーティリティを書き直そうとしています。その結果、デスクトップ全体のガンマが変更されます。

あなたのプログラムは似ており、両方のディスプレイを黒く塗りつぶします。

于 2013-02-05T20:00:41.360 に答える