學習c++ (七) 用duilib 編寫界面


還是那句話,不想用MFC,寫的界面丑,不想依賴MFC的一些庫,在網上閑逛,發現duilib還可以,至於QT,有時間再研究,

dulib已經沒人更新了,估計也是翻不出什么花樣了,但研究一下總算是C++的一個擴展吧

這個並不是框架,也不是語言,就可以理解為一個c++類庫,封裝了一些做界面的常用的,但跟MFC還不同,它的界面上的東西都是畫出來的,而且消息的處理方式也不太一樣

另外一點,如何畫,是用xml定義的,跟WPF的味道相似,其實來講,感覺現在的網頁,做前后端分離是一樣的感覺,UI跟業務邏輯分離

比如現在的360,網易,微信,迅雷等都是這個畫的。

這個哥們講得比較多,但代碼和資源都在CSDN上,沒分下不來,誰能告訴我怎么賺分?  (講真的,csdn這事有點惡心,跟那個視覺中國一樣德行)

https://www.cnblogs.com/Alberl/p/3341956.html

但這博客講得很粗,只適合有基礎需要加大寬度的朋友

 

這個講得很細,不過用的網易的分支版本,大家自己決定 https://www.cnblogs.com/feipeng8848/p/11912613.html

我自己的過程大概是這樣

一、從git拉下來

二、用的vs2019打開的,升級后有些不能編譯,按照提示做些簡單修改即可

#include "afxres.h"  

 LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED  

這兩個編譯錯誤,換成

#include "winres.h"

QQDemo編輯錯誤時,把res文件夾往debug目錄里扔

記得先編譯 DuiLib

三、按照RichListDemo里的樣子,寫了一個helloworld

a、把目錄 都處理一下,上面地址里的哥們都有介紹

b、需要知道按鈕被點擊,我在例子里寫了三個地方,只有一個地方沒有實現,只是懶得去弄,具體可以看下這個哥們的

https://blog.csdn.net/qq_24127015/article/details/89708749

c、這就是全部的代碼!

#pragma once
#include <UIlib.h>
using namespace DuiLib;

#ifdef _DEBUG
#   ifdef _UNICODE
#       pragma comment(lib, "DuiLib_ud.lib")
#   else
#       pragma comment(lib, "DuiLib_d.lib")
#   endif
#else
#   ifdef _UNICODE
#       pragma comment(lib, "DuiLib_u.lib")
#   else
#       pragma comment(lib, "DuiLib.lib")
#   endif
#endif


//聲明一個窗口的類
class CfrmWnd : public WindowImplBase
{
public:

    virtual LPCTSTR    GetWindowClassName() const { return _T("CfrmWnd"); }
    virtual CDuiString GetSkinFile() { return _T("duilib.xml"); }
    virtual CDuiString GetSkinFolder() { return _T(""); }
    virtual void OnFinalMessage(HWND);
    virtual void Notify(TNotifyUI& msg);
    //virtual void InitWindow();  窗口初始化可以做些事
    virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        //這里是更上一層的消息函數,用以方法獲取按鈕點擊事件,不過是有些麻煩,看下這里
        //https://blog.csdn.net/qq_24127015/article/details/89708749  
        switch (uMsg) {
        case WM_LBUTTONDOWN:
        {
        }
        break;
        case WM_LBUTTONUP:
        {
        }
        break;
        }
        return __super::HandleMessage(uMsg, wParam, lParam);
    }
    DUI_DECLARE_MESSAGE_MAP()
        virtual void OnClick(TNotifyUI& msg);
    
};

//定義宏
DUI_BEGIN_MESSAGE_MAP(CfrmWnd, WindowImplBase)
DUI_ON_MSGTYPE(DUI_MSGTYPE_CLICK, OnClick)
DUI_END_MESSAGE_MAP()


//下面所有的都是重寫或宏定義的方法
void CfrmWnd::OnFinalMessage(HWND hWnd)
{
    __super::OnFinalMessage(hWnd);
    delete this;
}
void CfrmWnd::Notify(TNotifyUI& msg)
{
            if (msg.sType == _T("click"))
        {
            if (msg.pSender->GetName() == _T("btnHello"))
            {
                ::MessageBox(NULL, _T("我是按鈕1"), _T("點擊了按鈕"), NULL);
            }
        }

    return WindowImplBase::Notify(msg);
}

void CfrmWnd::OnClick(TNotifyUI& msg)
{
    if (msg.pSender->GetName() == _T("btnHello"))
    {
        ::MessageBox(NULL, _T("hello world,我是按鈕2,用的消息映射"), _T("點擊了按鈕"), NULL);
        return;
    }
    if (msg.pSender->GetName() == _T("closebtn"))
    {
        ::MessageBox(NULL, _T("關閉了 hello world"), _T("點擊了按鈕"), NULL);
        PostQuitMessage(0); // 因為activex的原因,使用close可能會出現錯誤
        return;
    }
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
 

    CPaintManagerUI::SetInstance(hInstance);
    CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());   // 設置資源的默認路徑(此處設置為和exe在同一目錄)

    CfrmWnd duiFrame;
    duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
    duiFrame.ShowModal();

    


    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM