利用duilib进行界面学习,自己设计了个xml文件,主要显示早餐,午餐,晚餐对应各自消耗的金额。如早餐
消费10元。进行界面显示,但是目前界面一次性都会显示出来。现在想根据代码匹配到类型,每次只显示一种。比如在右下角,类型为早餐时,只显示早餐的消耗;午餐时,显示午餐的消耗;晚餐时,显示午餐的消耗。这种如何实现,xml需要重新修改吗?原先是在xml加了固定字符串,金额刷新在界面显示。现在需要如何修改,根据类型每次再右下角只显示一种
duilib界面学习
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
19条回答 默认 最新
关注 获得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函数中根据不同的按钮点击事件更新控件的文本内容。希望这个示例对你有帮助!如果有更多问题,请继续提问。
解决 1无用-
悬赏问题
- ¥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局部变量对蓝图不可见