永続化と初期化の最適化
既定では、コントロールの永続性と初期化は DoPropExchange のメンバー関数によって処理されます。一般的なコントロールに、この関数は PX_ の複数の関数 (PX_Color、 PX_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();
}
Serialize と OnResetState がオーバーライドされたが、 DoPropExchange 関数は、プロパティ バッグの形式で永続性に使用されるためそのままにする必要があります。これらの関数のコントロールを永続性の機能がコンテナー使用するプロパティを一貫して管理するように 3 をすべて保持することが重要です。