用Formview 建立的项目。怎样能得到控件在窗口上的位置?
我想在创建窗口时将控件生成在我指定的位置,怎样做 ??

解决方案 »

  1.   

    CRect  rc; 
    m_b1.GetClientRect(&rc);   //取得按钮的矩形位置
    m_b1.ClientToScreen(&rc);  //将客户区坐标转变为屏幕坐标
    // m_b1是这个控件变量;
      

  2.   

    生成在我指定的位置可以用
    SetWindowPos(..);
    or
    MoveWindow(..);
    or
    有的Create函数中可以指定位置;(因控件而定)
      

  3.   

    得到控件的位置:
    CWnd *pWnd;
    CRect tect;
    pWnd = GetDlgItem(你的控件ID);
    pWnd->GetWindowRect(&rect);
    设置控件的位置:
    MoveWindow()
      

  4.   

    BOOL GetClientRect(
      HWND hWnd,      // handle to window
      LPRECT lpRect   // client coordinates
    );BOOL SetWindowPos(
      HWND hWnd,             // handle to window
      HWND hWndInsertAfter,  // placement-order handle
      int X,                 // horizontal position
      int Y,                 // vertical position
      int cx,                // width
      int cy,                // height
      UINT uFlags            // window-positioning options
    );ok
      

  5.   

    m_Button.之類的MoveWindow(x,y,w,h);
    也可以移動位置.
      

  6.   

    GetWindowRect()
    ScreenToClient()
    MoveWindow()
      

  7.   

    最好捕捉WM_WINDOWPOSCHANGED消息,
    OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) 
    {
       //Set the position of your control according to your client
       //rect,you can get it from lpwndpos.
       //Width:   lpwndpos->cx
       //Height:  lpwndpos->cy
    }
      

  8.   

    如何用代码动态添加控件
    作者:bzshow读者层次: VC初学者在资源编辑器里我们可以方便地在对话框中加入所需控件,比如文本编辑框、列表控件等。但假如我们需要在运行期间动态生成这些控件该怎么做呢?本文就是讲述用代码动态添加控件的方法,并提供示例工程。下载示例工程 12.5K
    http://www.vckbase.com/document/journal/vckbase11/src/DynCreateCtrl.zip程序运行界面如下
     为了方便演示,我们先生成一个基于对话框的MFC工程,起名为My在CMyDlg.h中做下面几个步骤:
    public:
          //加上这个变量
          CEdit m_MyEdit;
    protected: 
          //加上这个函数, 用来响应编辑框改变的事件
          afx_msg void OnChangeEdit();
          
    在CMyDlg.cpp中做下面几个动作:
    //增加这一行,为该编辑框设定ID为1820
    #define ID_MYEDT 1820
    在BEGIN_MESSAGE_MAP(CMyDlg, CDialog)下面加入
    ON_EN_CHANGE(ID_MYEDT, OnChangeEdit)
            
    添加这一句的作用是将编辑控件内容改变的消息映射到OnChangeEdit函数,你要在CMyDlg.cpp中实现OnChangeEdit()函数;
    好了,让我们动态生成控件吧! m_MyEdit.CreateEx(WS_EX_CLIENTEDGE, // 3D-border外观
            _T("EDIT"), 
            NULL,
            ES_AUTOHSCROLL | ES_LEFT | ES_NOHIDESEL | WS_CHILD,
            rect, this,
            ID_MYEDT);//生成edit控件
          
    m_MyEdit.ShowWindow(SW_SHOW); //显示控件
    m_MyEdit.SetFocus(); //设置焦点//动态删除可以用如下语句
    GetDlgItem(ID_MYEDT)->DestroyWindow();//销毁控件 在代码中我们只演示了编辑控件的动态生成方法,其它控件动态生成的方法基本一致,都可以参考这一过程。
     
     
      

  9.   

    这是创建一个工具栏,然后移动所有控件,不过我RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,
    0,reposQuery,rcClientNew);这一句不动有人知道吗?
    if(!m_wndToolBar.Create(this, WS_VISIBLE|CBRS_ALIGN_TOP|CBRS_GRIPPER)|| !m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
    {
    TRACE0("failed to create dialog toolbar!\n");
    EndDialog(0);
    }
    m_wndToolBar.ModifyStyle(0,TBSTYLE_FLAT); 
    CRect rcClientOld;
    CRect rcClientNew;
    GetClientRect(&rcClientOld); RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,
    0,reposQuery,rcClientNew);
    CPoint ptOffset(rcClientNew.left-rcClientOld.left,
    rcClientNew.top-rcClientOld.top); CRect rcChild;
    CWnd* pwndChild = GetWindow(GW_CHILD);  //得到子窗口
    while(pwndChild) // 处理所有子窗口
    {//移动所有子窗口
    pwndChild->GetWindowRect(rcChild);
    ScreenToClient(rcChild); 
    rcChild.OffsetRect(ptOffset); 
    pwndChild->MoveWindow(rcChild,FALSE); 
    pwndChild = pwndChild->GetNextWindow();
    } CRect rcWindow;
    GetWindowRect(rcWindow); // 得到对话框RECT
    rcWindow.right += rcClientOld.Width() - rcClientNew.Width(); // 修改对话框尺寸
    rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height(); 
    MoveWindow(rcWindow,FALSE); // Redraw Window RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);