SetWindowPos时候只是改变两个控件相对于对话框的位置,但是两个控件的相对位置不发生变化,请问如何实现

解决方案 »

  1.   

    你的意思是对话框的大小改变的情况下把,如果是这样,则在OnSize()里重新计算控件的位置,然后MoveWindow()
      

  2.   

    两个控件要相互作用, 首先是必须把两个控件都有对方的句柄, 然后任何一个控件接收到移动的消息, 也通知另一个句柄进行相应的移动, 但要注意消息的死循环, 像A在Onsize消息通知了B, B移动后也会有OnSize消息又通知了A, 换句话是指: A和B也好, 只要上一次的OnSize还不退出, 就不应该接收下一个OnSize消息, 而应该直接返回, 这样就可以打破消息的死循环了.
      

  3.   

    init:
    GetClientRect(&m_rcOldDlg);
    CRect rcBtn1,rcBtn2;
    m_Bt1.GetClientRect(&rcBtn1);
    m_Bt1.MapWindowPoints(this,rcBtn1);
    m_Bt2.GetClientRect(&rcBtn2);
    m_Bt2.MapWindowPoints(this,rcBtn2);
    m_SpaceWid=rcBtn2.left-rcBtn1.left;void CAboutDlg::OnSize(UINT nType, int cx, int cy) 
    {
    CDialog::OnSize(nType, cx, cy);

    // TODO: Add your message handler code here
    if(m_Bt1.m_hWnd && m_Bt2.m_hWnd)
    {
    CRect rect;
    // moving is easier
    m_Bt1.GetWindowRect(&rect); //屏幕坐标
    ScreenToClient(&rect); //转成相对坐标
    int incX=cx - m_rcOldDlg.Width();
    int incY=cy - m_rcOldDlg.Height();
    // afxDump << incX << ";" << incY << "\n";
    rect.left   +=incX;
    rect.right  +=incX;
    rect.top    +=incY;
    rect.bottom +=incY;
    // move Button 1
    m_Bt1.MoveWindow(rect,TRUE);
    // offset bt2
    rect.left   +=m_SpaceWid;//
    rect.right  +=m_SpaceWid;
    m_Bt2.MoveWindow(rect,TRUE);
    //Get old again !
    GetClientRect(&m_rcOldDlg);
    }
    }
      

  4.   

    n年前我写过一个自动布局的类。
    http://download.csdn.net/detail/sdhexu/593170该类可以实现对话框上面元素的自动布局,可以定义是否自动缩放,也可以定义相对位置。很好用。
      

  5.   

    codeproject上有一个不错的类 你可以找找 好像叫ResizableDialog
      

  6.   

    有用啊,就是不太清楚cx,cy什么意思啊?