MDI结构,将View分为左边视图,右边为一个对话框,怎么做?

-小仙- 2012-12-11 03:35:03
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
...全文
290 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-04-01
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
-小仙- 2012-12-13
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
MDI的 mainframe 是个 空的 框架。实际的框架是 CChildFrame 如果 只有一个 view 要 分割,那么 要分割 的 view 所用的 CChildFrame 必须派生。
不能理解: “如果 只有一个 view 要 分割,那么 要分割 的 view 所用的 CChildFrame 必须派生。 ”
-小仙- 2012-12-13
  • 打赏
  • 举报
回复
引用 11 楼 erqieshi 的回复:
闪烁的问题 你在precreatewindow的时候可以把clipchildren 属性设置上 即子窗口区域不重绘
是重载哪一个的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结构了!
schlafenhamster 2012-12-13
  • 打赏
  • 举报
回复
MDI的 mainframe 是个 空的 框架。实际的框架是 CChildFrame 如果 只有一个 view 要 分割,那么 要分割 的 view 所用的 CChildFrame 必须派生。
schlafenhamster 2012-12-13
  • 打赏
  • 举报
回复
"文档的, 多子窗口的,但一个文档对应一个 View " 那不等于 多 view
-小仙- 2012-12-13
  • 打赏
  • 举报
回复
引用 17 楼 schlafenhamster 的回复:
那为什么用 MDI ?
多文档的, 多子窗口的,但一个文档对应一个View
schlafenhamster 2012-12-13
  • 打赏
  • 举报
回复
那为什么用 MDI ?
-小仙- 2012-12-13
  • 打赏
  • 举报
回复
引用 15 楼 schlafenhamster 的回复:
就是说 多 view 中 如果 只有一个 view 要 分割,那么 要分割 的 view 所用的 CChildFrame 必须派生。 其他的 view 还用 原来的 CChildFrame。
谢谢你的回复! 我的是单view的,一个文档对应一个view!
schlafenhamster 2012-12-13
  • 打赏
  • 举报
回复
就是说 多 view 中 如果 只有一个 view 要 分割,那么 要分割 的 view 所用的 CChildFrame 必须派生。 其他的 view 还用 原来的 CChildFrame。
erqieshi 2012-12-12
  • 打赏
  • 举报
回复
闪烁的问题 你在precreatewindow的时候可以把clipchildren 属性设置上 即子窗口区域不重绘
Forrest 2012-12-12
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
在 childFrame 中的 OnCreateClient 中,像 SDI 那样 分割窗口Spilitter
你可以从 CDialogBar 类子类化一个新类 CMyDialogBar , 在CMainFrame 类中 添加 一个 MyDialogBar 对象, 然后创建,停靠,,我做过相关的程序,现在不太记得了;
Eleven 2012-12-12
  • 打赏
  • 举报
回复
你在子框架窗口中拆分试图框架即可
schlafenhamster 2012-12-12
  • 打赏
  • 举报
回复
在 childFrame 中的 OnCreateClient 中,像 SDI 那样 分割窗口Spilitter
yqaion 2012-12-12
  • 打赏
  • 举报
回复
那你用CDockableForm停靠工具栏的方式,然后把对话框插入这个工具栏 就像VC界面一样
-小仙- 2012-12-12
  • 打赏
  • 举报
回复
一下子说了四种方法,呵呵
引用 8 楼 VisualEleven 的回复:
你在子框架窗口中拆分试图框架即可
回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 三者是什么关系?
erqieshi 2012-12-11
  • 打赏
  • 举报
回复
那就创建对话框放在frame里 而不是view里 然后 movewindow view 以及你创建的对话框到合适的位置
-小仙- 2012-12-11
  • 打赏
  • 举报
回复
能不能还是想办法创建对话框,但又不包含在View中,而是与View同一级处于同一窗口中呢?
-小仙- 2012-12-11
  • 打赏
  • 举报
回复
你是想让Edit作为视图区吧! 这样似乎不太好,
-小仙- 2012-12-11
  • 打赏
  • 举报
回复
引用 1 楼 yqaion 的回复:
你创建MFC的时候可以 选择CFormView,在里面放一个Edit控件 MoveWindow()就可以了
好的我试试,非常感谢!
yqaion 2012-12-11
  • 打赏
  • 举报
回复
你创建MFC的时候可以 选择CFormView,在里面放一个Edit控件 MoveWindow()就可以了

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