MFC MDI结构,
每次新建一个文档,对应一个窗口, 每个窗口都是左边是视图区,右边是一个对话框,视图区应该除去对话框的区域,如果用:
//
CCtlPaneDlg     m_CtlPaneDlg;
////
m_CtlPaneDlg.Create( IDD_DLG_CTLPANE, this );
//m_CtlPaneDlg.SetWindowPos ( NULL, 0, 0, 250, cy, SWP_SHOWWINDOW );的方式,虽然可以出现对话框,但视图区还是没有变化,只是在View上覆盖了对话框。
如果用分割窗口的话,好像闪烁就更厉害了! 不知道怎么做?可以让spy++ ,查看时,窗口为两个窗口区,坐标为View,右边为dialog

解决方案 »

  1.   

    你创建MFC的时候可以 选择CFormView,在里面放一个Edit控件  MoveWindow()就可以了
      

  2.   

    你是想让Edit作为视图区吧!
    这样似乎不太好,
      

  3.   

    能不能还是想办法创建对话框,但又不包含在View中,而是与View同一级处于同一窗口中呢?
      

  4.   

    那就创建对话框放在frame里
    而不是view里
    然后 movewindow view 以及你创建的对话框到合适的位置
      

  5.   

    那你用CDockableForm停靠工具栏的方式,然后把对话框插入这个工具栏 就像VC界面一样
      

  6.   

    在 childFrame 中的 OnCreateClient 中,像 SDI 那样 分割窗口Spilitter 
      

  7.   

    你可以从 CDialogBar 类子类化一个新类 CMyDialogBar   ,
    在CMainFrame 类中 添加 一个 MyDialogBar   对象,然后创建,停靠,,我做过相关的程序,现在不太记得了;
      

  8.   

    一下子说了四种方法,呵呵
    回schlafenhamster 和 VisualEleven :
    采用拆分窗口的办法, 左视图嵌入一个Dialog, 然后拖动View的窗口时, 感觉Dialog闪烁的很厉害!  不知道怎么改善?
    在拖动窗口时,左边的Dialog有时候会消失!
    int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CMDIChildWndEx::OnCreate(lpCreateStruct) == -1)
    return -1;

    // 创建一个视图以占用框架的工作区
    if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, 
    CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
    {
    TRACE0("未能创建视图窗口\n");
    return -1;
    }
    return 0;
    }BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    // TODO: 在此添加专用代码和/或调用基类
    m_splitterWnd.CreateStatic( this, 1, 2 );
    m_splitterWnd.CreateView( 0, 0, RUNTIME_CLASS(CViewLeft), CSize(0,0), pContext );
    m_splitterWnd.CreateView( 0, 1, RUNTIME_CLASS(CViewRight), CSize(0,0), pContext);
    m_splitterWnd.SetColumnInfo( 0, 250, 10 );
    return TRUE;
    return CMDIChildWndEx::OnCreateClient(lpcs, pContext);
    }在OnCreate中创建的View: m_wndView
    和OnCreateClient中创建的分割窗口m_splitterWnd;
    和 CChildFrame 三者是什么关系?
      

  9.   

    闪烁的问题
    你在precreatewindow的时候可以把clipchildren
    属性设置上
    即子窗口区域不重绘
      

  10.   

    MDI的 mainframe 是个 空的 框架。实际的框架是 CChildFrame
    如果 只有一个 view 要 分割,那么 要分割 的 view 所用的 CChildFrame 必须派生。
      

  11.   

    是重载哪一个的precreatewindow,是:BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    // TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式
    if( !CMDIChildWndEx::PreCreateWindow(cs) )
    return FALSE; return TRUE;
    }还是:BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
    {
    if (!CWnd::PreCreateWindow(cs))
    return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE;
    cs.style &= ~WS_BORDER;
    cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
    ::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL); return TRUE;
    }
    加入:
    cs.style |=WS_CLIPCHILDREN;
    都无效,拖动视图窗口时,还是闪烁的厉害!看来我得好好研究哈  MFC的MDI结构了!
      

  12.   


    不能理解:
    “如果 只有一个 view 要 分割,那么 要分割 的 view 所用的 CChildFrame 必须派生。 ”
      

  13.   

    就是说 多 view 中 
    如果 只有一个 view 要 分割,那么 要分割 的 view 所用的 CChildFrame 必须派生。
    其他的 view 还用 原来的 CChildFrame。
      

  14.   


    谢谢你的回复!我的是单view的,一个文档对应一个view!
      

  15.   


    多文档的, 多子窗口的,但一个文档对应一个View
      

  16.   

    "文档的, 多子窗口的,但一个文档对应一个
    View "
    那不等于 多 view