共用方式為


最佳化持續性和初始化

根據預設,持續性和初始化在控制由 DoPropExchange 成員函式來處理。 在典型的控制項,這個函式包含呼叫數個 PX_ 函式 (PX_ColorPX_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產生的格式相容),您可以將屬性視為 BYTE,如下所示:

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

請注意在負載的情況下,暫存變數使用然後其值是指定,而不是轉換 m_boolProp 對 BYTE 參考。 轉換製程只會被修改的位元組 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();
}

SerializeOnResetState 同樣覆寫,應該保持 DoPropExchange 函式不變,因為它會繼續仍然使用在屬性包格式。 維護全部三個函式一定會是重要的控制項一致地管理其屬性,保存性機制的容器使用。

請參閱

概念

MFC ActiveX 控制項:最佳化