欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从零开始的WTL入门教程(5) WTL的窗口控件布局

程序员文章站 2022-05-29 09:29:33
...

窗口布局

在改变窗口大小时,或者触发控件事件时,有时会需要去改变界面布局。
改变控件位置可以使用 **MoveWindow()**方法
方便使用 先将控件储存为类成员变量
在滚动条滚动中改变按钮的位置

	void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar) {
		int curPos = pScrollBar.GetScrollPos();
		int destPos = curPos;
		switch (nSBCode)
		{
		case  SB_LINEUP:
			destPos -= 1;
			break;
		case  SB_LINEDOWN:
			destPos += 1;
			break;
		case SB_THUMBTRACK:
			destPos = nPos;
			break;
		case SB_THUMBPOSITION:
			destPos = nPos;
			break;
		}

		if (destPos < 0){destPos = 0;}
		if (destPos > 100){destPos = 100;}

		pScrollBar.SetScrollPos(destPos);
		CRect btnRect;
		btn.GetWindowRect(&btnRect);
		int W = btnRect.Width();
		int H = btnRect.Height();
		btnRect.top = destPos;
		btnRect.bottom = destPos + H;
		btnRect.left = 50;
		btnRect.right = 50 + W;
		btn.MoveWindow(btnRect, TRUE);//第二个BOOL值参数指定是否立即重绘
	}

从零开始的WTL入门教程(5) WTL的窗口控件布局

响应父窗口大小改变事件

通常来收移动控件位置大小主要用于在父窗口大小发生改变时合理布局
首先对一个窗口添加风格WS_SIZEBOX 这样就就可以拖动大小了

	Window.Create(NULL, rc, "HELLO WORLD",WS_VISIBLE | WS_SYSMENU | WS_SIZEBOX,NULL,0U,NULL );

然后接收MSG_WM_SIZE消息
从零开始的WTL入门教程(5) WTL的窗口控件布局
拖动窗口时会调用OnSize方法,对应大小会通过size参数传入。

需要补充点窗口与坐标系的内容

获取窗口位置通常有两个方法
窗口有两个坐标区域,一个是窗口自身的大小。还有一个是窗口的用户区,也就是去除边框之外的用户可操作的部分区域。
GetWindowRect() 获取的是窗口相对于父窗口的位置 也就是整个窗口的大小位置
GetClientRect() 获取的是窗口自身用户区的位置,永远都是0.0为起点 其实也就是自身用户区的大小。
ScreenToClient() 方法可以将获取到的坐标系转换到对应屏幕上的绝对位置
对于子控件来说通常通过GetClientRect获取父控件的区域去布局, 通过GetWindowRect获取其他处于同一个父控件之下的子控件的位置。此时获取到的位置都是相对于父控件的用户区的相对坐标。
而如果要将父子控件都转换到对应的相同坐标系
则需要先让需要转换坐标系的控件自身调用GetWindowRect然后统一通过父控件调用ScreenToClient去转换坐标系 此时获取到的就是控件相对于屏幕的绝对位置。
关于这一点的应用,会在结束基础内容后补充的综合布局实践中使用到。当然自己创建几个控件试一试理解起来会更加清晰。

接下来在OnSize中让scroller贴紧左边

	void OnSize(UINT nType, CSize size) {
		CRect clientRect;
		GetClientRect(&clientRect);
		CRect scrRect;
		scrRect.top = clientRect.top;
		scrRect.left = clientRect.left;
		scrRect.right = scrRect.left + 20;
		scrRect.bottom = clientRect.bottom;
		scroller.MoveWindow(scrRect);
	}

从零开始的WTL入门教程(5) WTL的窗口控件布局

相关标签: WTL/C++