dポイントプレゼントキャンペーン実施中!

お世話になっています。
GetDC(NULL)とCreateCompatibleDC(NULL)で得られるhdcの違いがよくわかりません。
以下のプログラムA,Bで得られるのhDCw1,hDCw2に違いはありますか?

A:
hDCw1 = CreateCompatibleDC(NULL); //現在の画面と互換性のあるメモリデバイスコンテキスト
hDCw2 = CreateCompatibleDC(NULL);
<<hDCw1,hDCw2を使用>>
DeleteDC(hDCw1);
DeleteDC(hDCw2);

B:
hdc = GetDC( NULL );// 画面全体を表すデバイスコンテキスト
hDCw1 = CreateCompatibleDC(hdc);
hDCw2 = CreateCompatibleDC(hdc);
<<hDCw1,hDCw2を使用>>
ReleaseDC( NULL, hdc );// 取得した HDCの開放
DeleteDC(hDCw1);
DeleteDC(hDCw2);

A 回答 (2件)

 こんばんは。

御礼頂き感謝いたします。

>>プログラムAとBは「常に同じ」ということでしょうか、それとも、「xxxという環境では同じ」ということでしょうか?たとえば、「xxx」は24ビットカラーとか、1024x768などの制約があるのでしょうか?
 私のディスプレイは1440x900x32でしたが、両方同じでした。
 ただ、もう一度立ち戻って調べ直しましたが、「常に同じ」とは断言出来なさそうです。と言うのも、
 A:
・hDCw1 = CreateCompatibleDC(NULL); //現在の画面と互換性のあるメモリデバイスコンテキスト
 ↑「現在の画面」と言うのが「現在のデスクトップ」である事を意味しているのならば、B:とまったく同じになる筈です。
 B:ではGetDC(NULL)でデスクトップのデバイスコンテキストを取っているからです。
 しかし、気になったのは「現在の~」と付くからには「現在ではない~」のも有る様で、

 「マルチモニター」
 http://ww8.tiki.ne.jp/~elbe2/sumai/dell3.html

 の様な状況も含めると、私にも分かりません。

 「CreateCompatibleDCに対する議論」
 http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng. …

 どちらかと言えば、HDCの中身を知るよりも、使う手順を覚えて使う事に徹して来ましたので、厳密な意味でHDCがどうなっているのかは、チョッと私には分かりませんな。
    • good
    • 0
この回答へのお礼

>ただ、もう一度立ち戻って調べ直しましたが、「常に同じ」とは断言出来なさそうです。
実験ありがとうございます。また、有用なページのご紹介ありがとうございます。
>「CreateCompatibleDCに対する議論」
>http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng. …
難しくて私には、何が違うのか、よくわかりませんが、とにかく
・何かしら違う。
・でもどちらでも問題なく動く場合が多く、実際に差がない場合もある。
ということですね(苦笑)。

お礼日時:2008/08/31 07:53

 こんばんは。

試して見ましたが、違いは無い様です。
 HDCに対してGetDeviceCaps()を使うと、HDCの詳細を確認出来ます。

 「GetDeviceCaps」
 http://msdn.microsoft.com/ja-jp/library/cc428670 …

 以下参考に
#include<windows.h>

#define ARRAYCOUNT(a) (sizeof(a)/sizeof(a[0]))

//両方のデバイスコンテキストから詳細を取ってみる
void Check(HDC hDC_A, HDC hDC_B)
{
//適当な項目を調べてみる
const int arr[] =
{
HORZRES, VERTRES, BITSPIXEL
};

for(int i = 0; i < ARRAYCOUNT(arr); ++i)
{
const int nA = GetDeviceCaps(hDC_A, arr[i]);
const int nB = GetDeviceCaps(hDC_B, arr[i]);
}
}

//お試し
void main()
{
//現在の画面と互換性のあるメモリデバイスコンテキスト
HDC hDC_A = CreateCompatibleDC(NULL);

//画面全体を表すデバイスコンテキスト
HDC hDC_w = ::GetDC(NULL);
HDC hDC_B = CreateCompatibleDC(hDC_w);

Check(hDC_A, hDC_B);

//後始末は忘れずに
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>こんばんは。試して見ましたが、違いは無い様です。
テストありがとうございます。ところで、プログラムAとBは「常に同じ」ということでしょうか、それとも、「xxxという環境では同じ」ということでしょうか?たとえば、「xxx」は24ビットカラーとか、1024x768などの制約があるのでしょうか?もしも、ご存知でしたらお教えください。

>HDCに対してGetDeviceCaps()を使うと、HDCの詳細を確認出来ます。
便利な関数があるんですね。勉強になりました。

お礼日時:2008/08/20 23:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!