请问:如何让我窗口中的控件随着我窗口的放大缩小的变化而变化啊
我建的窗口中有六个控件,以六分格的形式摆放!
大家能给个例子么?
我用OnSize事件重绘了控件,但是好像只对六个控件有效,而且大小还不是我预期的那样,应该是我弄错了哪里……
我建的窗口中有六个控件,以六分格的形式摆放!
大家能给个例子么?
我用OnSize事件重绘了控件,但是好像只对六个控件有效,而且大小还不是我预期的那样,应该是我弄错了哪里……
调试欢乐多
http://blog.csdn.net/Small_hunter/archive/2010/06/01/5640101.aspx
把MoveWindow最后一个参数写成TRUE
示例程序下载:
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.topvoid 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);
}
}
http://blog.csdn.net/xianglitian/archive/2010/06/12/5667015.aspx
{ ASSERT(::IsWindow(m_hWnd)); ::GetWindowRect(m_hWnd, lpRect); }afxwin2.inl中的116行……是我哪里设置错了?
使用Windows Media Player SDK