duilib绝对定位与相对定位

前言

duilib中窗口,布局,控件等在屏幕上的显示位置都是按照配置好的xml文件规则显示的,每个显示元素的位置大小也需要显式指定,才能呈现出更好看的界面效果,显示元素的位置有两种配置规则,即绝对位置(Duilib中float属性为true时)与相对位置(float属性为false时)。

1、绝对位置(float=true)

首先看一张惨不忍睹的自绘图:
在这里插入图片描述
图中简单描述的是一个屏幕,屏幕里面包含了一个窗口,窗口里面包含了一个显示控件(这个控件可以理解为duilib的各种布局与控件组合),在一般的界面系统屏幕上显示一般是这种模式。

2、窗口

位置:pos(A,B,C,D)

在win32中,界面显示中一般以pos(A,B,C,D)这种方式定位一个窗口的大小,其中A,B表示的是窗口左上角的坐标,C,D表示的是窗口的width和height,参考坐标系为以屏幕左上角为原点,原点右边直线方向为X轴正向,原点下方直线方向为Y轴正向,即矩形左上角坐标(A,B),矩形的大小width=长,height=D。

在duilib的xml文件中对于窗口的配置并没有显式指定pos(A,B,C,D)这样的方式来定位窗体的大小,而是直接size属性(宽,高),即可,这其实是有原因的。duilib的窗口左上角坐标与窗口大小需要在不同的地方设置,即窗口的widthheight直接在xml文件中配置,就是size(宽,高)。窗口的左上角坐标需要在入口函数Create函数中指定,如下代码:

#include "stdafx.h"
#include "MainFrame.h"
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow)
{
    
    
	CPaintManagerUI::SetInstance(hInstance);
 
 
	CWndShadow::Initialize(hInstance);
	CMainFrame* pFrame = new CMainFrame();
	if (pFrame == NULL)
		return 0;
	DWORD dwStyle = UI_WNDSTYLE_FRAME;
	dwStyle = dwStyle^WS_MAXIMIZEBOX;
	pFrame->Create(NULL, _T("mywindows"), dwStyle, WS_EX_STATICEDGE | WS_EX_APPWINDOW, 1, 1, 0, 0);
 //倒数第3第4个参数可以设置duilib左上角的坐标,倒数第1第2个参数因为继承了WindowImpBase,
//WindowImpBase类中在创建窗口大小时会取xml文件中的窗口大小数据,顾此处两个参数值无效。
	                                                                                      
	pFrame->CenterWindow();
	::ShowWindow(*pFrame, SW_SHOW);
 
	CPaintManagerUI::MessageLoop();
 
	::CoUninitialize();
	return 0;
}

3、布局及控件

布局与控件就是duilib窗口中的子显示元素,坐标位置与窗口设置一样,都是以屏幕左上角为参考原点,右与下为正方向。

4、相对位置(float=false)

5、窗口

窗口就没有相对位置只能是绝对位置,因为窗口是一个程序的总体框架。

6、布局与控件

布局的最外层与直接处于窗体内的控件(不包含在布局之中或嵌套在其他控件)。这种结构布局与控件的相对位置是以窗体左上角坐标为参考点

7、嵌套在布局与控件之中的布局与控件

这种结构,相对位置的参考点为以整个嵌套部分的左上角为参考点,即以本身的上一层为参考

猜你喜欢

转载自blog.csdn.net/qq_44918090/article/details/131773874
今日推荐