回 帖 发 新 帖 刷新版面

主题:VC的界面问题  TabCtrl 与 Dialog

我在做VC的界面,遇到一个问题,就是CDialog的对话框,不能很好的嵌在CTabCtrl中,
代码如下,帮忙看一下了

void ControlPlane::OnInitialUpdate() 
{
    CFormView::OnInitialUpdate();
    
    // TODO: Add your specialized code here and/or call the base class
    TCITEM item;
    item.mask = TCIF_TEXT;
    item.pszText = "Create";
    m_TabCtrl.InsertItem (0,&item);
    item.pszText = "Modife";
    m_TabCtrl.InsertItem (1,&item);
    
    m_CreateTab.Create (IDD_TAB_CREATE,&m_TabCtrl);
    m_ModifeTab.Create (IDD_TAB_MODIFE,&m_TabCtrl);
    CRect rc;
    m_TabCtrl.GetWindowRect(rc);
    rc.top = rc.top + 2;
    rc.left = rc.left + 2;
    rc.right = rc.right - 2;
    rc.bottom = rc.bottom - 2;
    int cx = rc.right - rc.left;
    int cy = rc.bottom - rc.top;

        //问题
    m_CreateTab.SetWindowPos(NULL,rc.top,rc.left,rc.right,rc.bottom,SWP_SHOWWINDOW);
        //替换部分
         //m_CreateTab.ShowWindow(WS_SHOW);
}

这个就是问题的代码,问题出现在最后两行,如果换成地下的那一行   m_CreateTab.ShowWindow(WS_SHOW); 倒是可以显示,但是位置不对,Dailog把标签给盖住了,如果换成上面的那一行,就跟不显示不出来Dialog了,



怎么办呢?

回复列表 (共2个回复)

沙发

SetWindowPos是用来移动位置的, m_CreateTab.SetWindowPos是用来移动你的tab控件的位置,rc.top,rc.left,rc.right,rc.bottom分别表示,控件的左上角x坐标,y坐标,控件长度和宽度,而且第一个参数为承载对话框的句柄,为NULL不行,等于没有移动,CRect rc;
    m_TabCtrl.GetWindowRect(rc);改为CRect rc;GetClientRect(&rc);


m_CreateTab.SetWindowPos(NULL,rc.top,rc.left,rc.right,rc.bottom,SWP_SHOWWINDOW);改为
if(this->GetSafeHand())
m_CreateTab.SetWindowPos(this,rc.top,rc.left,rc.right,rc.bottom,SWP_SHOWWINDOW);

板凳

应该是继承一个tab子类CNewTab, 然后进行修改, 在类CNewTab中添加一个函数, AddTabPage(int nIndex, CString strTabName, CWnd* pWnd), 其中参数分别代表添加的顺序, 添加的tab页的名称以及添加的控件的指针, 在类CNewTab中添加一个CArray<CWnd*,CWnd*> m_arrWnd;用来存储添加的对话框的指针, 然后对添加页函数进行处理, 我这边的处理如下

    if(pWnd == NULL)
        return FALSE;
    if( !IsWindow(pWnd->GetSafeHwnd()))
        return FALSE;

    InsertItem(nIndex,strCaption);
    if( nIndex >= 0 && nIndex < m_arrWnd.GetSize())
        m_arrWnd.InsertAt(nIndex,pWnd);
    else
        m_arrWnd.Add(pWnd);

    CRect rtClient;
    GetClientRect(&rtClient);
    AdjustRect(FALSE,&rtClient);
    pWnd->MoveWindow(rtClient);
    pWnd->ShowWindow(SW_HIDE);
这样就可以了, 然后想在其中添加任何CWnd的子类都可以

我来回复

您尚未登录,请登录后再回复。点此登录或注册