如何让控件随着我窗口的大小而变化啊

pmars 2010-11-18 09:50:17
请问:如何让我窗口中的控件随着我窗口的放大缩小的变化而变化啊
我建的窗口中有六个控件,以六分格的形式摆放!
大家能给个例子么?
我用OnSize事件重绘了控件,但是好像只对六个控件有效,而且大小还不是我预期的那样,应该是我弄错了哪里……
...全文
451 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeah2000 2010-11-18
  • 打赏
  • 举报
回复
easysize
Eleven 2010-11-18
  • 打赏
  • 举报
回复
codeproject 上搜索easysize
jacky_qiu 2010-11-18
  • 打赏
  • 举报
回复

示例程序下载:
http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC%5EM%5EM/%E8%B0%83%E6%95%B4%E6%8E%A7%E4%BB%B6%E4%BD%8D%E7%BD%AE.zip

愿顺利!阿弥陀佛!


/*
注意的地方:
1.对话框创立后,会发送一个WM_SIZE消息,但此时的控件还没有创建。如果你调用依赖于此控件窗口句柄的函数,会出错。比如你调用m_edit.MoveWindow() 而此时m_edit控件又没有产生,程序已启动就显示错误结束,你想查原因都查不到。
所以你应该在OnInitDialog函数里(此时控件已产生)令一个标志为true,在OnSize判断此标志为true时才开始调整控件位置。

2.在OnInitDialog里应该调用多一个SetWindowPos改变窗口的大小,令其触发WM_SIZE消息。

3.改变ItemListStyle的值可以改变分布方式 垂直或水平分布
*/


UINT ItemListStyle=0; //水平或垂直
SIZE ItemSize; //Item的尺寸
RECT ListRect; //整个List的Rect
vector <RECT> item;


/****************************************************************************
计算每个ItemRect的值,利用ListRect.left List.top ItemSize.cx ItemSize.cy
4个参数计算,并最后确定ListRect.right 和 ListRect.bottom
****************************************************************************/
void RecountEachItemRect()
{
if(ItemListStyle==0) //Item垂直分布
{
for(int i=0;i<item.size();i++)
{
item[i].left=ListRect.left;
item[i].top=ListRect.top+i*ItemSize.cy;
item[i].right=ListRect.left+ItemSize.cx;
item[i].bottom=ListRect.top+(i+1)*ItemSize.cy;

}

ListRect.right=ListRect.left+ItemSize.cx;
ListRect.bottom=ListRect.top+ItemSize.cy*item.size();
}
else //Item水平分布
{
for(int i=0;i<item.size();i++)
{
item[i].left=ListRect.left+i*ItemSize.cx;
item[i].top=ListRect.top;
item[i].right=ListRect.left+(i+1)*ItemSize.cx;
item[i].bottom=ListRect.top+ItemSize.cy;

}

ListRect.right=ListRect.left+ItemSize.cx*item.size();
ListRect.bottom=ListRect.top+ItemSize.cy;
}
}


/****************************************************************************
用rect来确定List的大小位置
****************************************************************************/
void SetListRect(RECT& rect)
{
ASSERT(item.size()!=0);

//更新ListRect
ListRect=rect;

//确定每一项的宽和高
if(ItemListStyle==0) //Item垂直分布
{
ItemSize.cx =(rect.right-rect.left);
ItemSize.cy=(rect.bottom-rect.top)/item.size();
}
else //Item水平分布
{
ItemSize.cx=(rect.right-rect.left)/item.size();
ItemSize.cy=(rect.bottom-rect.top);
}

//更新每一项Rect
RecountEachItemRect();
}


BOOL CDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE); // Set big icon
::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); //设置窗口最顶
static CLoadMyLibrary inst(m_hWnd);
//-----------------------------------------------------------------------------


item.resize(6);
::SetWindowPos(m_hWnd,HWND_TOPMOST,10,10,700,400,SWP_NOMOVE);

return TRUE;
}



void CDemoDlg::OnButton1()
{
ItemListStyle=1;
::SetWindowPos(m_hWnd,HWND_TOPMOST,10,10,700,402,SWP_NOMOVE);
::SetWindowPos(m_hWnd,HWND_TOPMOST,10,10,700,400,SWP_NOMOVE);

}


