MFC ActiveX コントロール : ActiveX コントロールの描画
この技術情報は処理を最適化するために描画コードを変更できるまたは ActiveX コントロールの塗装プロセスを説明します。コントロールを持たないことによって描画を最適化する方法の手法の 最適化コントロールの描画 がそれぞれ前に選択する GDI オブジェクトを復元する場合 (" " を参照してください。すべてのコントロールが描画すると、コンテナーは自動的に元のオブジェクトを復元できます)。
この技術情報の例では、既定の構成と MFC ActiveX コントロール ウィザードが作成するコントロールからあります。MFC ActiveX コントロール ウィザードを使用してコントロールのスケルトン アプリケーションの作成の詳細については、技術情報 MFC ActiveX コントロール ウィザードを参照してください。
次のトピックについては:
描画をサポートする ActiveX コントロール ウィザードが作成するコントロールとコードを塗りつぶすための一般的なプロセス
塗装プロセスを最適化する方法
メタファイルを使用してコントロールを塗りつぶす方法
ActiveX コントロールの塗装 Process
ActiveX コントロールが最初に表示したり、再描画時に、 1 種類の重要な違いと MFC を使用して開発された他のアプリケーションと同様の塗装プロセスに従って: ActiveX コントロールがアクティブまたは非アクティブ状態になる可能性があります。
アクティブなコントロールは子ウィンドウによって ActiveX コントロール コンテナーで表されます。他のペインのように、 WM_PAINT のメッセージを受信すると、自身を描画を行います。コントロールの基本クラス、 COleControlのハンドル OnPaint 関数でこのメッセージ。この既定の実装は、コントロールの OnDraw 関数を呼び出しますします。
アクティブでないコントロールは別々に描画されます。コントロールが非アクティブと、ウィンドウは非表示ですまたは存在しないため、描画メッセージを受け取ることができません。代わりに、コントロール コンテナーは直接コントロールの OnDraw 関数を呼び出しますします。これは、アクティブなコントロールの塗装プロセスと OnPaint のメンバー関数が呼び出されないとは異なります。
上の段落で説明したように、 ActiveX コントロールを更新する方法をコントロールの状態によって異なります。ただし、フレームワークが OnDraw のメンバー関数をどちらの場合も、ダイヤルするため、このメンバー関数の描画コードの大半を追加します。
OnDraw のメンバー関数のハンドルは描画を制御します。コントロールが非アクティブと、コントロール コンテナーは、コントロールをコントロール コンテナーのデバイス コンテキストとする四角形領域の座標を渡す OnDrawをダイヤルします。
OnDraw のメンバー関数のフレームワークが渡される四角形は、コントロールが占める領域が含まれます。コントロールがアクティブな場合は、左上隅 (0、 0)であり、渡されたデバイス コンテキストは、コントロールを含む子ウィンドウの場合です。コントロールがアクティブでない場合、左上の座標は必ずしも (0、 0)ではなく、渡されたデバイス コンテキストは、コントロールを含むコントロール コンテナーです。
[!メモ]
、 OnDrawに渡される四角形の中でのみ描画できることは OnDrawへの変更が等しいと四角形の左上のポイントに依存しない重要です (0、 0)。予期しない結果は四角形の領域に描画されることがあります。
以下のコントロールの実装ファイル (.cpp)の MFC ActiveX コントロール ウィザードが使用する既定の実装は、白いブラシを使用して四角形を描画、現在の背景色で楕円を塗りつぶします。
void CMyAxUICtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
// TODO: Replace the following code with your own drawing code.
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
}
[!メモ]
コントロールを塗った場合、 OnDraw の関数に pdc パラメーターとして渡されるデバイス コンテキストの状態に関する想定をしないでください。ときどきデバイス コンテキストとは、コンテナー アプリケーションによって指定され、既定の状態に対する初期化されません。特に、明示的にブラシ、ペン、色、フォント、および描画コードが依存する他のリソースを選択します。
描画のコードの最適化
コントロールが正常に自身を塗った後、次の手順を OnDraw の関数を最適化することです。
描画を塗りつぶす ActiveX コントロール全体のコントロール領域の既定の実装。これは単純なコントロールに対して十分ですが、多くの場合コントロールを再描画すると、コントロール全体の代わりに高速ですが必要な更新プログラムへ変更された部分のみ。
OnDraw の関数は rcInvalidの再描画する必要があるコントロールの四角形領域を渡すことにより、最適化の簡単な方法を提供します。コントロール全体 (より小さい塗装プロセスを高速化するには、この領域は、通常使用します。
メタファイルを使用してコントロールを描画する
ほとんどの場合、画面デバイス コンテキスト (DC) への OnDraw の関数の点への pdc パラメーター。ただし、コントロールのまたは印刷プレビュー セッションの間のイメージを印刷すると、描画のために受信 DC は 「メタファイル DC」という特殊な型です。画面 DC とは異なり、すぐに処理する要求を開き、メタファイルの DC 格納して後で遊ばれる要求を渡して。あるコンテナー アプリケーションは、デザイン時モードでメタファイルの DC を使用してコントロールのイメージを表示するように選択する場合があります。
メタファイルの描画の要求は 2 個のインターフェイス関数でコンテナーによって設定できます: IViewObject::Draw (この関数は、非メタファイルの描画を呼び出すことができます)と IDataObject::GetData。メタファイルの DC がパラメーターの 1 文字として渡すとき、 MFC フレームワークは COleControl::OnDrawMetafileに呼び出しを行います。これが仮想メンバー関数であるため、特別な処理を行うにコントロール クラスでこの関数をオーバーライドします。既定の動作は COleControl::OnDrawをダイヤルします。
コントロールを確実には、画面の両方で描画でき、メタファイルのデバイス コンテキスト、画面、メタファイル DC の両方でサポートされているメンバー関数のみ使用します。座標系がピクセルが使用されない場合があることに注意してください。
OnDrawMetafile の既定の実装がコントロールの OnDraw の関数をダイヤルするため、 OnDrawMetafileをオーバーライドして、メタファイルと画面デバイス コンテキストの両方に適しているメンバー関数のみ使用します。次は、メタファイルと画面デバイス コンテキストの両方で利用できる CDC のメンバー関数のサブセットを示します。これらの関数の詳細については、 " MFC リファレンスのクラス CDC を参照してください。
円弧 |
BibBlt |
コード |
---|---|---|
Ellipse |
エスケープ特殊文字 |
ExcludeClipRect |
ExtTextOut |
FloodFill |
IntersectClipRect |
LineTo |
MoveTo |
OffsetClipRgn |
OffsetViewportOrg |
OffsetWindowOrg |
PatBlt |
Pie |
Polygon |
Polyline |
PolyPolygon |
RealizePalette |
RestoreDC |
RoundRect |
SaveDC |
ScaleViewportExt |
ScaleWindowExt |
SelectClipRgn |
SelectObject |
SelectPalette |
SetBkColor |
SetBkMode |
SetMapMode |
SetMapperFlags |
SetPixel |
SetPolyFillMode |
SetROP2 |
SetStretchBltMode |
SetTextColor |
SetTextJustification |
SetViewportExt |
SetViewportOrg |
SetWindowExt |
SetWindowORg |
StretchBlt |
TextOut |
|
CDC のメンバー関数に加えて、メタファイルの DC で互換性のある他の関数があります。これらは CBrushの CPalette::AnimatePalette、 CFont::CreateFontIndirect、 3 人の関数が含まれます: CreateBrushIndirect、 CreateDIBPatternBrushと CreatePatternBrush。
メタファイルに記録されていない関数は次のとおりです: DrawFocusRect、 DrawIcon、 DrawText、 ExcludeUpdateRgn、 FillRect、 FrameRect、 GrayString、 InvertRect、 ScrollDCと TabbedTextOut。メタファイルの DC がデバイスによって実際に関連付けられていないため、メタファイルの DC の SetDIBits、 GetDIBits と CreateDIBitmap を使用できません。先としてメタファイルの DC の SetDIBitsToDevice と StretchDIBits を使用できます。CreateCompatibleDC、 CreateCompatibleBitmapと CreateDiscardableBitmap は、メタファイルの DC と意味がなくなります。
メタファイル DC)を使用することも、座標系はピクセルが使用されない場合があるかどうかを検討する別のポイント。したがって、すべての描画コードは rcBounds パラメーターの OnDrawに渡される四角形の範囲にする必要があります。これは rcBounds がコントロールのウィンドウ サイズを表すため、コントロールの外側の誤ったを描画します。
コントロールのメタファイルのレンダリングを実行した後、メタファイルをテストするテスト コンテナーを使用します。テスト コンテナーへのアクセス方法については、「テスト コンテナーでのプロパティとイベントのテスト」を参照してください。
コントロールのメタファイルをテスト コンテナーを使用してテストするには
テスト コンテナーの 編集 で、メニューのをクリックします Insert New Control。
Insert New Control ボックスでコントロールを選択し、 OKをクリックします。
コントロールは、テスト コンテナーに表示されます。
コントロール のメニューで、 Draw Metafileをクリックします。
二つのペインは、メタファイルを表示するのかをで表示されます。スケーリングがコントロールのメタファイルにどのように影響するかについてこのウィンドウのサイズを変更できます。このペインをいつでも閉じることができます。