2301_76247106 2023-12-17 21:57 采纳率: 5.3%
浏览 7
已结题

duilib界面学习

利用duilib进行界面学习,自己设计了个xml文件,主要显示早餐,午餐,晚餐对应各自消耗的金额。如早餐
消费10元。进行界面显示,但是目前界面一次性都会显示出来。现在想根据代码匹配到类型,每次只显示一种。比如在右下角,类型为早餐时,只显示早餐的消耗;午餐时,显示午餐的消耗;晚餐时,显示午餐的消耗。这种如何实现,xml需要重新修改吗?原先是在xml加了固定字符串,金额刷新在界面显示。现在需要如何修改,根据类型每次再右下角只显示一种

  • 写回答

19条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-12-17 21:57
    关注
    获得0.45元问题酬金

    引自强大而免费的微信小程序:皆我知道

    要实现根据类型每次只显示一种消耗,可以在xml文件中添加一个控件用于显示消耗金额,然后在代码中根据类型更新该控件的文本内容。下面是一个示例代码:

    #include <Windows.h>
    #include <string>
    #include "DuiLib/UIlib.h"
    
    using namespace DuiLib;
    
    // 定义一个全局的标识当前消耗类型的变量
    enum ConsumeType
    {
        Breakfast,
        Lunch,
        Dinner
    };
    
    // 定义一个全局的用于显示消耗金额的控件指针
    CTextUI* g_pConsumeText = nullptr;
    
    // 自定义的窗口类
    class CMainWnd : public CWindowWnd, public INotifyUI
    {
    public:
        void Init()
        {
            // 创建窗口
            m_PaintManager.Init(m_hWnd);
            CDialogBuilder builder;
            CControlUI* pRoot = builder.Create(_T("main.xml"), (UINT)0, nullptr, &m_PaintManager);
            m_PaintManager.AttachDialog(pRoot);
            m_PaintManager.AddNotifier(this);
    
            // 获取显示消耗金额的控件指针
            g_pConsumeText = static_cast<CTextUI*>(m_PaintManager.FindControl(_T("txt_consume")));
    
            // 初始化消耗类型和金额
            m_eConsumeType = Breakfast;
            m_nConsumeAmount = 0;
        }
        void Notify(TNotifyUI& msg)
        {
            if (msg.sType == _T("click"))
            {
                if (msg.pSender->GetName() == _T("btn_breakfast"))
                {
                    // 切换到早餐类型,更新消耗金额
                    m_eConsumeType = Breakfast;
                    m_nConsumeAmount = 10;
                    UpdateConsumeText();
                }
                else if (msg.pSender->GetName() == _T("btn_lunch"))
                {
                    // 切换到午餐类型,更新消耗金额
                    m_eConsumeType = Lunch;
                    m_nConsumeAmount = 20;
                    UpdateConsumeText();
                }
                else if (msg.pSender->GetName() == _T("btn_dinner"))
                {
                    // 切换到晚餐类型,更新消耗金额
                    m_eConsumeType = Dinner;
                    m_nConsumeAmount = 30;
                    UpdateConsumeText();
                }
            }
        }
    
        // 更新控件显示的消耗金额
        void UpdateConsumeText()
        {
            std::wstring strConsume;
            if (m_eConsumeType == Breakfast)
            {
                strConsume = L"早餐消耗金额:" + std::to_wstring(m_nConsumeAmount) + L"元";
            }
            else if (m_eConsumeType == Lunch)
            {
                strConsume = L"午餐消耗金额:" + std::to_wstring(m_nConsumeAmount) + L"元";
            }
            else if (m_eConsumeType == Dinner)
            {
                strConsume = L"晚餐消耗金额:" + std::to_wstring(m_nConsumeAmount) + L"元";
            }
    
            if (g_pConsumeText)
            {
                g_pConsumeText->SetText(strConsume.c_str());
            }
        }
    
        LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
        {
            if (uMsg == WM_CREATE)
            {
                Init();
                return true;
            }
            LRESULT lRes = 0;
            if (m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes))
                return lRes;
            return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
        }
    private:
        CPaintManagerUI m_PaintManager;
        ConsumeType m_eConsumeType;
        int m_nConsumeAmount;
    };
    
    int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
        CPaintManagerUI::SetInstance(hInstance);
        CMainWnd wnd;
        HWND hwnd = wnd.Create(nullptr, _T("DuiLib Demo"), UI_WNDSTYLE_FRAME, 0, 0, 800, 600);
        // 可根据需要设置窗口的样式
        wnd.CenterWindow();
        ShowWindow(hwnd, SW_SHOW);
        CPaintManagerUI::MessageLoop();
        CPaintManagerUI::Term();
    
        return 0;
    }
    

    解析代码

    • 程序入口是WinMain函数,通过创建CMainWnd对象来创建窗口,最后通过CPaintManagerUI::MessageLoop()来进入消息循环。

    • CMainWnd类继承自CWindowWnd,实现了INotifyUI接口用于接收消息通知。

    • 在CMainWnd类的Init函数中通过DuiLib的CDialogBuilder类解析xml文件来创建窗口界面,同时获取用于显示消耗金额的控件指针。

    • 在Notify函数中根据不同的按钮点击事件更新消耗类型和金额,并调用UpdateConsumeText函数更新控件显示的消耗金额。

    • UpdateConsumeText函数根据当前消耗类型和金额更新控件的文本内容。

    在xml文件中需要添加一个用于显示消耗金额的Text控件,可以将它放在右下角。代码中使用m_PaintManager.FindControl通过控件的名称获取控件指针,在Notify函数中根据不同的按钮点击事件更新控件的文本内容。

    希望这个示例对你有帮助!如果有更多问题,请继续提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月25日
  • 创建了问题 12月17日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见