第四章 duilib库布局

       Duilib库包含6个布局以及含有布局的控件类,如下图所示:


各个布局之间可以互相嵌套,从而构造出更复杂的布局。

下面详细讲解6大布局

Container布局

     Container布局是其它布局或含有布局特性控件的基类,在实际项目中很少使用,一般只是用它来构造更高级布局。Container布局中的控件会叠加在一起,填充整个布局。

      现举一个例子说明Container布局用法:

下载地址:https://download.csdn.net/download/junqiand/10431087

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Window size="800,520" sizebox="4,4,4,4" caption="0,0,0,32" mininfo="600,400">
	<HorizontalLayout bkcolor="#FF070700">
		<Container />
		<VerticalLayout width="336">
			<HorizontalLayout />
			<Container height="230">
				<Control float="true" pos="0,0,0,0" width="336" height="230" bkimage="skin\bk_logo_light.png" />
				<Control float="true" pos="0,33,0,0" width="336" height="164" bkimage="skin\bk_logo_image.png" />
				<Control float="true" pos="84,80,0,0" width="168" height="20" bkimage="skin\bk_logo_text.png" />
			</Container>
			<HorizontalLayout />
		</VerticalLayout>
		<Container />
	</HorizontalLayout>
</Window>

#include <Windows.h>
#include <UIlib.h>

using namespace DuiLib;

class LoginWnd : public WindowImplBase
{
protected:
	virtual CDuiString GetSkinFolder() override
	{
		return _T("");
	}

	virtual CDuiString GetSkinFile() override
	{
		return _T("cover.xml");
	}

