Share via


Optimieren der Beibehaltung und von Initialisierung

Standardmäßig sind Dauerhaftigkeit und die Initialisierung in einem Steuerelement über die DoPropExchange-Memberfunktion bearbeitet.In einem typischen Steuerelement enthält PX_ mehrere Aufrufe dieser Funktion PX_Color( PX_Font, Funktionen usw.), eine für jede Eigenschaft.

Dieser Ansatz hat den Vorteil, dass eine einzelne DoPropExchange Implementierung für die Initialisierung für Dauerhaftigkeit im Binärformat und so genannten "für Dauerhaftigkeit im Format" Behälter ein Property verwendet werden kann, das von mehreren Containern verwendet wird.Diese Funktion stellt alle Informationen über die Eigenschaften und deren Standardwerte in einem geeigneten Speicherort.

Allerdings kommt dieses Allgemeine auf Kosten der Effizienz.Die PX_-Funktionen rufen ihre Flexibilität von mehrschichtige Implementierungen, die weniger effizient als grundsätzlich mehr direkt sind, aber weniger flexible, Ansätze ab.Darüber hinaus wenn ein Steuerelement PX_ eines Standardwerts an eine Funktion übergeben wird, muss dieser Standardwert auch in Situationen jedes Mal bereitgestellt werden, wenn der Standardwert möglicherweise nicht notwendigerweise verwendet wird.Bei den Standardwert zu generieren eine nicht-triviale Aufgabe ist (z. B. wenn der Wert einer Ambient-Eigenschaft abgerufen wird), sind zusätzliche, nicht benötigte Aufgaben, wenn der Standardwert nicht verwendet wird.

Sie können die Dauerhaftigkeit des Steuerelements binäre verbessern, indem Sie Serialize-Funktion des Steuerelements überschreiben.Die Standardimplementierung dieser Memberfunktion macht einen Aufruf der DoPropExchange-Funktion.Indem Sie sie überschreiben, können Sie eine direktere Implementierung für binäre Dauerhaftigkeit bereitstellen.Betrachten Sie z. B. diese DoPropExchange-Funktion:

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(""));
}

Um die Leistung der binären Dauerhaftigkeit des Steuerelements zu verbessern, können Sie die Funktion überschrieben Serialize wie folgt:

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;
    }
}

Die lokale Variable dwVersion kann verwendet werden, um die Version des permanenten Zustands ladenden oder gespeicherten des Steuerelements zu erkennen.Sie können diese Variable verwenden, anstatt CPropExchange::GetVersion aufzurufen.

Um ein wenig Platz im persistenten Format für eine BOOL-Eigenschaft zu speichern (und sie werden mit dem Format kompatibel PX_Bool von erzeugt), können Sie die Eigenschaft als BYTE speichern wie folgt:

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

Beachten Sie, dass das Laden des Systemkatalogs ist eine temporäre Variable verwendet und dann wird der zugehörige Wert zugewiesen, anstatt m_boolProp umwandelnd zu einem BYTE Reference.Das Gussverfahren nur ein Byte aus m_boolProp würde dazu führen, dass geändert wurde und schlagen würde die verbleibenden Bytes nicht initialisiert.

Für das gleiche Steuerelement können Sie die Initialisierung des Steuerelements optimieren, indem Sie COleControl::OnResetState überschreiben, wie folgt:

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

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

Obwohl Serialize und OnResetState überschrieben wurden, sollte die DoPropExchange-Funktion intakt gehalten werden, da sie immer noch im permanenten Speicher für ein Property Behälter Format verwendet wird.Es ist wichtig, alle drei dieser Funktionen aufrechtzuerhalten, um sicherzustellen, dass das Steuerelement seine Eigenschaften einheitlich verwaltet, unabhängig von der Mechanismus zur Beibehaltung der Container verwendet.

Siehe auch

Konzepte

MFC-ActiveX-Steuerelemente: Optimierung