Sinやcos関数を使用する多角形の点の計算、これを追加する描画コードの math.h PolyCtl.h の上部に含める:
#include lt;math.h >#include"resource.h"//メイン シンボル
特価;リリースのみビルド既定のプロジェクト、ATL COM AppWizard を生成するとき、マクロ_ATL_MIN_CRTを定義します。このマクロを定義すると、必要としない場合、コードに C ランタイム ライブラリをもたらすことはありません。Polygon コントロールには浮動小数点機能を初期化する C ランタイム ライブラリのスタートアップ コード必要があります。したがって、リリース バージョンをビルドする場合、 _ATL_MIN_CRTマクロを削除する必要があります。マクロを削除するには、[プロジェクト] メニューの [設定] をクリックします。設定の:ドロップ ダウン ボックスの一覧で複数の構成を選択。表示される変更するプロジェクト構成を選択] ダイアログ ボックスで、4 つのリリース版をすべてのチェック ボックスをクリックし、 [ok]をクリックします。C または C++ ] タブで、[全般]カテゴリを選択し、 _ATL_MIN_CRTをプリプロセッサの定義] ボックスから削除(&N)。
多角形の点計算したら、ポイント PolyCtl.h のクラス定義の末尾に、 POINT型の配列を追加することで保存します。:
OLE_COLOR m_clrFillColor;短い m_nSides;ポイント m_arrPoint [100]
今すぐ変更、 OnDraw 関数で以下のいずれかに一致する PolyCtl.h。四角形、DrawText 関数への呼び出しを削除することに注意してください。あなたも明示的に取得し、黒ペンと白のブラシを選択します。コントロールがウィンドウなしで実行している場合これをする必要があります。独自のウィンドウを持っていない場合は、デバイス コンテキストに描画されます仮定をすることはできません。
完成した OnDraw に見えるこのような:
HRESULT CPolyCtl::OnDraw(ATL_DRAWINFOamp; di){RECT & rc = *(RECT*)di.prcBounds;HDC hdc = di.hdcDraw;COLORREF colFore;HBRUSH hOldBrush、hBrush;HPEN hOldPen、hPen;//M_colFore、COLORREF 型に変換OleTranslateColor (m_clrFillColor、NULL、& colFore);//を作成し、円を描画する色を選択hPen (HPEN)GetStockObject(BLACK_PEN); =hOldPen (HPEN) SelectObject (hdc、hPen); =hBrush (HBRUSH)GetStockObject(WHITE_BRUSH); =hOldBrush (HBRUSH) SelectObject (hdc、hBrush); =楕円 (hdc、rc.left、rc.top、rc.right、rc.bottom);//を作成して、多角形の塗りつぶしに使用するブラシを選択hBrush = CreateSolidBrush(colFore);SelectObject (hdc、hBrush);CalcPoints(rc);ポリゴン (hdc、& m_arrPoint [0] m_nSides);・選択、古いペンとブラシに戻る、私たちを作成、ブラシを削除SelectObject (hdc、hOldPen);SelectObject (hdc、hOldBrush);DeleteObject(hBrush);S_OK を返す;}(&A)
今すぐと呼ばれる関数を追加する必要があります CalcPoints 、ライン intersections.nbsp; の座標を計算します。これらの計算は、関数に渡す RECT 変数に基づいてされます。まず PolyCtl.h の IPolyCtl クラスのパブリック セクションに CalcPoints の定義を追加する必要があります。(&N):
voidnbsp;CalcPoints 定数の RECT (rc)(&N)
IPolyCtl クラスのパブリック セクションは次のようになります:
//IPolyCtlパブリック。STDMETHOD(get_Sides) (/※ [out, retval] ※/短い ※ newVal);STDMETHOD(put_Sides) (/※ [で] ※/ショート newVal);voidnbsp;CalcPoints 定数の RECT (rc)(&N)
次に、追加の実装は、 CalcPoints 関数、PolyCtl.cpp ファイルの末尾に:
cPolyCtl::CalcPoints は無効 (const RECTamp; rc){const 二重 pi 3.14159265358979; =ポイント ptCenter;二重 dblRadiusx = (rc.right - rc.left)/2;二重 dblRadiusy = (rc.bottom - rc.top)/2;二重 dblAngle = 3 ※ pi/2;//開始、上部二重 dblDiff = 2 ※ π/m_nSides;//各角側になります。ptCenter.x = (rc.left + rc.right)/2;ptCenter.y = (rc.top + rc.bottom)/2;//各側のポイントの計算(int I = 0; 私は < m_nSides; i + +){m_arrPoint [i] .x = (長い) (dblRadiusx ※ cos(dblAngle) + ptCenter.x + 0.5);m_arrPoint [i] .y = (長い) (dblRadiusy ※ sin(dblAngle) + ptCenter.y + 0.5);dblAngle + = dblDiff;}}
今、初期化 m_clrFillColor 。既定の色として緑を選択し、この行を追加、 CPolyCtl PolyCtl.h のコンス トラクター:
m_clrFillColor RGB = (0, 0 xff、0)
コンス トラクターは次のようになります:
CPolyCtl(){m_nSides = 3;m_clrFillColor RGB = (0, 0 xff、0);}
今すぐコントロールをリビルドし、もう一度やり直してください。ActiveX コントロール テスト コンテナーを開き、コントロールを挿入します。円の中の緑の三角形を参照してくださいする必要があります。以下の手順を実行して、辺の数を変更してください。テスト コンテナー内のデュアル インターフェイスのプロパティを変更するには、メソッドの呼び出しを使用します。:

コントロールが変更されないことに注意してください。何が問題なのですか。設定して、辺の数を変更した内部が、 m_nSides 変数には、コントロールの再描画を発生しませんでした。別のアプリケーションに切り替えたときにでしょうが戻るテスト コンテナーに切り替えてすると、コントロールは再描画し、辺の数が正しいようになりました。
この問題を解決するには、辺の数を設定した後でIViewObjectExImpl、定義されている、 FireViewChange関数への呼び出しを追加する必要があります。FireViewChangeコントロールが独自のウィンドウで実行されている場合は、 InvalidateRect API を直接呼び出します。コントロールがウィンドウなしで実行されている場合は、コンテナーのサイト インターフェイスでInvalidateRectメソッドが呼び出されます。これは、コントロール自体の再描画を強制的に。
新しい put_Sides メソッドのとおりです:
STDMETHODIMP CPolyCtl::put_Sides(short newVal){場合 (新しい gt; 2 & & newVal < 101){m_nSides 新しい; =FireViewChange();S_OK を返す;}他エラーを返す (_T (「形状が必要 3 と 100 の側の間」));}
FireViewChangeを追加した後、再構築し、コントロールをもう一度やり直してください。辺の数を変更して [ Invoke] ボタンをクリックしてこの時間すぐに変更するコントロールを表示する必要があります。
次に、コントロールにイベントを追加します。