手順 4: 描画コードの変更
既定では、コントロールの描画コードは、2 乗と PolyCtlテキストを表示します。この手順では、よりも注意事項を表示するようにコードを変更します。次のタスクは複雑です:
ヘッダー ファイルの変更
OnDraw 関数の変更
メソッドを多角形の点が計算するコードの追加
塗りつぶしの色の初期化
ヘッダー ファイルの変更
数値のサポートを追加しますが、位置を格納する配列を作成して計算される多角形の点を使用すると、cos作用、および sin。
ヘッダー ファイルを変更するには
PolyCtl.h の上に行 #include <math.h> を追加します。ファイルの先頭に、次のようになります。:
#include <math.h> #include "resource.h" // main symbols
多角形の点が計算されている場合、POINT型の配列に格納されるので、PolyCtl.h の m_nSides の定義の後に配列を追加します:
POINT m_arrPoint[100];
OnDraw のメソッドの変更
これで PolyCtl.h の OnDraw のメソッドを変更する必要があります。追加するコードの多角形を描画するために、Ellipse と Polygon の Win32 API 関数の実際の描画を実行するために呼び出す新しいブラシ、ペンを作成します。
OnDraw 関数を変更するには
次のコードで PolyCtl.h の OnDraw の既存のメソッドを置換します:
HRESULT CPolyCtl::OnDraw(ATL_DRAWINFO& di) { RECT& rc = *(RECT*)di.prcBounds; HDC hdc = di.hdcDraw; COLORREF colFore; HBRUSH hOldBrush, hBrush; HPEN hOldPen, hPen; // Translate m_colFore into a COLORREF type OleTranslateColor(m_clrFillColor, NULL, &colFore); // Create and select the colors to draw the circle hPen = (HPEN)GetStockObject(BLACK_PEN); hOldPen = (HPEN)SelectObject(hdc, hPen); hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); Ellipse(hdc, rc.left, rc.top, rc.right, rc.bottom); // Create and select the brush that will be used to fill the polygon hBrush = CreateSolidBrush(colFore); SelectObject(hdc, hBrush); CalcPoints(rc); Polygon(hdc, &m_arrPoint[0], m_nSides); // Select back the old pen and brush and delete the brush we created SelectObject(hdc, hOldPen); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); return S_OK; }
メソッドを多角形の点が計算するコードの追加
多角形の周囲を構成する点の座標を計算する CalcPointsというメソッドを追加します。これらの数は、関数に渡された RECT の変数に基づいています。
CalcPoints のメソッドを追加するには
PolyCtl.h の CPolyCtl クラスの IPolyCtl のパブリック セクションに CalcPoints の宣言を追加します:
void CalcPoints(const RECT& rc);
CPolyCtl のクラスのパブリック セクションの最後の部分は次のようになります。:
void FinalRelease() { } public: STDMETHOD(get_Sides)(short* pVal); STDMETHOD(put_Sides)(short newVal); void CalcPoints(const RECT& rc);
PolyCtl.cpp の最後に CalcPoints のこの関数の実装を追加します:
void CPolyCtl::CalcPoints(const RECT& rc) { const double pi = 3.14159265358979; POINT ptCenter; double dblRadiusx = (rc.right - rc.left) / 2; double dblRadiusy = (rc.bottom - rc.top) / 2; double dblAngle = 3 * pi / 2; // Start at the top double dblDiff = 2 * pi / m_nSides; // Angle each side will make ptCenter.x = (rc.left + rc.right) / 2; ptCenter.y = (rc.top + rc.bottom) / 2; // Calculate the points for each side for (int i = 0; i < m_nSides; i++) { m_arrPoint[i].x = (long)(dblRadiusx * cos(dblAngle) + ptCenter.x + 0.5); m_arrPoint[i].y = (long)(dblRadiusy * sin(dblAngle) + ptCenter.y + 0.5); dblAngle += dblDiff; } }
塗りつぶしの色の初期化
既定の色 m_clrFillColor を初期化します。
塗りつぶしの色を初期化します。
PolyCtl.h の CPolyCtl のコンストラクターに次の行を追加して、既定の色ように、緑の使用:
m_clrFillColor = RGB(0, 0xFF, 0);
コンストラクターは次のようになります。:
CPolyCtl()
{
m_nSides = 3;
m_clrFillColor = RGB(0, 0xFF, 0);
}
コントロールのビルドとテスト
コントロールをビルドし直します。まだ開いている場合は閉じてから [効果あり] の [多角形のビルド] メニューのをクリックし、を PolyCtl.htm ファイルに確認します。ActiveX コントロール テスト コンテナーは PolyCtl.htm ページからコントロール、今回の使用をもう一度表示できます。
ActiveX コントロール テスト コンテナーを使用します。
ActiveX コントロール テスト コンテナーを作成、開始します。詳細については、TSTCON サンプル: ActiveX コントロール テスト コンテナーを参照してください。
テスト コンテナーで、[編集] のメニューのをクリック Insert New Control。
PolyCtl Classと呼ばれる、をクリック OK、コントロールを検索します。Circle 内の緑の三角形が表示されます。
次の手順に従って、辺の数を変更してみてください。テスト コンテナー内からデュアル インターフェイスのプロパティを変更するには、Invoke Methodsを使用します。
テスト コンテナー内のコントロールのプロパティを変更するには
テスト コンテナーで、コントロール の Invoke Methods メニューのをクリックします。
[メソッドを呼び出します] のダイアログ ボックスが表示されます。
[メソッド名] のドロップダウン リスト ボックスで Sides のプロパティの PropPut のバージョンを選択します。
[パラメーター値] ボックスの 5 を入力し、**[値の設定]をクリックし、[呼び出し]**をクリックします。
コントロールが変更されないことに注意してください。m_nSides の変数を設定して、辺の数を内部的に変更されますが、これにより、コントロールは再描画しませんいません。別のアプリケーションに切り替えて、テスト コンテナーに戻った場合、コントロールは、正しい数の再描画およびがあることがわかります。
この問題を解決するには、IViewObjectExImplで定義されている FireViewChange 関数の呼び出しを設定した後、追加の数。コントロールが独自のウィンドウで実行されている場合、FireViewChange 直接 InvalidateRect のメソッドを呼び出します。コントロールがウィンドウなし実行する場合は InvalidateRect のメソッドはコンテナーのインターフェイスで呼び出されます。これは、それ自体を再描画するためにコントロールが強制されます。
呼び出しを FireViewChange に追加するには
put_Sides のメソッドに FireViewChange に呼び出しを追加して、PolyCtl.cpp を更新します。完了したら、put_Sides のメソッドは次のようになります。:
STDMETHODIMP CPolyCtl::put_Sides(short newVal) { if (2 < newVal && newVal < 101) { m_nSides = newVal; FireViewChange(); return S_OK; } else { return Error(_T("Shape must have between 3 and 100 sides")); } }
FireViewChangeを追加したら、リビルドが ActiveX コントロール テスト コンテナーでコントロールをもう一度試します。辺の数を変更し、Invokeをクリックすると、今度コントロールをすぐに確認する必要があります。
次の手順では、イベントを追加します。