	virtual LPCTSTR GetWindowClassName(void) const override
	{
		return _T("LoginWnd");
	}
};

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	CPaintManagerUI::SetInstance(hInstance);

	LoginWnd loginWnd;
	loginWnd.Create(NULL, _T("LoginWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
	loginWnd.CenterWindow();
	loginWnd.ShowModal();

	return 0;
}

运行结果图:

说明:

1. Window窗口属性请参见下图,更详细的请查看duilib安装文件夹下的《属性列表.xml》

2.  为了实现横向居中对齐,最外层<HorizontalLayout bkcolor="#FF070700">中加了3个控件,其中的Container控件是占位控件,类似于QT中的spacer控件。


3.  为了实现纵向居中对齐,<VerticalLayout width="336">中加了3个控件,其中的Container控件是占位控件


4.  为了将3张图叠加在一起,用了Container布局。其中,bk_logo_light.png水平和纵向都拉升了。Bk_logo_image保持原状,纵向位置居中。Bk_logo_text保持原状,左上角坐标位置调整。

HorizontalLayout布局

水平布局中的控件会从左到右水平占位,如下图所示:

示例代码如下:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Window size="400,200" sizebox="4,4,4,4" caption="0,0,0,32" mininfo="300,100">
	<HorizontalLayout bkcolor="#FF070707" width="400" height="200" >
		<Label width="100" height="150" bkcolor="#FFFF0000" />
		<Label width="50" height="200" bkcolor="#FF00FF00" />
		<Label width="80" height="100" bkcolor="#FF0000FF" />
	</HorizontalLayout>
</Window>

#include <Windows.h>
#include <UIlib.h>

using namespace DuiLib;

class LoginWnd : public WindowImplBase
{
protected:
	virtual CDuiString GetSkinFolder() override
	{return _T("");}

	virtual CDuiString GetSkinFile() override
	{return _T("horizontalLayout.xml");}

	virtual LPCTSTR GetWindowClassName(void) const override
	{return _T("horizontalLayout");}
};

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	CPaintManagerUI::SetInstance(hInstance);
	LoginWnd loginWnd;
	loginWnd.Create(NULL, _T("horizontalLayout"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
	loginWnd.CenterWindow();
	loginWnd.ShowModal();

	return 0;
}

VerticalLayout布局

垂直布局中的控件会从上到下垂直占位,如下图所示:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Window size="150,250" sizebox="4,4,4,4" caption="0,0,0,32" mininfo="100,250">
	<VerticalLayout bkcolor="#FF070707" width="150" height="250" >
		<Label width="100" height="50" bkcolor="#FFFF0000" />
		<Label width="50" height="100" bkcolor="#FF00FF00" />
		<Label width="80" height="30" bkcolor="#FF0000FF" />
	</VerticalLayout>
</Window>

#include <Windows.h>
#include <UIlib.h>

using namespace DuiLib;

class LoginWnd : public WindowImplBase
{
protected:
	virtual CDuiString GetSkinFolder() override
	{return _T("");}

	virtual CDuiString GetSkinFile() override
	{return _T("verticalLayout.xml");}

	virtual LPCTSTR GetWindowClassName(void) const override
	{return _T("verticalLayout");}
};

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	CPaintManagerUI::SetInstance(hInstance);
	LoginWnd loginWnd;
	loginWnd.Create(NULL, _T("verticalLayout"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
	loginWnd.CenterWindow();
	loginWnd.ShowModal();

	return 0;
}

水平垂直混合布局例子

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Window size="400,400" sizebox="4,4,4,4" caption="0,0,0,32" mininfo="300,300">
	<VerticalLayout bkcolor="#FF070707" width="400" height="400" >
		<HorizontalLayout width="400" height="100" bkcolor="#FFFF0000">
			<Button width="100" height="80" bordercolor="#FF000000" bkcolor="#FFFFFF00" bordersize="1" />
			<Button width="50" height="50" bordercolor="#FF000000" bkcolor="#FFFFFF00" bordersize="1"  />
			<Button width="30" height="60" bordercolor="#FF000000" bkcolor="#FFFFFF00" bordersize="1"  />
		</HorizontalLayout>
		<VerticalLayout width="350" height="150" bkcolor="#FF00FF00">
			<Button width="100" height="20" bordercolor="#FF000000" bkcolor="#FFFFFF00" bordersize="1"  />
			<Button width="60" height="50" bordercolor="#FF000000" bkcolor="#FFFFFF00" bordersize="1"  />
			<Button width="20" height="30" bordercolor="#FF000000" bkcolor="#FFFFFF00" bordersize="1"  />
		</VerticalLayout>
		<HorizontalLayout width="300" height="100" bkcolor="#FF0000FF">
			<Button width="50" height="80" bordercolor="#FF000000" bkcolor="#FFFFFF00" bordersize="1"  />
			<Button width="50" height="50" bordercolor="#FF000000" bkcolor="#FFFFFF00" bordersize="1"  />
			<Button width="80" height="30" bordercolor="#FF000000" bkcolor="#FFFFFF00" bordersize="1"  />
		</HorizontalLayout>
	</VerticalLayout>
</Window>

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: duilib是一款基于C++开发的UI界面,支持Windows操作系统。它提供了丰富的控件和样式,可以用于快速开发各种图形界面应用程序。 下面是一个简单的duilib的演示示例: #include "stdafx.h" #include "DuiLib/UIlib.h" using namespace DuiLib; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); CWndHostDemoWnd wnd; if(!wnd.Create(NULL, _T("DuiLib Demo"), UI_WNDSTYLE_DIALOG, 0L, 0, 0, 800, 600)) { return 0; } wnd.CenterWindow(); wnd.ShowWindow(true); CPaintManagerUI::MessageLoop(); return 0; } 以上代码是一个简单的程序入口函数,包含了duilib的初始化和创建一个对话框窗口的过程。其中CPaintManagerUI::SetInstance(hInstance);用于设置实例句柄,CWndHostDemoWnd是对话框窗口的自定义类;wnd.Create()用于创建窗口,参数依次为父窗口句柄、窗口名称、窗口样式、额外扩展样式、窗口的位置和大小;wnd.CenterWindow()用于将窗口居中显示;wnd.ShowWindow(true)将窗口显示出来;CPaintManagerUI::MessageLoop()是进入duilib的消息循环。 duilib的优点是使用方便,界面美观,扩展性强。它提供了丰富的控件和样式,能够满足不同应用场景的需求。通过duilib,开发人员可以快速构建出直观、交互友好的图形界面应用程序。有很多开发者使用duilib来开发各种类型的应用,例如电商平台、音乐播放器、管理系统等。使用duilib可以极大地提高开发效率,减少代码量,提升用户体验。 ### 回答2: Duilib是一个开源的C++ GUI,其主要用途是用于Windows平台下的桌面应用程序开发。下面是一个简单的Duilib的demo。 首先,需要包含头文件: ``` #include <duilib/UIlib.h> ``` 创建一个窗口类,继承自`WindowImplBase`: ``` class MyWindow : public WindowImplBase { public: virtual LPCTSTR GetWindowClassName() const { return _T("MyWindowClass"); } virtual CDuiString GetSkinFile() { return _T("mywindow.xml"); } virtual CDuiString GetSkinFolder() { return _T(""); } virtual void OnFinalMessage(HWND hWnd) { delete this; } virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { return __super::HandleMessage(uMsg, wParam, lParam); } virtual void InitWindow() { } virtual void Notify(TNotifyUI& msg) { } }; ``` 在应用程序的入口函数中创建窗口: ``` int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // 初始化Duilib CPaintManagerUI::SetInstance(hInstance); // 创建窗口 MyWindow* pWnd = new MyWindow(); if (pWnd == NULL) { return 0; } pWnd->Create(NULL, _T("MyWindowTitle"), UI_WNDSTYLE_FRAME, WS_EX_STATICEDGE); pWnd->CenterWindow(); pWnd->ShowWindow(); CPaintManagerUI::MessageLoop(); return 0; } ``` 在项目目录下创建一个名为`mywindow.xml`的XML文件,定义窗口的布局: ``` <?xml version="1.0" encoding="UTF-8"?> <Window> <Text pos="100, 100, 200, 200" text="Hello, World!" /> </Window> ``` 以上是一个使用Duilib创建一个简单的窗口的demo。通过继承`WindowImplBase`类来自定义窗口的行为,通过创建相应的XML布局文件来设计界面。Duilib提供了丰富的UI控件和事件处理机制,可以让开发者轻松实现复杂的Windows应用程序。 ### 回答3: duilib是一款基于C++开发的跨平台UI,它能够帮助开发者快速地构建漂亮、流畅、易于维护的图形用户界面。下面是一个简单的duilib的示例demo。 ```cpp #include "stdafx.h" #include "UIlib.h" using namespace DuiLib; class CMyWindow : public CWindowWnd, public INotifyUI { public: CMyWindow() {} virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); } virtual void Notify(TNotifyUI& msg) { if (msg.sType == _T("click")) { if (msg.pSender->GetName() == _T("btnClick")) { wstring text = msg.pSender->GetText(); MessageBox(NULL, text.c_str(), _T("提示"), MB_OK); } } } virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT lRes = 0; if (uMsg == WM_CREATE) { m_pm.Init(m_hWnd); CDialogBuilder builder; CContainerUI* pContainer = static_cast<CContainerUI*>(builder.Create(_T("duilib.xml"), NULL, NULL, &m_pm)); if(pContainer) { m_pm.AttachDialog(pContainer); m_pm.AddNotifier(this); } } else if (uMsg == WM_CLOSE) { ::PostQuitMessage(0); return lRes; } else if (uMsg == WM_DESTROY) { ::PostQuitMessage(0); return lRes; } if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes)) return lRes; return CWindowWnd::HandleMessage(uMsg, wParam, lParam); } protected: CPaintManagerUI m_pm; }; int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); CMyWindow myWindow; if (!myWindow.Create(NULL, _T("duilib demo"), UI_WNDSTYLE_DIALOG, 0L, 0, 0, 800, 600)) { return 0; } myWindow.CenterWindow(); myWindow.ShowWindow(true); CMessageLoop msgLoop; return msgLoop.Run(); } ``` 以上是一个简单的使用duilib的示例demo。它创建了一个窗口,加载了duilib.xml布局文件,并添加了一个按钮点击事件的响应处理函数。当点击按钮时,会弹出一个消息框显示按钮的文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值