GDIでのSetBkModeやSetTextColorについての疑問

このQ&Aのポイント
  • GDIで使用するSetBkModeやSetTextColorについて、msdnのSelectObjectの解説に目を通した時に疑問が生じました。
  • msdnの解説には、SelectObjectは指定されたオブジェクトを返すと書かれていますが、SetBkModeやSetTextColorについてはそのような表記はありません。
  • 実際にはこれらの関数は、ReleaseDCやEndPaintの前に初期状態に戻すべきなのでしょうか、それとも戻さなくても問題はないのでしょうか?
回答を見る
  • ベストアンサー

SetBkModeやSetTextColorは…

3Dゲームのソリューションとは別の(Windows XP以前にも対応する)アプリケーションを作っているときに思った事なのですが GDIで msdnのSelectObjectの解説には (http://msdn.microsoft.com/ja-jp/library/cc410576.aspx) ------------- この関数は、指定されたのと同じタイプで、それまで選択されていたオブジェクトを返します。アプリケーションは新しいオブジェクトを使い終えたら、必ず元の(既定)オブジェクトに置き換えるべきです。 ------------- と書いてあるのですが SetBkModeやSetTextColorについてはそう言った表記がありません。 実際には、これらはReleaseDCやEndPaintの前に初期状態に戻すべきなのでしょうか? 戻さなくても全く問題はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • byDesign
  • ベストアンサー率75% (45/60)
回答No.1

SelectObjectするという事は、自分でリソース(ペンやブラシ)を作成しそのリソースを設定すると思います。 (※例外もあるけど) 自分で作成したリソースは、開放(DeleteObject)する必要があります。 質問のSelectObject説明は、この開放時にDCに関連づけたままやっちゃ駄目よ。と(遠まわしに)説明しているのです 説明の『新しいオブジェクトを使い終えたら』というのは、リソースを使い終えたらという事。 リソースを使い終えたら、解放処理をするのだがDCに関連付いているので 元の値に戻して関連付けを解除しないといけません。 上記を踏まえて、SetBkModeやSetTextColorを考えると 開放なんてする必要ないので、元にもどす必要もない。 という事です。

LongSecret
質問者

お礼

どうもありがとうございます♪ なるほど、そういうことだったのですか。 SelectObjectしておいて開放時にDCに関連づけたままはやばいですね。失敗するだったか、XPだとゾンビ化するだったか忘れましたが、そういう事はしっかりと配慮しています。 アプリケーション開始時にstatic専用のクラスで確保し、終了時に解放、とすれば、毎回生成するコードなしで、SelectObjectで挟み込むだけでOKとなるので、頻繁に使うやつはそのようにしています。 とりあえず、SetBkModeやSetTextColorなどに関しては、数値の設定だけなので問題ない、というわけですね。

関連するQ&A

  • Dateにnewを付与せず(関数として)呼び出した

    Dateにnewを付与せず(関数として)呼び出した場合、下記のようになるみたいですが、何故でしょうか? ・引数がない場合 → 現在の時間(UTC)を表す文字列を返す ・引数あり→引数を無視して、同上 ■質問1 ・この決まりは、「MDN」もしくは「msdn」リファレンスだとどこに記載されているでしょうか?(「ECMA」には記載されているのですが、リファレンス的にどういう位置付けになっているかを確認したいです) ・オブジェクトを生成せず呼び出せるからには、「Date();」関数がどこかに記載されていると思ったのですが、探したけど見つかりません ▽Global オブジェクト   http://msdn.microsoft.com/ja-jp/library/cc427717.aspx ■質問2 >Date オブジェクトに一切パラメータを渡さなかった場合は、オブジェクトは現在の時刻 (UTC) で初期化されます ▽Date オブジェクト   http://msdn.microsoft.com/ja-jp/library/cc427714.aspx ・と言うことは、Date オブジェクトを生成しなくても、「Date();」すると、結局、ここ(Date オブジェクト)に辿り着くのでしょうか? ・「Date();」関数は、どこにあるのでしょうか?(どこに所属してる? UTCが返ってくる理由を知りたい)

  • 【至急】セットしたmovefileコマンドの取消

    はじめまして、助けて下さい。 MoveFileEx関数(マイクロソフトMSDNサイト)<https://msdn.microsoft.com/ja-jp/library/cc429621.aspx>を誤って設定してしまい、 絶対に消してはいけないファイルを削除するコマンドを入れてしまいました。 バックアップを取るにしても、ファイルの容量が大きすぎてバックアップを取れません。 この予約コマンド自体を無効にする方法はないでしょうか。

  • MSDNライブラリを VS2010に適用するには

    http://msdn.microsoft.com/ja-jp/library/ms123401.aspx 上記URLのライブラリをVisualStudio2010にインストールする方法が分かりません。 2008や2013向けのインストーラーは見つかるのですが、2010用が見つかりません。 MSDNライブラリをVS2010で使用する方法について、分かる方が居れば、ご教授お願いいたします。

  • グラフィカルパスについて

    グラフィカルパスについて教えてほしいことが2つあるんですが。 (1)1つ目は下記のソースのようにでフォントを作成しないと描画できないないのですが、その理由を教えて下さい。 デフォルトのフォントだとなぜダメなのでしょうか? (2)2つ目はフォントを作成した場合に、SetBkMode()の部分をコメントアウトすると、背景が塗りつぶされ、文字が塗りつぶされませんが、どうしてでしょうか?(このときフォント作成のコメントアウトは解除して下さい) MSDNにFillPath()の説明に「パスの内部を塗りつぶす」とありますが、このとき文字は「内部」の扱いにならないのでしょうか? どれが内部でどれが外部になるのかよく理解できていないだと思います。 // HFONT hFont; char Str[] = "ABCDE"; HDC hdc = GetDC( hWnd ); BeginPath( hdc ); SetBkMode( hdc, TRANSPARENT ); /* hFont = CreateFont( 80, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET ,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS ,DEFAULT_QUALITY, 0 ,NULL ); SelectObject( hdc ,hFont ); */ TextOut( hdc, 0, 0, Str, lstrlen(Str) ); EndPath( hdc ); SelectObject( hdc, CreateHatchBrush(HS_DIAGCROSS ,0xFF) ); FillPath( hdc ); SelectObject( hdc ,GetStockObject( SYSTEM_FONT ) ); // DeleteObject( hFont ); DeleteObject( SelectObject( hdc, GetStockObject(WHITE_BRUSH) ) ); ReleaseDC( hWnd, hdc ); どなたか分かる方いらっしゃいましたらご教授下さい。 よろしくお願いします。

  • なぜマクロ「_WIN64」が未定義になるの?(Visual C++)

    下記環境で、32bitアプリケーションの64bit化をしようとしました。   OS    :Windows XP Professional x64 Edition   開発環境:Visual Studio 2008 Professional Edition   言語   :Visual C/C++ その際のビルドは、構成マネージャのアクティブソリューションプラットフォームを「x64」に設定してから行いました。 ところが、64bitアプリケーションなら定義されるはずの「_WIN64」というマクロが未定義になってしまいます。 なぜなのか、教えて欲しいです。 ちなみに、マクロが未定義かどうかは、   #if defined(_WIN64)     #define test   #endif の2行目がビルド後、灰色表示になるかどうかで確かめました。 その結果、灰色になりました。 さらに、補足ですが 64bitアプリケーションになっているかを確かめるため、 sizeof(int*)の値を確認したところ、 その値は「8」でした。 参考:   [MSDN Visual C++ デベロッパー センター]    http://msdn.microsoft.com/ja-jp/library/b0084kay.aspx    http://msdn.microsoft.com/ja-jp/library/9yb4317s(VS.80).aspx

  • InternetExplorer.Applicationの仕様を把握するには

    InternetExplorer.Application apiにはさまざまなオブジェクトやメソッド、プロパティが含まれていますが、各仕様を把握するにはどのようにすればよいのでしょうか。 簡単な使用例ではなく、オブジェクト・メソッドやプロパティの詳細について詳しく書かれているホームページや書籍を探しています。MSDNライブラリでもかまいません。

  • msdnのヘルプについて

    都合上、オフラインのヘルプではなく、msdnでヘルプを見てるのですが たとえばアクセスのRunSQLメソッドのヘルプを見たければ、 http://msdn.microsoft.com/ja-jp/library/office/ff194626.aspx のように、msdnのオフィスのページのヘルプを発見できましたが、 違う例えで、VBA.Strings.UCase関数のヘルプを見たい場合は、 オフィスのページのヘルプは用意されてないのでしょうか? UCase関数に関しては、 http://msdn.microsoft.com/ja-jp/library/53e2ew8a(v=VS.90).aspx このページしか見つけられません。 内容はVisual Basicのものですが、VBAライブラリーのものは、VBのページをVBAに読み替えてるしかないのでしょうか? 私は、VBはよく知らないので、VBAのヘルプのページがあればな。と思うのですが、 無理でしょうか?

  • 大規模なデータウェアハウスを構築・運用するための主要テクノロジー

    大規模なデータウェアハウスを構築・運用するための主要テクノロジー http://www.computerworld.jp/eye/t/sql/server2008/05/ パーティション テーブルとパーティション インデックスに対するクエリ処理の機能強化 http://msdn.microsoft.com/ja-jp/library/ms345599.aspx パーティションの切り替えを使用した効率的なデータの転送 http://msdn.microsoft.com/ja-jp/library/ms191160.aspx パーティション テーブルとパーティション インデックスの変更 http://msdn.microsoft.com/ja-jp/library/ms175864.aspx パーティション・テーブルにおけるパフォーマンスの考察 http://blogs.msdn.com/b/sqljapan/archive/2007/06/13/3260757.aspx

  • Visual Basicにてシリアル通信

    VB2008でシリアル通信をしたいと思っております。 MSDNにてSerialPortコントロールを使った例が解説されており、 http://msdn.microsoft.com/ja-jp/library/cc720852.aspx それを利用して基本的な送信/受信ができることは確認しました。 次に受信データにより処理を仕分けたい、 例えば、エラーコードが帰ってきたらエラー用の処理、 正常なリターンがあれば正常処理のような動作を実装したい場合は、 どうすれば良いでしょうか。 アドバイスいただけますと助かります。 よろしくお願いいたします。

  • "picture.jpg" の "picture" を取りだすには

    お世話になります。 "picture.jpg" のような文字列から 拡張子を省いた値を 取りだすにはどうすれば良いのでしょうか? Java でいう str.lastIndexOf(".") や substr() のような関数はあるのでしょうか? msdn 関数 http://msdn.microsoft.com/ja-jp/library/32s6akha.aspx

専門家に質問してみよう