duilib入門簡明教程 -- 結合win32和MFC (16)
當時解決完之後上傳了程式碼,不過還是有網友看不懂,於是昨晚要求Alberl先寫duilib結合MFC的教程,當然啦,這個教程本來就在Alberl的計劃之類,所以就折中一下啦,上一篇教程只寫了一半,等寫完這個教程再去補充,如果小夥伴們還有其他要求,也可以提哦,如果在Alberl的計劃內,Alberl會盡量滿足小夥伴們的要求的~O(∩_∩)O~ 一、在MFC中使用duilib只需要將前面教程的CDuiFrameWnd的父視窗指定為MFC的視窗就好啦,將CDuiFrameWnd m_duiFrame; 定義為MFC的成員變數,在MFC的初始化函式OnInitDialog裡面建立duilib的視窗,程式碼如下:
// TODO: 在此新增額外的初始化程式碼 CPaintManagerUI::SetInstance(AfxGetInstanceHandle()); // 指定duilib的例項 CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); // 指定duilib資源的路徑,這裡指定為和exe同目錄 ::CoInitialize(NULL); // 記得釋放::CoUninitialize(); m_duiFrame.Create(*this, _T("DUIWnd"), UI_WNDSTYLE_CHILD, 0, 0, 0, 800, 600); m_duiFrame.ShowWindow(TRUE); return TRUE; // 除非將焦點設定到控制元件,否則返回 TRUE
這裡只是將duilib嵌入到MFC的主視窗,如果想要將duilib嵌入到MFC的某個控制元件,也是很簡單的,因為只需要一個HWND控制代碼就行了,就不贅述了~ 不過可以發現以下幾個問題:1、之前ActiveXUI的那個bug不再出現了。2、所有的MFC控制元件都顯示在duilib視窗的上面,這裡和ZORD順序應該有關係。3、在duilib視窗上面的【確定】按鈕點了沒反應,【取消】按鈕只有在點選不在duilib上面的那部分才會有反應。 由於Alberl暫時只是研究介面方面,還沒研究到事件響應方面,所以不去研究細節。如果有小夥伴急用的話,可以將MFC控制元件嵌入到duilib的控制元件上,或者把MFC控制元件放到非duilib區域,這樣就可以響應了。 二、在duilib中使用MFC控制元件這裡示例將MFC按鈕放到duilib滑塊條控制元件的位置: 1、準備好一個duilib控制元件來容納MFC控制元件,程式碼如下:
// 將帶控制代碼HWND的控制元件顯示到CControlUI上面
class CWndUI: public CControlUI
{
public:
CWndUI(): m_hWnd(NULL){}
virtual void SetInternVisible(bool bVisible = true)
{
__super::SetInternVisible(bVisible);
::ShowWindow(m_hWnd, bVisible);
}
virtual void SetPos(RECT rc)
{
__super::SetPos(rc);
::SetWindowPos(m_hWnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER | SWP_NOACTIVATE);
}
BOOL Attach(HWND hWndNew)
{
if (! ::IsWindow(hWndNew))
{
return FALSE;
}
m_hWnd = hWndNew;
return TRUE;
}
HWND Detach()
{
HWND hWnd = m_hWnd;
m_hWnd = NULL;
return hWnd;
}
protected:
HWND m_hWnd;
};
2、將XML中Slider節點換成Wnd,並且只保留位置資訊,XML如下:
<Wnd float="true" pos="30,77,0,0" width="139" height="18" />
3、建立Wnd控制元件:由於Slider是duilib內建的控制元件,所以duilib會根據XML資訊自動建立Slider控制元件,而CWndUI是我們自定義的控制元件,所以需要自己建立,只需要響應CreateControl函式(如果duilib發現自定義控制元件,會自動呼叫此函式來獲取控制元件),在CDuiFrameWnd加上如下函式:
virtual CControlUI* CreateControl(LPCTSTR pstrClassName){ if (_tcsicmp(pstrClassName, _T("Wnd")) == 0) { CWndUI *pUI = new CWndUI; HWND hWnd = CreateWindow(_T("BUTTON"), _T("win32"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 0, 0, 0, 0, m_PaintManager.GetPaintWindow(), NULL, NULL, NULL); pUI->Attach(hWnd); //// 上面用的是win32的按鈕,下面這段用MFC的按鈕 //CButton *pBtn = new CButton; // 記得釋放記憶體 //pBtn->Create(_T("MFC"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, CRect(0, 0, 0, 0), CWnd::FromHandle(m_PaintManager.GetPaintWindow()), 0); //pUI->Attach(*pBtn); return pUI; } return NULL; }
上面的程式碼用了win32的按鈕,其中註釋部分是MFC按鈕,親們可以都試下效果:
到現在為止,我們既可以在duilib中新增MFC控制元件,也可以在原有的MFC專案中新增duilib控制元件,就不用再擔心不能使用以前的控制元件啦~O(∩_∩)O~
- Oracle Database-別無選擇時的EXP匯出資料手記
- 創新大師Steve Blank: 你真的知道什麼是真正的精益創業嗎?
- CV學習筆記(二十四):發票類OCR識別
- 遍歷多盤的方法
- 網路應用層
- 報表生成器FastReport .Net基本資訊介紹
- mysql Index column size too large 超過767錯誤解決方案(轉)
- 耶魯大學教授給研究生做科研的11條“軍規”!
- Centos 如何安裝 nodejs
- MySQL鎖
- ICLR 2021 | 美團、上交大等:魯棒的可微分神經網路搜尋DARTS-
- 技術狂何波:戰鬥在程式化交易第一線
- .NET開源5年了,這些寶藏你還沒get?
- 數倉面試高頻考點--解決hive小檔案過多問題
- 這個17歲的黑客天才,破解了第一代iPhone!
- Unity3D利用XLua實現更新技術
- 2020廈門大學845資料結構考研考試範圍(大綱)和參考書目
- 2020 Top10計算機視覺論文總結:論文,程式碼,解讀,還有demo影片! - 知乎
- 【分享-圖片壓縮】免費線上快速圖片壓縮
- 使用OpenCV實現人臉影象卡通化