1.用GetDialogItem()
然后再Resize.....
2.不知道唉~
可能应该根据当前点的控件的ID来判断

解决方案 »

  1.   

    pBtn->MoveWindow不行,当我用时控件就不见啦!
      

  2.   

    你的两段程序都不存在问题,只是此写得有点别扭.(很普通的应用)
    m_wndBut.SetWindowPos(                this,cx/80,cy/100,cx/10,cy/50,SWP_NOMOVE+SWP_NOZORDER+SWP_SHOWWINDOW+SWP_N    OACTIVATE)------>
    m_wndBut.SetWindowPos(              NULL,0,0,cx/10,cy/50,SWP_NOMOVE|SWP_NOZORDER|SWP_SHOWWINDOW|SWP_NOACTIVATE)如果你不成功,一定是另外的原因,判断很简单,用调试启动程序(不设断点),正常运行后,在在ONSIZE入口处设一断点,拉动你的对话框的边框,进入断点,可以判断出问题的源.SetWindowPos和TrackPopupMenu没问题.(可能条件不成立,或消息没加入到BEGIN_MESSAGE_MAP--END_MESSAGE_MAP宏中,即它们之间没 ON_WM_SIZE() ON_WM_CONTEXTMENU())
      

  3.   

    关于一,我也不太懂。
    关于二,也许能帮上点忙:
    好多对话框中用到的控件都不会响应WB_CONTEXTMENU消息,所以这个工作得自己作。
    在PreTranslateMessage()函数中进行如下处理:
    if(pMsg->message==WM_RBUTTONUP)
    {
    CPoint point;
    ::GetCursorPos(&point);
    CRect rect;
    m_ContentEdit.GetWindowRect(&rect);  //将m_ContentEdit替换为你自己的控件。
    if(rect.PtInRect(point))
    {
    //ShowCursor(TRUE);
    CMenu menu; 
    // 装入菜单 
    menu.LoadMenu(IDR_TEXT_POPUP); 
    // 显示菜单 
    if(!m_ContentEdit.CanPaste())
    menu.EnableMenuItem(ID_EDIT_PASTE,MF_GRAYED);
    if(!m_ContentEdit.CanUndo())
    menu.EnableMenuItem(ID_EDIT_UNDO,MF_GRAYED);
    menu.GetSubMenu(0)->TrackPopupMenu( 
    TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,  
    point.x, point.y,this);
    }
      

  4.   

    1.  在OnSize()函数中获得改变的尺寸,得到X和Y方向的变化量,根据公式计算出每一个控件要移动的距离,再使用GetDlgItem(IDC_XXX)->MoveWindow()函数就可以了。
    2.  对每一个选项产生一条消息的消息响应函数。
      

  5.   

    1:只要把 this => NULL 就行了!不过有一点要注意:你用了SWP_NOMOVE,那控件的左上角就不会改变了,也就是说SetWindows(...)中的x,y已经不起作用了!!
      另外,用MoveWindow(...)也能实现!
    2:同意happylaodu(青菜豆腐),只要判断当前点是否在控件区域内就能搞定了!
      

  6.   

    谢谢各位高人!第一个问题我已经解决了,代码段如下:
    /**************************/
    void CMyICQDlg::OnSize(UINT nType, int cx, int cy) 
    {
    CDialog::OnSize(nType, cx, cy);
    if(m_wndButMainMn.GetSafeHwnd())
    {   
    if(cx>200)
    m_wndButMainMn.MoveWindow(0,cy-30,70,30);
    else
    m_wndButMainMn.MoveWindow(0,cy-30,cx/3,30);
    } if(m_wndButDsp.GetSafeHwnd())
    {
    if(cx>200)
    m_wndButDsp.MoveWindow(cx/3,cy-30,70,30);
    else
    m_wndButDsp.MoveWindow(cx/2,cy-30,cx/3,30);
    }
    if(m_wndTabCtrl.GetSafeHwnd())

    m_wndTabCtrl.SetWindowPos(this,0,0,cx,cy-40,SWP_NOMOVE+SWP_NOZORDER+SWP_SHOWWINDOW+SWP_NOACTIVATE);
    } if(m_wndTree.GetSafeHwnd())
    {
    m_wndTree.SetWindowPos(this,0,0,cx,cy-80,SWP_NOMOVE+SWP_NOZORDER+SWP_SHOWWINDOW+SWP_NOACTIVATE);
    }}
    /******************************/
    或许各位对第二个问题不大清楚,现在重复一遍:
    在对话框里的控件是:CTree,我已经在树里添加了一些结点,现在:
    我用右键点击叶结点(如"A"),怎么才能弹出关于结点"A"的菜单?
      

  7.   

    第一个问题:不要使用 if (m_wndButMainMn.GetSafeHwnd()),可以用:
    if (::IsWindow(m_wndButMainMn.m_hWnd))
      

  8.   

    上次以为你是初学的,代码是别了那看的,如果你的代码是从类向导中导出的,为z会不能运行?
    最多把你的代码改为如下:
    void CMyICQDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
        // TODO: Add your message handler code here
    /*    HTREEITEM hItem;
        CMenu menuPopu;
        UINT* pFlages=NULL;
        if(menuPopu.CreatePopupMenu())
        {
            menuPopu.AppendMenu(MF_STRING,ID_MENU_A,"Test");
        }
         hItem=m_wndTree.HitTest( point,pFlages );
        if(hItem!=NULL)
        menuPopu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
    */ CRect pt;
       CMenu menuPopu;
        if(menuPopu.CreatePopupMenu())
        {
            menuPopu.AppendMenu(MF_STRING,ID_HELP,"Test");
        }
    ::GetWindowRect(m_wndTree.m_hWnd ,&pt);
    if(pt.PtInRect (point))
        menuPopu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);}
    然后在你的对话框中击右键,只在m_wndTree区域中会弹出菜单来吧.