最佳化保存性及初始化
根據預設,持續性和控制項中的初始設定由DoPropExchange成員函式。 在典型的控制項中,這個函式會包含呼叫數個 PX_ 函式 (PX_Color, PX_Font,依此類推),另一個則用於每個屬性。
這種方法的優點是,會有一個DoPropExchange實作可以用於初始化、 二進位格式,持續性和所謂 「 屬性-包"先前的一些容器中的持續性。 這一個函式提供屬性和它們的預設值,在一個便利的位置中的所有資訊。
不過,這項通則在降低效率。 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),您可以將儲存為屬性位元組,如下:
if (ar.IsLoading())
{
BYTE bTmp;
ar >> bTmp;
m_BoolProp = (BOOL)bTmp;
// other properties...
}
else
{
ar << (BYTE)m_BoolProp;
// other properties...
}
請注意在負載的情況下,使用暫存變數,則會指派它的值,而不是將轉型m_boolProp到位元組的參考。 轉型技術會導致只有一個位元組的m_boolProp被修改,並保留其餘未初始化的位元組。
在相同的控制項,您可以藉由覆寫最佳化控制項的初始設定 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函式應該保持不變因為仍然使用它的屬性包格式中的持續性。 請務必維護這三個這些函式以確保控制項管理它的屬性必須一致,無論何種保存性機制容器使用。