文章目录
- 前言
- 1、绝对位置(float=true)
- 2、窗口
- 3、布局及控件
- 4、相对位置(float=false)
- 5、窗口
- 6、布局与控件
- 7、嵌套在布局与控件之中的布局与控件
前言
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的窗口左上角坐标与窗口大小需要在不同的地方设置,即窗口的width和height直接在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、嵌套在布局与控件之中的布局与控件
这种结构,相对位置的参考点为以整个嵌套部分的左上角为参考点,即以本身的上一层为参考