前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Duilib学习(一)

Duilib学习(一)

作者头像
全栈程序员站长
发布2022-07-14 18:37:21
5550
发布2022-07-14 18:37:21
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是全栈君

代码语言:javascript
复制
#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 CDuiFrameWnd : public CWindowWnd, public INotifyUI
{
public:
    virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); }
    virtual void    Notify(TNotifyUI& msg) 
    {
        if (msg.sType == _T("click"))
        {
            if (msg.pSender->GetName() == _T("btnHello"))
            {
                ::MessageBox(NULL, _T("我是按钮"), _T("点击了按钮"), NULL);
            }
        }
    }

    virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        LRESULT lRes = 0;

        if (uMsg == WM_CREATE)
        {
            // 方法1
            //CControlUI *pWnd = new CButtonUI;
            //pWnd->SetName(_T("btnHello"));   // 控件的唯一标识
            //pWnd->SetText(_T("Hello World"));   // 设置文字
            //pWnd->SetBkColor(0xFF00FF00);       // 设置背景色

            //m_PaintManager.Init(m_hWnd);
            //m_PaintManager.AttachDialog(pWnd);

            //m_PaintManager.AddNotifier(this);  // 添加控件响应消息,这样消息就会达到duilib的消息循环

            // 方法2
            m_PaintManager.Init(m_hWnd);

            CDialogBuilder builder;
            CControlUI *pRoot = builder.Create(_T("duilib.xml"), NULL, NULL, &m_PaintManager, NULL);
            ASSERT(pRoot && "Failed to parse XML");

            m_PaintManager.AttachDialog(pRoot);
            m_PaintManager.AddNotifier(this);
            return lRes;
        }
        // 以下三个消息用于屏蔽系统标题栏
        // WM_NCACTIVETE WM_NCCALCSIZE WM_NCPAINT
        else if (uMsg == WM_NCACTIVATE)
        {
            if (!::IsIconic(m_hWnd))
            {
                return (wParam == 0) ? TRUE : FALSE;
            }
        }
        else if (uMsg == WM_NCCALCSIZE)
        {
            return 0;
        }
        else if (uMsg == WM_NCPAINT)
        {
            return 0;
        }

        if (m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes))
        {
            return lRes;
        }

        return __super::HandleMessage(uMsg, wParam, lParam);
    }

protected:
    CPaintManagerUI m_PaintManager;
};


class CDuiXmlFrameWnd : public WindowImplBase
{
public:
    // 实现以下三个纯虚函数
    virtual LPCTSTR GetWindowClassName()const { return _T("DUIMainFrame"); }
    virtual CDuiString GetSkinFile(){ return _T("duilib.xml"); }
    virtual CDuiString GetSkinFolder(){ return _T(""); }

    // 将事件添加到消息队列
    virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        LRESULT lRes = 0;

        if (uMsg == WM_CREATE)
        {
            // 方法1
            //CControlUI *pWnd = new CButtonUI;
            //pWnd->SetName(_T("btnHello"));   // 控件的唯一标识
            //pWnd->SetText(_T("Hello World"));   // 设置文字
            //pWnd->SetBkColor(0xFF00FF00);       // 设置背景色

            //m_PaintManager.Init(m_hWnd);
            //m_PaintManager.AttachDialog(pWnd);

            //m_PaintManager.AddNotifier(this);  // 添加控件响应消息,这样消息就会达到duilib的消息循环

            // 方法2
            m_PaintManager.Init(m_hWnd);

            CDialogBuilder builder;
            CControlUI *pRoot = builder.Create(_T("duilib.xml"), NULL, NULL, &m_PaintManager, NULL);
            ASSERT(pRoot && "Failed to parse XML");

            m_PaintManager.AttachDialog(pRoot);
            m_PaintManager.AddNotifier(this);
            return lRes;
        }
        // 以下三个消息用于屏蔽系统标题栏
        // WM_NCACTIVETE WM_NCCALCSIZE WM_NCPAINT
        else if (uMsg == WM_NCACTIVATE)
        {
            if (!::IsIconic(m_hWnd))
            {
                return (wParam == 0) ? TRUE : FALSE;
            }
        }
        else if (uMsg == WM_NCCALCSIZE)
        {
            return 0;
        }
        else if (uMsg == WM_NCPAINT)
        {
            return 0;
        }

        if (m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes))
        {
            return lRes;
        }

        return __super::HandleMessage(uMsg, wParam, lParam);
    }

    // 实现控件响应事件
    virtual void Notify(TNotifyUI& msg)
    {
        if (msg.pSender->GetName() == _T("editHello"))
        {
            // 获取控件对象方法
            CEditUI *pEdit = static_cast<CEditUI *>(m_PaintManager.FindControl(_T("editHello")));
        }
        // 处理控件响应事件
        if (msg.sType == _T("click"))
        {
            if (msg.pSender->GetName() == _T("btnHello"))
            {
                ::MessageBox(NULL, _T("我是按钮"), _T("点击了按钮"), NULL);

                // 人为修改控件焦点
                CEditUI *pEdit2 = static_cast<CEditUI *>(m_PaintManager.FindControl(_T("editWorld")));
                m_PaintManager.SetFocus(pEdit2, TRUE);
            }
        }
    }
};

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    // 实例句柄与渲染类关联
    CPaintManagerUI::SetInstance(hInstance);

    // 设置资源的默认路径(设置和exe在同一个目录)
    CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());

    /*CDuiFrameWnd duiFrame;
    duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
    duiFrame.CenterWindow();
    duiFrame.ShowModal();*/

    // 方法2
    CDuiXmlFrameWnd duixmlFrame;
    duixmlFrame.Create(NULL, _T("DuiWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
    duixmlFrame.CenterWindow();
    duixmlFrame.ShowModal();
    
    return 0;
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120245.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档