zoukankan      html  css  js  c++  java
  • 学习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;
    }
  • 相关阅读:
    php hash_hmac HMAC_SHA1 加密
    文件上传最好用绝对路径
    composer 安装插件
    php 账单生成
    php 求当前日期到下一年的实际天数
    php 求两个日期之间相差的天数
    PHP闭包 function() use()
    php 验证参数为0 但不为空
    php 原生mysqli
    前端框架选择
  • 原文地址:https://www.cnblogs.com/szyicol/p/13055063.html
Copyright © 2011-2022 走看看