1。
       GetWindowRect(&rect);
       SreenToClient(&rect);
       与
       GetClientRect(&rect);
的效果一样吗?
2。
   在一个基于对话框的程序中,怎么样才能使主对话框的大小可以通过鼠标拖动而改变?同时对话框中的控件相对位置不变??  

解决方案 »

  1.   

    1。
           GetWindowRect(&rect);
           SreenToClient(&rect);
           与
           GetClientRect(&rect);
    的效果一样吗?不一样。系统坐标(在800x600下)的(0,0)是指屏幕的左上点。逻辑坐标则是以应用程序的左上点为起点的(0,0);GetWindowRect函数得到的是系统坐标,如果你要对你的控件进行修改,则需要将系统坐标转换为逻辑坐标;要显示时又需要将逻辑坐标转换为系统坐标。
      

  2.   

    2。
       在一个基于对话框的程序中,怎么样才能使主对话框的大小可以通过鼠标拖动而改变?同时对话框中的控件相对位置不变??  在DLG中的属性直接设置,变成不是POPUP的风格。
    如果同时对话框中的控件相对位置不变,则要在OnSize()中
    {
       CYourCtrl.SetWindowPos(..............);
    }
      

  3.   

    to  guoxiny(狼) ( ) 信誉:100 :
    BOOL CTemp1Dlg::OnInitDialog()
    {
       CRect myRect;
       GetClientRect(&myRect);//引用“应用程序的左上点为起点的(0,0);“
    //显示时差不多在屏幕中央
      (1) MoveWindow(myRect.left, myRect.top,myRect.Width(), myRect.Height());
    //显示时居于屏幕左上角稍微偏向右下
       (2)MoveWindow(myRect.left+5, myRect.top+5,myRect.Width(), myRect.Height());
    //显示时居于屏幕左上角稍微偏向左上
        (3)MoveWindow(myRect.left-5, myRect.top-5,myRect.Width(), myRect.Height());
    }
    这是怎么回事?按照后两种的情况,应该推断出第一种情况是以屏幕左上角为原点!!!??
      

  4.   

    对于MoveWindow函数For a top-level CWnd object, the x and y parameters are relative to the upper-left corner of the screen. For a child CWnd object, they are relative to the upper-left corner of the parent window’s client area.先要理解这一句话的意思。
      

  5.   

    你在BOOL CTemp1Dlg::OnInitDialog()中使用MoveWindow函数,那么你的CTemp1Dlg就是a top-level CWnd object。这样的话MoveWindow函数中的x,y坐标就是屏幕的坐标。
      

  6.   

    to  KcSoft(蓝珍珠精灵) ( ) 信誉:95 
    谢谢,现在可以用鼠标拖动改变大小了,但是对话框中的控件相对位置不变还是没有解决!
    照您所说:
    void CTemp2Dlg::OnSize(UINT nType, int cx, int cy) 
    {
    CDialog::OnSize(nType, cx, cy);
    CRect rect;
    GetClientRect(&rect);
    m_btn.SetWindowPos(NULL,rect.Width()/4,rect.Height()/4,
    rect.Width()/2,rect.Height()/2,SWP_SHOWWINDOW);
    }   //m_btn是CButton的相关控件
    运行的时候总出现debug assersion failed!对话框,单步执行问题处在setwindowpos这一句!???
      

  7.   

    to  guoxiny(狼) ( ) 信誉:100 :
    首先谢谢您!还有点问题。您所说:
    "你在BOOL CTemp1Dlg::OnInitDialog()中使用MoveWindow函数,那么你的CTemp1Dlg就是a top-level CWnd object。这样的话MoveWindow函数中的x,y坐标就是屏幕的坐标。"
    那么:
    //显示时差不多在屏幕中央
      (1) MoveWindow(myRect.left, myRect.top,myRect.Width(), myRect.Height());照您所说,应该显示的时候正好居于屏幕左上角才对阿!不应该差不多在屏幕中央??
      

  8.   

    为什么在基于对话框的OnSize()中
    {
       CYourCtrl.SetWindowPos(..............);
    }
    运行总是出错??debug assersion failed!
      

  9.   

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

    // TODO: Add your message handler code here
    if(GetActiveWindow() == NULL)  //加入此句
    return;
    CRect rect;
    GetClientRect(&rect);
    m_Button1.SetWindowPos(NULL,rect.Width()/4,rect.Height()/4,
    rect.Width()/2,rect.Height()/2,SWP_SHOWWINDOW);