• 締切済み

GetDC()とCreateCompatibleDC()

お世話になっています。 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);

みんなの回答

回答No.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.cgi?print+200611/06110034.txt  どちらかと言えば、HDCの中身を知るよりも、使う手順を覚えて使う事に徹して来ましたので、厳密な意味でHDCがどうなっているのかは、チョッと私には分かりませんな。

usatan2
質問者

お礼

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

回答No.1

 こんばんは。試して見ましたが、違いは無い様です。  HDCに対してGetDeviceCaps()を使うと、HDCの詳細を確認出来ます。  「GetDeviceCaps」  http://msdn.microsoft.com/ja-jp/library/cc428670.aspx  以下参考に #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); //後始末は忘れずに }

usatan2
質問者

お礼

回答ありがとうございます。 >こんばんは。試して見ましたが、違いは無い様です。 テストありがとうございます。ところで、プログラムAとBは「常に同じ」ということでしょうか、それとも、「xxxという環境では同じ」ということでしょうか?たとえば、「xxx」は24ビットカラーとか、1024x768などの制約があるのでしょうか?もしも、ご存知でしたらお教えください。 >HDCに対してGetDeviceCaps()を使うと、HDCの詳細を確認出来ます。 便利な関数があるんですね。勉強になりました。

関連するQ&A