지속성 및 초기화 최적화
기본적으로 컨트롤의 지속성 및 초기화는 멤버 함수에 DoPropExchange
의해 처리됩니다. 일반적인 컨트롤에서 이 함수는 각 속성에 대해 하나씩 여러 PX_ 함수(PX_Color
PX_Font
등)에 대한 호출을 포함합니다.
이 방법은 초기화, 이진 형식의 지속성 및 일부 컨테이너에서 사용되는 이른바 "property-bag" 형식의 지속성에 단일 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 참조로 캐스팅하는 대신 할당됩니다. 캐스팅 기술을 사용하면 1바이트의 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();
}
OnResetState
재정 Serialize
의되었지만 속성 모음 형식의 DoPropExchange
지속성에 계속 사용되므로 함수는 그대로 유지되어야 합니다. 컨테이너에서 사용하는 지속성 메커니즘에 관계없이 컨트롤이 해당 속성을 일관되게 관리하도록 하려면 이러한 세 함수를 모두 기본 것이 중요합니다.