nim_duilib之msgbox用法(23)

概述

  • 本文将介绍 msgbox 的用法
  • 更多用法,请参考 源码
  • 改进了原有的xml样式

一个样式

xml结构

整体垂直布局

xml源码

demo源码下的msg/msg.xml文件内容 改为如下

注意: 代码中控件的关联(我这里的xml中换了新的名字)

<?xml version="1.0" encoding="UTF-8"?>
<Window size="340,180" caption="0,0,0,34" >
  <VBox width="340" height="auto" bkcolor="bk_wnd_ligt_dark">

    <!--标题栏 含关闭按钮-->
    <HBox class="caption" >
      <Label class="font_title" name="label_title" width="stretch"  margin="20,6,0,0" />
      <Button class="btn_wnd_close" name="closebtn" margin="20,6,10,0"/>
    </HBox>

    <VBox height="1">
      <Control height="1" bkcolor="light_gray2" />
    </VBox>

    <!--中间显示的内容-->
    <RichEdit class="richedit_show" name="richedit_content" width="300" margin="20,30,20,30" multiline="true" vscrollbar="false" autovscroll="false" enabled="false" rich="true"/>

    <!--下面的按钮-->
    <HBox height="auto" margin="0,0,20,20" childmargin="10" >
      <Control />
      <Button  class="btn_global_blue_80x30" name="btn_yup" normaltextcolor="white"/>
      <Button  class="btn_global_white_80x30" name="btn_nope" normaltextcolor="darkcolor"/>
    </HBox>


  </VBox>
</Window>

其中, caption的定义如下:

  <Class name="caption" height="34" bkcolor="bk_wnd_ligt_dark" />

richedit_show定义如下

  <Class name="richedit_show" font="system_18" disabledtextcolor="color_palette10" />

控件关联

void MsgBox::InitWindow()
{
	m_pRoot->AttachBubbledEvent(ui::kEventClick, nbase::Bind(&MsgBox::OnClicked, this, std::placeholders::_1));

	//title_ = (Label*)FindControl(L"title");
	//content_ = (RichEdit*)FindControl(L"content");
	//btn_yes_ = (Button*)FindControl(L"btn_yes");
	//btn_no_ = (Button*)FindControl(L"btn_no");

	ui::Control* pctrl = nullptr;

	// 1. 标题栏
	pctrl = FindControl(L"label_title");
	if (pctrl)
		title_ = dynamic_cast<ui::Label*>(pctrl);

	// 2. 中间显示提示内容
	pctrl = FindControl(L"richedit_content");
	if (pctrl)
		content_ = dynamic_cast<ui::RichEdit*>(pctrl);


	// 3. 按钮 确定
	pctrl = FindControl(L"btn_yup");
	if (pctrl)
		btn_yes_ = dynamic_cast<ui::Button*>(pctrl);

	// 4. 按钮 取消
	pctrl = FindControl(L"btn_nope");
	if (pctrl)
		btn_no_ = dynamic_cast<ui::Button*>(pctrl);

}

代码中用法

需要定义一个回调,当msgbox退出后,可以在这个函数中获取当前选择的是哪一个按钮

	nim_comp::MsgboxCallback mc = [](nim_comp::MsgBoxRet ret)
	{
		if (nim_comp::MsgBoxRet::MB_YES == ret)
		{
			;
		}
		else if (nim_comp::MsgBoxRet::MB_NO == ret)
		{
			;
		}
		else
		{
			;
		}
	};
	
	

	nim_comp::ShowMsgBox(m_hWnd, mc,
						L"内容", false,
						L"标题", false,
						L"OK", false,
						L"Nope", false);

如果不需要处理返回值,直接传递一个空的闭包即可


	nim_comp::ShowMsgBox(m_hWnd, nim_comp::MsgboxCallback(),
						L"内容", false,
						L"标题", false,
						L"OK", false,
						L"Nope", false);

扩展

重写父类函数 HandleMessage, 实现其对ESC的响应,当然, 你可以加上对Enter按键的响应。

LRESULT MsgBox::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	if (uMsg == WM_KEYDOWN && wParam == VK_ESCAPE)
	{
		this->Close(0);

		return 0;
	}

	return __super::HandleMessage(uMsg, wParam, lParam);
}
posted @ 2020-12-29 22:38  mohist  阅读(912)  评论(0编辑  收藏  举报