第二十一条:SOUIにおけるコントロール登録メカニズム
11605 ワード
Win 32プログラミングでは、ユーザが新しいコントロールを必要とする場合、新しいコントロールタイプをシステムに登録する必要があります.登録後、呼び出します.CreateWindowの場合、コントロールの種類を識別する文字列から新しいコントロールウィンドウオブジェクトを作成できます.
XML記述された文字列から必要なコントロールオブジェクトを作成するためには、Win 32と同様に、SOUIで新しいコントロールを作成するには、SOUIシステムに新しいコントロールクラスを登録する必要があります.
demo.cppのmainからは、以下のようなコントロール登録コントロールのコードが見られます.
ウィンドウコントロールの登録を例にとって、なぜこのようなコントロールの登録が行われたのかを説明します.
まずTplSW indowFactoryテンプレート類の実現を見てください.
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 。( )