次の方法で共有


永続化と初期化の最適化

コントロールの既定で、永続性、および初期化は DoPropExchange のメンバー関数によって処理されます。 一般的なコントロールでは、この関数は PX_ のいくつかの関数 (PX_ColorPX_Fontなど) の呼び出しは、各プロパティの 1 が含まれます。

DoPropExchange の単一の実装を持つコンテナーで使用されるいわゆる「プロパティ バッグ」形式で初期化、永続化、永続化にバイナリ形式で使用できるこのにメリットがあります。 この 1 種類の関数が 1 の便利な場所のプロパティと既定値に関するすべての情報を提供します。

ただし、この一般性が効率を犠牲にしています。 PX_ 関数柔軟性を直接より大きい本来より効率的であり、あまり柔軟な方法で取得、多階層の実装。 また、コントロールが PX_ 関数に既定値を渡すと、その既定値は状況に既定値は必ずしも使用されない場合は、必ず指定する必要があります。 既定値を生成できることが重要なタスク値をアンビエント プロパティから取得した場合 (たとえば、) の場合、既定値が使用されていない場合は、追加の不要な処理が実行されます。

コントロールの Serialize 関数をオーバーライドすることにより、コントロールのバイナリ永続性パフォーマンスが向上します。 このメンバー関数の既定の実装は DoPropExchange 関数を呼び出します。 これをオーバーライドして、バイナリ永続性に直接実装を提供できます。 たとえば、DoPropExchange でこの関数を検討する:

void CMyAxOptCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);

   PX_Bool(pPX, _T("BoolProp"), m_BoolProp, TRUE);
   PX_Short(pPX, _T("ShortProp"), m_ShortProp, 0);
   PX_Color(pPX, _T("ColorProp"), m_ColorProp, RGB(0xFF,0x00,0x00));
   PX_String(pPX, _T("StringProp"), m_StringProp, _T(""));
}

次のようにこのコントロールのバイナリ永続性のパフォーマンスを向上させるには、Serialize の関数をオーバーライドするには:

void CMyAxOptCtrl::Serialize(CArchive& ar)
{ 
    SerializeVersion(ar, MAKELONG(_wVerMinor, _wVerMajor));
    SerializeExtent(ar);
    SerializeStockProps(ar);

    if (ar.IsLoading())
    {
        ar >> m_BoolProp;
        ar >> m_ShortProp;
        ar >> m_ColorProp;
        ar >> m_StringProp;
    }
    else
    {
        ar << m_BoolProp;
        ar << m_ShortProp;
        ar << m_ColorProp;
        ar << m_StringProp;
    }
}

dwVersion のローカル変数が読み込まれるまたは格納済みのコントロールの永続的な状態のバージョンを検出するために使用できます。 CPropExchange::GetVersionを呼び出す代わりに、変数を使用できます。

次のよう BOOL のプロパティの永続的な形式の小さい領域を節約するためには、それを PX_Boolで生成された形式との互換性を保つため)、BYTEとしてプロパティを格納し、:

if (ar.IsLoading())
{
   BYTE bTmp;
   ar >> bTmp;
   m_BoolProp = (BOOL)bTmp;
   // other properties...
}
else
{
   ar << (BYTE)m_BoolProp;
   // other properties...
}

ロードの場合で、テンポラリ変数に使用され、表示される値は BYTE の参照に割り当てられ m_boolProp ではなくをキャストします。 キャスト手法は残りのバイトを初期化前の状態に戻されてと m_boolProp を変更する 1 バイトだけで発生します。

同じコントロールでは、次のようにオーバーライドの COleControl::OnResetState でコントロールの初期化を最適化するには:

void CMyAxOptCtrl::OnResetState()
{
   ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
   ResetStockProps();

   m_BoolProp = TRUE;
   m_ShortProp = 0;
   m_ColorProp = RGB(0xFF,0x00,0x00);
   m_StringProp.Empty();
}

SerializeOnResetState がオーバーライドされ、DoPropExchange 関数が、プロパティ バッグの形式で永続化に使用されるため、そのまま保持する必要があります。 これらの関数のコントロールが永続性機構に関係なくコンテナーを使用するプロパティを一貫して管理するように 3 つすべてを維持することが重要です。

参照

概念

MFC ActiveX コントロール : 最適化