VC 怎么动态改变控件大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC 怎么动态改变控件大小相关的知识,希望对你有一定的参考价值。

初级入门MFC
在写一个浏览器
鼠标拖动窗体把窗体的大小改变了,我想把里面的控件的大小也跟着改变。
就是说IE控件的大小要动态 = 窗体的大小

这个怎么做?我想过用MoveWindow ,但我不知道该窗体的大小,不会写。。
请各位大虾帮个忙,能答得详细得,最好直接复制就能用~!谢谢哈

  首先创建一个基于对话框的MFC工程,为了让对话框可以通过拖拽边框自由改变大小,需要设置对话框的属性。
  打开资源视图,在对话框上点右键,选择Properties->Styles->Border,在下拉框中选择Resizing,这样就可以动态改变对话框的大小了。
  有两个函数可以实现这个功能:
(1) MoveWindow():
void MoveWindow(int x,int y,int nWidth,int nHeight);
x, y为控件位置;nWidth、nHeight为控件宽度和高度
(2) SetWindowPos():
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
第一个参数一般设为NULL;
x、y为控件位置;cx、cy为控件宽度和高度;
nFlags常用取值:
SWP_NOZORDER:忽略第一个参数;
SWP_NOMOVE:忽略x、y,维持位置不变;
SWP_NOSIZE:忽略cx、cy,维持大小不变;
SWP_SHOWWINDOW:显示窗口
  下面分别介绍如何使用这两个函数:
首先同时按下Ctrl+W,弹出类向导对话框,选择响应WM_SIZE消息。在消息响应函数OnSize()中添加如下代码:
void COnSizeTestDlg::OnSize(UINT nType, int cx, int cy)

CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
//创建对话框时,控件还没有创建,因此不能改变其大小(必须加上这两行代码)
if(!IsWindowVisible())
return;

//获取客户区矩形
CRect rect;
GetClientRect(&rect);
//动态改变控件大小
CWnd *pButton = GetDlgItem(IDC_BUTTON1);
pButton->MoveWindow(
rect.right/5, //x轴1/5处
rect.bottom/5, //y轴1/5处
rect.right/5*2, //x轴的2/5宽度
rect.bottom/5*2 //y轴的2/5高度
);

  把MoveWindow()函数换成SetWindowPos():
pButton->SetWindowPos(
NULL,
rect.right/5,
rect.bottom/5,
rect.right/5*2,
rect.bottom/5*2,
SWP_NOZORDER|SWP_SHOWWINDOW
);
效果一样。
参考技术A 用MoveWindow函数。SDK的话,得到控件句柄之后,用它调用MoveWindow函数。如果是MFC的话,可用CWnd类的MoveWindow的方法。 参考技术B 响应WM_SIZE啊
不过通常处理都不是真正的等比例缩放 而是一个方向上 某写控件如Edit宽度在变化
参考技术C 处理WM_SIZW消息,消息函数是OnSize。

在OnSize里计算控件的Rect,然后MoveWindow。

如:

void CDlg::OnSize(int ntype, int cx, int cy)

CDialog::OnSize(..); // 调用基类的

CRect rc;
... // 计算rc

GetDlgItem(IDC_...)->MoveWindow(&rc); // 移动控件
本回答被提问者采纳

.net中如何动态改变Label控件的位置

我在Winform中有一个Label控件 我想要它随着窗体的Resize而动态调整在窗体中的位置 本来我打算在Form的Resize事件中 将Label.Location.X和Label.Location.Y的值 设成宽度和高度的一半 来使它居中 但是编译时报错说Location不能赋值 不是变量 那请问 我应该怎么做来达到我想要的要求呢

调整窗口大小,让控件的位置动态调整,不是靠Resize事件中手动设置控件的位置,
你以前是学vb的吗?vb调整窗口大小,需要手动在Resize事件中手动设置控件的位置,.net有更智能的操作,

选中控件,右键属性,找到【Anchor】属性,这个属性就是设置控件随窗体大小动态调整位置的属性,点开右边的下拉框,可以看到一个方块四周有四个块,默认选中的是上面和左边的块,这表明:调整窗体时,上边距和左边距始终保持不变。同样,可以设置左,右,上,下的块,使控件对应的边距随窗体大小改变而改变,

ps:设置控件的位置,是这样设置的:
Label.Location = new Point(20,20);
参考技术A   vb调整窗口大小,需要手动在Resize事件中手动设置控件的位置,.net有更智能的操作。
  选中控件,右键属性,找到【Anchor】属性,这个属性就是设置控件随窗体大小动态调整位置的属性,点开右边的下拉框,可以看到一个方块四周有四个块,默认选中的是上面和左边的块,这表明:调整窗体时,上边距和左边距始终保持不变。同样,可以设置左,右,上,下的块,使控件对应的边距随窗体大小改变而改变,
  ps:设置控件的位置,是这样设置的:Label.Location = new Point(20,20)。
参考技术B .net 解决不了这个问题,窗口的resize时间是客户端发生的。.net服务端根本无法获得客户端窗口重画的事件。你这个问题的解决只能靠js来解决。

window 对象好像有个onresizeend事件 ,在这里面定位到你的标签 然后用css控制他的位置试试吧

以上是关于VC 怎么动态改变控件大小的主要内容,如果未能解决你的问题,请参考以下文章

在VC++如何使控件大小修改为规定的大小?

WPF如何改变Window的大小呢?我想通过一个控件来动态改变window的大小

VC如何如何处理WM_SIZE使屏幕中的控件随窗口的改变而调整大小

在winform画了一个自定义控件,现在我要在运行后进行拉伸动态改变大小,但快速拉伸就闪烁,怎么消除

C# 在winform画了一个自定义控件,现在我要在运行后进行拉伸动态改变大小,但快速拉伸就闪烁,怎么消除

VC中改变窗口背景颜色和控件背景颜色