程序是这样的,比如MFC SDI程序名是Abc,有一个对应CAbcView类的对话框,该对话框上只有两个Edit Box窗口用于显示数据。现在想这样:当程序运行后,拉动程序主界面边框右下角或者拉动边框改变程序边框大小的时候那两个Edit Box也跟着改变,当然是跟着程序主界面的大小成比例的改变。各位高手们有什么办法吗?

解决方案 »

  1.   

    CRect rect;//TODO:在适当的地方设置你的rectGetDlgItem(ID_EDIT)->MoveWindow(rect);
      

  2.   

    注意要在CView的OnSize函数里面改变
      

  3.   

    http://www.codeproject.com/dialog/easysize.asp
      

  4.   

    如果那两个editbox 是 cedit 成员 的化,可以用setwindowpos
      

  5.   

    我在CView的Onsize函数中这样写:
    CRect rect;
    this->GetWindowRect(rect);
    GetDlgItem(IDC_EDIT1)->MoveWindow(rect.left+200,rect.top+100,300,300);
    程序一执行就报内存错,rect.left和rect.top的值没问题,总觉得是GetDlgItem(IDC_EDIT1)这个有问题,有谁知道啊?
      

  6.   

    我觉得有几个可能存在的问题:
    1、GetWindowRect的参数写错了,应该是this->GetWindowRect(&rect);
    另外建议使用RECT结构而不要使用CRect类(如果你不需要对rect进行很复杂的操作的话);2、按照你的写法,(this->GetWindowRect(rect))取到的是整个窗口对于屏幕的坐标值,而下一句(GetDlgItem(IDC_EDIT1)->MoveWindow(rect.left+200,rect.top+100,300,300);)中的MoveWindow移动的控件位置是以应用程序客户区左上角为(0,0)的偏移值,应该在Move之前用函数ScreenToClient(&rect)把坐标转换一下;
      

  7.   

    zry000:你说的要写成 this->GetWindowRect(&rect);是对于RECT结构,如果用CRect类就直接写rect就行。第二个问题,我即使直接写成 GetDlgItem(IDC_EDIT1)->MoveWindow(200,100,300,300); 也还是不行
      

  8.   

    呵呵,刚才没注意,不过也获益匪浅。叹息之墙老兄,你好像忽略了控件构造顺序,OnSize在视图第一次显示就要调用一次,而这时调用的时候,EDIT控件尚未构造(诞生?!),所以MoveWindow没有对象可以移动,我猜想,错误警报应该是由一个ASSERT引发的,应该是在判断对象是否存在的时候。
      

  9.   

    建议你把这几句写到WM_SHOWWINDOW的响应函数里再试试看
      

  10.   

    zry000,你说得对极了,我这样写OnSize函数:
    void CAbcView::OnSize(UINT nType, int cx, int cy) 
    {
    CFormView::OnSize(nType, cx, cy);

    // TODO: Add your message handler code here m_edit.MoveWindow(50,50,cx-100,cy-100);

    }m_edit就是那个EditBox的CEdit类型的变量;如果执行的话,会连续出现六七个ASSERT引发的错误警报,如果把这些警报都忽略的话程序倒是可以运行,也能达到EditBox随程序边框变化的效果;现在问题就在这里,就像你说的,OnSize在视图第一次显示就要调用一次,而这时调用的时候,EDIT控件尚未构造,所以引发错误。但是我现在就不知道如何改,写到SHOWWINDOW似乎不行,刚才试了,也会出一次错误警报,而且忽略后程序运行起来也达不到效果,因为showwindow不能发出重画的消息;还有没有什么办法啊?
      

  11.   

    折腾了一晚,总算搞定,应该在OnCreate函数里创建出来m_edit;在View的OnCreate函数里加了这么一句:
    m_edit.Create(WS_VSCROLL | ES_LEFT | ES_MULTILINE | WS_VISIBLE | WS_TABSTOP | WS_THICKFRAME,CRect(10,10,80,80),this,IDC_EDIT1);
    现在又有个很奇怪的问题,这样创建出来的EditBox和用资源管理器创建出来的有点区别,在资源管理器上画出来的EditBox如果选中Styles的Border属性后看上去是凹进去的一块,但是在这里如果写上WS_BORDER属性就变成了一个黑色的边框;现在用的这个WS_THICKFRAME倒是也能加个边框,但是看上去是凸出来的一块,我试了各种能用的跟边框有关的属性都不行,谁知道这个怎么解决?
      

  12.   

    动态改变子控件的布局通常是在映射父窗口的WM_SIZE消息,在OnSize函数里面逐个按比例对控件进行SetWindowRect或者SetWindowPos
      

  13.   

    这个3DLOOK是个What东东啊?没有听说过
      

  14.   

    http://www.codeproject.com有关于Resize的话题。有些是封住好的类。你可以直接用。这样很方便的。也可以去看看我收集的:关于Resize的话题http://www.xiaozhou.net/cooldog/blogview.asp?logID=108