欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Duilib教程-自動(dòng)布局2

Duilib教程-自動(dòng)布局2

在上一節中,我簡(jiǎn)單介紹了控件隨父LAYOUT自由移動(dòng)的設置。在這一節,我將介紹一種常見(jiàn)的情況:嵌入窗口。

 

在項目中,我們很少會(huì )100%的編寫(xiě)一個(gè)軟件,特別是界面相關(guān)的,我們會(huì )使用以前已經(jīng)編寫(xiě)好的窗口,或網(wǎng)上的開(kāi)源模塊。舉一個(gè)簡(jiǎn)單的例子來(lái)說(shuō),如果你要編寫(xiě)一個(gè)視頻播放器,關(guān)于視頻的播放窗口,就用不著(zhù)用DUI來(lái)實(shí)現,我們完全可以使用網(wǎng)上的開(kāi)源庫,嵌入一個(gè)播放的WND即可(當然有的庫也支持回調的方式,用戶(hù)可以在自己的窗口中將回調出來(lái)的圖片進(jìn)行自由繪制)。

 

我們需要在窗口大小改變時(shí),即時(shí)地改變播放窗口的大小。也許你會(huì )說(shuō)這非常簡(jiǎn)單,直接重載OnSize,然后獲取占位控件(使用占位控件才是最正確的選擇,如果在程序中判斷左邊距、右邊距,就做不到UI、CODE分離了)的大小,然后設置即可。但是當你真正使用的時(shí)候,發(fā)現并沒(méi)有那么簡(jiǎn)單。來(lái)看代碼:

 

UIManager.cpp 第750行:

    case WM_SIZE:        {            if( m_pFocus != NULL ) {                TEventUI event = { 0 };                event.Type = UIEVENT_WINDOWSIZE;                event.pSender = m_pFocus;                event.dwTimestamp = ::GetTickCount();                m_pFocus->Event(event);            }            if( m_pRoot != NULL ) m_pRoot->NeedUpdate();        }        return true;

 

我們看到,窗口大小改變,ROOT只是簡(jiǎn)單的 NeedUpdate,重繪而已,它的大小并沒(méi)有設置為與窗口一樣的大小。

 

在WinImplBase.cpp 第214 行:

LRESULT WindowImplBase::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){         SIZE szRoundCorner = m_PaintManager.GetRoundCorner();#if defined(WIN32) && !defined(UNDER_CE)         if( !::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0) ) {                   CDuiRect rcWnd;                   ::GetWindowRect(*this, &rcWnd);                   rcWnd.Offset(-rcWnd.left, -rcWnd.top);                   rcWnd.right++; rcWnd.bottom++;                   HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);                   ::SetWindowRgn(*this, hRgn, TRUE);                   ::DeleteObject(hRgn);         }#endif         bHandled = FALSE;         return 0;}

 

也是啥也沒(méi)做。

所以在OnSize里面設置窗口位置,并不會(huì )達到效果。

 

那么DUILIB是在哪里設置ROOT的大小呢?UIManager.cpp 第 615行,即在WM_PAINT中進(jìn)行設置。

m_pRoot->SetPos(rcClient);

 

1.SetPos

當你看到這里時(shí),我想你已經(jīng)知道第一種方法了。即在 OnSize中,

RECT rc;GetClientRect (m_hWnd, &rc);m_PaintManager.GetRoot()->SetPos (rc);const RECT& rc_pos = targer_ui_->GetPos ();::MoveWindow (move_wnd, rc_pos.left, rc_pos.top, rc_pos.right – rc_pos.left, rc_pos.bottom – rc_pos.top, TRUE);

 

 

即我們主動(dòng)設置大小,ROOT設置了POS后,會(huì )將它的子控件也設置POS,詳情請看源碼。所以,我們就能夠得到正確的位置信息了。

 

但是這并不是最好的方式,原因很簡(jiǎn)單,OnSize會(huì )被頻繁的調用,特別是在程序初始化的時(shí)候,OnSize被調用N次,而且在最小化的時(shí)候也會(huì )被調用。而且當你看1.SetPos時(shí),你也猜到了會(huì )有第二種方式了。

 

2.委托 OnSize

假設我們的占位控件為 target_ui_,它有一個(gè)委托成員變量:OnSize。直接看代碼吧:

target_ui_->OnSize += MakeDelegate (this, &CYourWnd::OnTargetSizeChanged); bool CYourWnd:: OnTargetSizeChanged (void* param){const RECT& rc_pos = targer_ui_->GetPos ();::MoveWindow (move_wnd, rc_pos.left, rc_pos.top, rc_pos.right – rc_pos.left, rc_pos.bottom – rc_pos.top, TRUE);}

 

如此簡(jiǎn)單,又如此優(yōu)美的代碼。

注意使用的是 +=。

在這里,我們也看到了作者自己實(shí)現了委托的編寫(xiě)(我不清楚是不是使用了開(kāi)源庫),可見(jiàn)作者的C++功底是相當深厚的。

 

 

看CControlUI的源碼,你會(huì )發(fā)現如下委托對象:

public:    CEventSource OnInit;    CEventSource OnDestroy;    CEventSource OnSize;    CEventSource OnEvent;    CEventSource OnNotify;

 

顧名思義,無(wú)需贅述。

 

這里說(shuō)一下Event和Notify的區別。

Event是控件自己收到的消息,比如鼠標左鍵按下、彈起、雙擊等,DUILIB先向控件自己發(fā)一個(gè)事件。

Notify通知,是向WND發(fā)送的通知消息,類(lèi)似MFC中對話(huà)框收到控件的NOTIFY(包括按鈕的單擊),它默認情況下是由窗口接收的,在窗口的Notify函數中進(jìn)行響應。

 

DUILIB的處理流程是,先向CONTROL發(fā)送事件,然后向WND發(fā)送通知。

 

OnNotify相當有用,因為你可以定制每個(gè)控件的響應,而不需要在WND的Notify中進(jìn)行一大堆的if..else..了。

 

OnEvent用處也很大,看情況使用了。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
duilib進(jìn)階教程 -- 改進(jìn)List控件 (轉)
用Duilib界面庫開(kāi)發(fā)的一個(gè)日歷控件
Duilib
MFC窗口大小變化:OnSIze、OnSizing和OnGetMinMaxInfo區別與關(guān)系
對話(huà)框大小調整
VC 加入pdf閱讀控件
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久