\n |
[ トップページ ]
[ ____CommandPrompt ]
[ ____JScript ]
[ ____MySQL ]
[ ____Cygwin ]
[ ____Java ]
[ ____Emacs ]
[ ____Make ]
[ ____Perl ]
[ ____Python ]
[ ____OpenGL ]
[ ____C# ]
[ ____StyleSheet ]
[ ____C++ ]
[ ____Winsock ]
[ ____Thread ]
[ ____VisualStudio ]
[ ____C ]
[ ____Win32API ]
[ ____Lua ]
[ ____PhotoShop ]
ヘッダ検索
■ DeviceContext
■ GetDC
SYNTAX
HDC GetDC(
HWND hWnd
)
DESC
指定されたウィンドウのクライアント領域,
画面全体を表すディスプレイデバイスコンテキストのハンドルを取得する
指定されたウィンドウで指定されているクラススタイルに応じて
共通, クラス, プライベートいずれかのデバイスコンテキストを取得する
GetDC は
共通デバイスコンテキストを取得するたびにデフォルトの属性を割り当てる。
クラスデバイスコンテキスト, プライベートデバイスコンテキスト には
以前の属性をそのまま割り当てる
共通デバイスコンテキスト が不要になったら
ReleaseDC() を呼び出して解放すること
クラスデバイスコンテキスト, プライベートデバイスコンテキストは
ReleaseDC() を呼び出して解放しなくてもよい
ReleaseDC() は
GetDC を呼び出したのと同じスレッドから呼び出さなければなりません
デバイスコンテキストの数は
利用可能なメモリの量で制限される
共通デバイスコンテキスト
POINT
リソースを節約するため共有するということ。
だからリセットされる。
システム上の特殊なキャッシュ領域に保持される画面DCのこと。
共通デバイスコンテキストは,
描画処理をそれほど頻繁に実行しないようなアプリケーションで使われる。
システムは,DCのハンドルを返す前に,DCをデフォルトのオブジェクト,属性,モードで初期化する。
アプリケーションが実行する描画処理には,これらのデフォルト値が使われる。
デフォルト以外の値を使いたければ,
GDI関数を使って新しいオブジェクトを選択したり
既存のオブジェクトの属性を変更したり,あるいは別のモードを選択する必要がある。
POINT
共通デバイスコンテキストはごく限られた数しか存在できないため,
描画を終えたらDCを解放するようにしてください。
共通デバイスコンテキストを解放すると,デフォルトデータに対して加えられた変更はすべて破棄される。
プライベートデバイスコンテキスト
POINT
高速化のために、固有にもつということ。
プライベートデバイスコンテキストも画面デバイスコンテキストの一種ですが
共通デバイスコンテキストとは異なり
いったんデフォルトデータが変更されると
DCを解放したあとでも変更点は保持される。
プライベートデバイスコンテキストを使うのは
描画頻度が非常に高いアプリケーションです。
たとえば,CAD, DTP, ドローイング、ペインティングアプリケーションなど。
プライベートデバイスコンテキストはシステムキャッシュの一部ではなく
使い終わったあとで解放する必要はない。
あるウィンドウクラスのウィンドウがすべて破棄されると
それに対応するプライベートコンテキストもシステムが自動的に破棄する。
プライベートデバイスコンテキストを作成するには
WNDCLASS構造体のstyleメンバを CS_OWNDC というウィンドウクラススタイルで初期化して
RegisterClass() を呼び出す。
CS_OWNDCスタイルを指定してウィンドウを作成したら,GetDC,GetDCEx,またはBeginPaint関数を一度呼び出せば,
プライベートデバイスコンテキストを識別するハンドルを取得することができます
このハンドル(とそれに結び付けられたDC)は
そのクラスのウィンドウが削除されるまで使い続けることができる。
グラフィックオブジェクトやその属性を変更したり,グラフィックモードを変えたりした場合,
ウィンドウが削除されるまでそれらの変更点は保持される。
ウィンドウデバイスコンテキスト
ウィンドウデバイスコンテキストを使うと
たとえクライアント領域外であっても,ウィンドウの好きな場所を描画できる。
通常,ウィンドウデバイスコンテキストが使われるのは,特殊な非クライアント領域を持つ
ウィンドウでWM_NCPAINTやWM_NCACTIVATEメッセージを処理するような場合。
それ以外の目的でウィンドウデバイスコンテキストを使用することはお勧めしません。
詳細についてはGetWindowDCを参照。
親デバイスコンテキスト
親デバイスコンテキストを使うと,ウィンドウのクリッピング領域のセットアップに必要な時間を最小限にできる。
通常,親デバイスコンテキストを使う目的は,プライベートやクラスデバイスコンテキストを
使わずにコントロールウィンドウの描画を高速化すること。
たとえば,
システムがプッシュボタンやエディットコントロールを描画する際は親デバイスコンテキストを使います。
親デバイスコンテキストは子ウィンドウで使うことだけを目的としていますので,トップレベル,
あるいはポップアップウィンドウでは絶対に使わないでください。
詳細についてはParent Display Device Contextsを参照してください。
// NULL を指定すると, Window外の画面全体に描画対象にできる
HDC hDC = GetDC( NULL );
WARNING
Local 変数にすると問題あるかも
// static で共有するとうまくいく
static HDC hDC;
if ( msg == WM_CREATE )
{
HDC hDC = GetDC( hWnd );
hFont = CreateFont();
SelectObject( hDC, hFont );
}
if ( msg == WM_PAINT )
{
// Font が Default に戻る
HDC hDC = GetDC( hWnd );
TextOut( hDC );
}
■ ReleaseDC
SYNTAX
int ReleaseDC(
HWND hWnd, // ウィンドウハンドル
HDC hDC // デバイスコンテキストハンドル
);
DESC
デバイスコンテキストを解放し
他のアプリケーションが利用できるようにする
ReleaseDC() の効果は
デバイスコンテキストのタイプによって異なる
POINT
共通デバイスコンテキスト, ウィンドウデバイスコンテキストだけを解放します
クラスデバイスコンテキスト, プライベートデバイスコンテキストには効果がない
( 意味がないということ )
■ CreateDC
SYNTAX
HDC CreateDC(
LPCTSTR lpszDriver, // ドライバ名
LPCTSTR lpszDevice, // デバイス名
LPCTSTR lpszOutput, // 未使用 NULL にする
CONST DEVMODE *lpInitData // オプションのプリンタデータ
);
DESC
指定されたデバイスのデバイスコンテキストを、指定の名前で作成
NULL で終わる文字列へのポインタを指定
この文字列は
「DISPLAY」または 1 個のプリンタプロバイダの名前(通常は「WINSPOOL」)を保持
■ DeleteDC
SYNTAX
BOOL DeleteDC(
HDC hdc // デバイスコンテキストのハンドル
);
DESC
指定されたデバイスコンテキストを削除
WARNING
アプリケーションは
GetDC() を使ってデバイスコンテキストのハンドルを取得した場合
DeleteDC() を呼び出してそのハンドルを削除してはなりません
代わりに
ReleaseDC() を呼びデバイスコンテキストを解放すること
|
|
NINJAIDX 17