从零开始的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值参数指定是否立即重绘
}
响应父窗口大小改变事件
通常来收移动控件位置大小主要用于在父窗口大小发生改变时合理布局
首先对一个窗口添加风格WS_SIZEBOX 这样就就可以拖动大小了
Window.Create(NULL, rc, "HELLO WORLD",WS_VISIBLE | WS_SYSMENU | WS_SIZEBOX,NULL,0U,NULL );
然后接收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);
}
下一篇: Class 类文件学习(三)