最近準備學習新的界面庫,感覺MFC開發起來太麻煩。找到網上一些開源的界面庫,炫彩,DUILIB,感覺寫都蠻好的,由於炫彩是C就不用了,畢竟自己都是用c++開發,懶得自己進行封裝,我就選擇了duilib這個界面庫,非常感謝大牛留下的好東西。
看了網上的很多資料,發現都是直接用XML寫的界面,但對於我來說有些代碼必須是動態創建,一直在網上搜索找對應的處理方法。基本上沒有找到。於是,我直接看他怎麼解析XML,你再怎麼樣也只是用代碼生成對應的對象然後做對應的處理。
class CDUIMain:public WindowImplBase
{
public:
virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); }
virtual CDuiString GetSkinFile() { return _T("UISkin1.xml"); }
virtual CDuiString GetSkinFolder() { return _T(""); }
virtual void Notify(TNotifyUI& msg)
{
if(msg.sType == _T("click"))
{
if(msg.pSender->GetName() == _T("BtnUITest"))
{
MessageBox(*this,_T("響應事件"),0,0);
CDuiString strInfo;
strInfo.Format(_T("%d"),this->m_PaintManager.GetPostPaintCount());
MessageBox(this->m_hWnd,strInfo,0,0);
}
}
__super::Notify(msg);
}
virtual void OnClick(TNotifyUI& msg)
{
if(msg.pSender->GetName() == _T("testmy"))
{
MessageBox(*this,_T("你點擊了TestMy"),0,0);
}
__super::OnClick(msg);
}
virtual LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
PostQuitMessage(0);
return FALSE;
}
virtual void InitWindow()
{
RECT _rec;
_rec.left = 200;
_rec.right = 250;
_rec.top = 60;
_rec.bottom = 80;
CButtonUI *pBtn = new CButtonUI;
//::MessageBox(this->m_hWnd,m_PaintManager.GetRoot()->GetClass(),0,0);
//因爲第一個控件就是CContainerUI 所以我也沒有判斷
//網上都是用在XML中寫按鈕,我看了許多例子都沒有看到動態創建按鈕。
//自己研究大半天,之後模仿解析XML生成控件的代碼。
//有時候真的只有在代碼當中才能找到解決方法。
CContainerUI* p = static_cast<CContainerUI*> (m_PaintManager.GetRoot());
pBtn->SetFloat();
pBtn->SetName(_T("testmy"));
pBtn->SetText(_T("我就是我自己11111"));
pBtn->SetToolTip(_T("我是一個按鈕"));
pBtn->SetBkColor(0xff808000);
SIZE leftTop = {200,60};
pBtn->SetFixedXY(leftTop);
pBtn->SetFixedWidth(100);
pBtn->SetFixedHeight(50);
p->Add(pBtn);
}
};
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
CPaintManagerUI::SetInstance(hInstance);
CDUIMain duiFrame;
duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
duiFrame.CenterWindow();
duiFrame.ShowModal();
/*CFrameWindowWnd* pWnd = new CFrameWindowWnd;
pWnd->Create(NULL,_T(""),UI_WNDSTYLE_FRAME,NULL);
pWnd->ShowWindow();*/
CPaintManagerUI::MessageLoop();
}
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Window sizebox="4,4,4,4" caption="0,0,0,20">
<Container width="268" height="283" bkcolor="#FF0000FF">
<Button name="BtnUITest" text="我的一個東西" float="true" pos="228,30,0,0" width="124" height="30" bkcolor="#FF008080" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" />
</Container>
</Window>
其實這裏完全都可以不用XML,只是自己懶得寫了。沒有技術含量只是記錄一下而已。
網上也有資料來講解各種方法。