请问:如何让我窗口中的控件随着我窗口的放大缩小的变化而变化啊
我建的窗口中有六个控件,以六分格的形式摆放!
大家能给个例子么?
我用OnSize事件重绘了控件,但是好像只对六个控件有效,而且大小还不是我预期的那样,应该是我弄错了哪里……

解决方案 »

  1.   

    就是得在OnSize里面设置,可以增加记录父窗口的上一次size的变量,然后每次根据变量变化率来改变控件size。
      

  2.   

    http://www.codeproject.com/KB/dialog/easysize.aspx
      

  3.   

    处理主窗口OnSize,在里面对各个需改变大小的控件MoveWindow
      

  4.   

    控件随着窗口大小变化
    http://blog.csdn.net/Small_hunter/archive/2010/06/01/5640101.aspx
      

  5.   

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

  6.   


    把MoveWindow最后一个参数写成TRUE
      

  7.   


    示例程序下载:
    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);
    }
    }
      

  8.   

    看看这个吧
    http://blog.csdn.net/xianglitian/archive/2010/06/12/5667015.aspx
      

  9.   

    我用EasySize去设置了,但是在生成的时候产生了断点:_AFXWIN_INLINE void CWnd::GetWindowRect(LPRECT lpRect) const
    { ASSERT(::IsWindow(m_hWnd)); ::GetWindowRect(m_hWnd, lpRect); }afxwin2.inl中的116行……是我哪里设置错了?
      

  10.   

    0xC0000005: 读取位置 0x00000020 时发生访问冲突
      

  11.   

    求大侠帮忙啊,谁用过这个方面的东西啊:其实我感觉是我的windows media player 的控件获取不到句柄,那个handle是空的,所以引发了这个问题EASYSIZE(IDC_OCX2,ES_BORDER,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,0)在这个代码运行的时候产生的问题……那如果是这个问题的话,我怎么才能获得Media的句柄呢?
      

  12.   

    参考一下:
    使用Windows Media Player SDK