第二十一条:SOUIにおけるコントロール登録メカニズム

11605 ワード

Win 32プログラミングでは、ユーザが新しいコントロールを必要とする場合、新しいコントロールタイプをシステムに登録する必要があります.登録後、呼び出します.CreateWindowの場合、コントロールの種類を識別する文字列から新しいコントロールウィンドウオブジェクトを作成できます.
XML記述された文字列から必要なコントロールオブジェクトを作成するためには、Win 32と同様に、SOUIで新しいコントロールを作成するには、SOUIシステムに新しいコントロールクラスを登録する必要があります.
demo.cppのmainからは、以下のようなコントロール登録コントロールのコードが見られます.
        // SApplication              SkinObj 

        SWkeLoader wkeLoader;

        if(wkeLoader.Init(_T("wke.dll")))        

        {

            theApp->RegisterWndFactory(TplSWindowFactory<SWkeWebkit>());//  WKE   

        }

        theApp->RegisterWndFactory(TplSWindowFactory<SGifPlayer>());//  GIFPlayer

        theApp->RegisterSkinFactory(TplSkinFactory<SSkinGif>());//  SkinGif

        theApp->RegisterSkinFactory(TplSkinFactory<SSkinAPNG>());//  SSkinAPNG

        theApp->RegisterSkinFactory(TplSkinFactory<SSkinVScrollbar>());//         



        theApp->RegisterWndFactory(TplSWindowFactory<SIPAddressCtrl>());//  IP  

        theApp->RegisterWndFactory(TplSWindowFactory<SPropertyGrid>());//       

        theApp->RegisterWndFactory(TplSWindowFactory<SChromeTabCtrl>());//  ChromeTabCtrl

        theApp->RegisterWndFactory(TplSWindowFactory<SIECtrl>());//  IECtrl

        theApp->RegisterWndFactory(TplSWindowFactory<SChatEdit>());//  ChatEdit

        theApp->RegisterWndFactory(TplSWindowFactory<SScrollText>());//  SScrollText

        

        if(SUCCEEDED(CUiAnimation::Init()))

        {

            theApp->RegisterWndFactory(TplSWindowFactory<SUiAnimationWnd>());//      

        }

        theApp->RegisterWndFactory(TplSWindowFactory<SFlyWnd>());//        

        theApp->RegisterWndFactory(TplSWindowFactory<SFadeFrame>());//         

        theApp->RegisterWndFactory(TplSWindowFactory<SRadioBox2>());//         
上のコードの中には新しい皮膚の対象が登録されています.ウィンドウコントロールの登録もあります.このような登録コントロールの方式はちょっと変わっていますが、使うのも簡単です.一行のコードだけが必要です.
ウィンドウコントロールの登録を例にとって、なぜこのようなコントロールの登録が行われたのかを説明します.
まずTplSW indowFactoryテンプレート類の実現を見てください.
    class SWindowFactory

    {

    public:

        virtual ~SWindowFactory() {}

        virtual SWindow* NewWindow() = 0;

        virtual LPCWSTR SWindowBaseName()=0;



        virtual const SStringW & getWindowType()=0;



        virtual SWindowFactory* Clone() const =0;

    };



    template <typename T>

    class TplSWindowFactory : public SWindowFactory

    {

    public:

        //! Default constructor.

        TplSWindowFactory():m_strTypeName(T::GetClassName())

        {

        }



        LPCWSTR SWindowBaseName(){return T::BaseClassName();}



        // Implement WindowFactory interface

        virtual SWindow* NewWindow()

        {

            return new T;

        }



        virtual const SStringW & getWindowType()

        {

            return m_strTypeName;

        }



        virtual SWindowFactory* Clone() const 

        {

            return new TplSWindowFactory();

        }

    protected:

        SStringW m_strTypeName;

    };
TplSWindowFactory SWindowFactory  ,                 SWindowFactory  。
SWindowFactory     ?SWindowFactory             :SWindow * SWindowFactory::NewWindow();
, SWindow , C++ : ( ) 。
SOUI , SOUI.DLL , SWindow * SWindowFactory::NewWindow() SOUI 。


SWindow SSkinObjBase 。
    class SOUI_EXP SWindow : public SObject

        , public SMsgHandleState

        , public TObjRefImpl2<IObjRef,SWindow>

    {

        SOUI_CLASS_NAME(SWindow, L"window")

        //....

    };



    class SOUI_EXP SSkinObjBase : public TObjRefImpl<ISkinObj>

    {

       //......

    };
SWindow SSkinObjBase       TObjRefImpl     。           :
template<class T>

class TObjRefImpl :  public T

{

public:

    TObjRefImpl():m_cRef(1)

    {

    }



    virtual ~TObjRefImpl(){

    }



    //!    

    /*!

    */

    virtual void AddRef()

    {

        InterlockedIncrement(&m_cRef);

    }



    //!    

    /*!

    */

    virtual void Release()

    {

        InterlockedDecrement(&m_cRef);

        if(m_cRef==0)

        {

            OnFinalRelease();

        }

    }



    //!    

    /*!

    */

    virtual void OnFinalRelease()

    {

        delete this;

    }

protected:

    volatile LONG m_cRef;

};



template<class T,class T2>

class TObjRefImpl2 :  public TObjRefImpl<T>

{

public:

    virtual void OnFinalRelease()

    {

        delete static_cast<T2*>(this);

    }

};
TObjRefImpl         void OnFinalRelease(){delete this;}

SWindow SSkinObjBase SOUI , SOUI , 、 。
SOUI SOUI SOUI 。

, ?
, OnFinalRelease ,
void OnFinalRelease(){delete this;}
。 new 。( )