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

窗口布局

在改变窗口大小时,或者触发控件事件时,有时会需要去改变界面布局。
改变控件位置可以使用 **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值参数指定是否立即重绘
	}

移动窗口

响应父窗口大小改变事件

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

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

然后接收MSG_WM_SIZE消息
MSG_WM_SIZE
拖动窗口时会调用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);
	}

OnSize

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值