void CDemoDlg::OnButton2()
{
ItemListStyle=0;
::SetWindowPos(m_hWnd,HWND_TOPMOST,10,10,700,402,SWP_NOMOVE);
::SetWindowPos(m_hWnd,HWND_TOPMOST,10,10,700,400,SWP_NOMOVE);

}



//将RECT转为4个值:左上角2个坐标,宽度,高度。在一些函数中会用到,如:SetWindowPos,Create
#define RECT_TO_4VAL(rect) rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top

void CDemoDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);


if (item.size()!=0)
{
RECT rect={10,10,cx-200,cy-10};
SetListRect(rect);

::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON1),RECT_TO_4VAL(item[0]),TRUE);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON2),RECT_TO_4VAL(item[1]),TRUE);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON3),RECT_TO_4VAL(item[2]),TRUE);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON4),RECT_TO_4VAL(item[3]),TRUE);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON5),RECT_TO_4VAL(item[4]),TRUE);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON6),RECT_TO_4VAL(item[5]),TRUE);
}
}



pmars 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 visualwind 的回复:]
引用 9 楼 pmars 的回复:

引用 5 楼 visualwind 的回复:
参考:
VC 控件 随窗口调整大小

谢谢了,不过,这个方法只对我控件的部分有效,不知道是为什么,对我的windows media player 控件不能改变其大小


把MoveWindow最后一个参数写成TRUE
[/Quote]

那个参数默认不就是1么?
刚才改了,还是不行,我觉得是获取不到他的句柄,但是我测不出来,呵呵,不知道怎么让这个窗口不要显示在最前面…………
visualwind 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pmars 的回复:]

引用 5 楼 visualwind 的回复:
参考:
VC 控件 随窗口调整大小

谢谢了,不过,这个方法只对我控件的部分有效,不知道是为什么,对我的windows media player 控件不能改变其大小
[/Quote]

把MoveWindow最后一个参数写成TRUE
pmars 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 visualwind 的回复:]
参考:
VC 控件 随窗口调整大小
[/Quote]
谢谢了,不过,这个方法只对我控件的部分有效,不知道是为什么,对我的windows media player 控件不能改变其大小
沙鹰 2010-11-18
  • 打赏
  • 举报
回复
控件随着窗口大小变化
http://blog.csdn.net/Small_hunter/archive/2010/06/01/5640101.aspx
梧桐126 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luciferstar 的回复:]
对每个控件都要MoveWindow
[/Quote]UP.....
LuciferStar 2010-11-18
  • 打赏
  • 举报
回复
对每个控件都要MoveWindow
visualwind 2010-11-18
  • 打赏
  • 举报
回复
pmars 2010-11-18
  • 打赏
  • 举报
回复
各位能具体说说么?我在用这个弄,但是搞不定啊,能给点代码让我参考一下么?
谢谢了!
coohai 2010-11-18
  • 打赏
  • 举报
回复
处理主窗口OnSize,在里面对各个需改变大小的控件MoveWindow
visualwind 2010-11-18
  • 打赏
  • 举报
回复
就是得在OnSize里面设置,可以增加记录父窗口的上一次size的变量,然后每次根据变量变化率来改变控件size。
visualwind 2010-11-18
  • 打赏
  • 举报
回复
pmars 2010-11-18
  • 打赏
  • 举报
回复
求大侠帮忙啊,谁用过这个方面的东西啊:

其实我感觉是我的windows media player 的控件获取不到句柄,那个handle是空的,所以引发了这个问题

EASYSIZE(IDC_OCX2,ES_BORDER,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,0)

在这个代码运行的时候产生的问题……

那如果是这个问题的话,我怎么才能获得Media的句柄呢?
pmars 2010-11-18
  • 打赏
  • 举报
回复
0xC0000005: 读取位置 0x00000020 时发生访问冲突
pmars 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tigermaydo 的回复:]
http://www.codeproject.com/KB/dialog/easysize.aspx
[/Quote]
我用EasySize去设置了,但是在生成的时候产生了断点:

_AFXWIN_INLINE void CWnd::GetWindowRect(LPRECT lpRect) const
{ ASSERT(::IsWindow(m_hWnd)); ::GetWindowRect(m_hWnd, lpRect); }

afxwin2.inl中的116行……

是我哪里设置错了?
向立天 2010-11-18
  • 打赏
  • 举报
回复

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