MFC项目组合:如何将没有文档类的SDI应用程序添加到MDI应用程序中?应该使用子窗口吗?[MFC]
Posted
技术标签:
【中文标题】MFC项目组合:如何将没有文档类的SDI应用程序添加到MDI应用程序中?应该使用子窗口吗?[MFC]【英文标题】:MFC Project Combination: How to add a SDI application without document class to a MDI application?should I use child window?[MFC] 【发布时间】:2012-11-12 07:54:12 【问题描述】:我现在正在使用 MDI MFC 应用程序并希望向该应用程序添加控制台/命令行功能。我想从 QuickWin(见下文)中获得的唯一功能是使用它的文本区域和捕获输入的过程功能。如果我可以将它添加到弹出对话框或停靠栏,那就太好了! 我得到了一个没有文档类的 SDI 应用程序的 src 代码(link:http://www.codeproject.com/.../QuickWin-...):
我的问题是:我可以将应用程序添加到我的 MDI 应用程序中,以及如何处理源文件或头文件,例如: MainFrm.cpp/MainFrm.h 和 class like: CQuickWinApp/CQuickView?(如果我能弹出一个子窗口来实现这个功能就更好了:))
在QuickWin的主机中,它与客户区有关,处理起来比较困难:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
// create splitter without views
m_wndSplitter.CreateStatic(this, 2, 1);
CCreateContext Context;
Context.m_pNewViewClass = RUNTIME_CLASS(CQuickView);
Context.m_pCurrentDoc = NULL;
Context.m_pNewDocTemplate = NULL;
Context.m_pLastView = NULL;
Context.m_pCurrentFrame = this;
// Create the Stdio QuickView
m_pStdioView = (CQuickView*)CreateView(&Context, AFX_IDW_PANE_FIRST);
if (m_pStdioView == NULL)
TRACE("Failed to create QuickWin Stdio View\n");
return FALSE; // fail to create
// Create the Stderr QuickView
m_pStderrView = (CQuickView*)CreateView(&Context, AFX_IDW_PANE_FIRST);
if (m_pStderrView == NULL)
TRACE("Failed to create QuickWin Stderr View\n");
return FALSE; // fail to create
m_pStderrView->SetReadOnly(TRUE);
ShowSplitter(theApp.m_bShowSplitter);
return TRUE;
在我的 MDI 应用程序中:
MDI 应用有 3 个文档模板:
//BCGPVisualStudioGUIDemo.cpp
m_pDocTemplateCpp = new CMultiDocTemplate(
IDR_BCGDEVTYPE_CPP,
RUNTIME_CLASS(CBCGPVisualStudioGUIDemoDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CBCGPVisualStudioGUIDemoView));
AddDocTemplate (m_pDocTemplateCpp);
m_pDocTemplateWeb = new CMultiDocTemplate(
IDR_BCGDEVTYPE_WEB,
RUNTIME_CLASS(CBCGPVisualStudioGUIDemoDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CBCGPVisualStudioGUIDemoView));
AddDocTemplate (m_pDocTemplateWeb);
m_pStartDocTemplate = new CMultiDocTemplate(
IDR_BCGDEVTYPE0,
RUNTIME_CLASS(CNetworkMapEditorDemoDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CNetworkMapEditorDemoView));
AddDocTemplate(m_pStartDocTemplate);
该应用还有一些停靠栏:
//MainFrm.cpp
//------------------
// Create config bar:
//------------------
if (!m_wndClassView.Create (_T("config"), this, CRect (0, 0, 200, 200),
TRUE,
ID_VIEW_CLASS,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))
TRACE0("Failed to create Class View bar\n");
return FALSE; // fail to create
//------------------
// Create output bar:
//------------------
if (!m_wndOutputView.Create (_T("output"), this, CRect (0, 0, 200, 100),
TRUE,
ID_VIEW_OUTPUT,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI))
TRACE0("Failed to create output bar\n");
return FALSE; // fail to create
//------------------
// Create help bar:
//------------------
if (!m_wndDynamicHelpView.Create (_T("help"), this, CRect (0, 0, 200, 200),
TRUE,
ID_VIEW_DYNAMICHELP,
WS_CHILD | WS_VISIBLE | CBRS_RIGHT | CBRS_FLOAT_MULTI))
TRACE0("Failed to create Dynamic Help Bar\n");
return FALSE; // fail to create
//------------------
// Create watch bar:
//------------------
if (!m_wndWatchBar.Create (_T("watch"), this, CRect (0, 0, 300, 100),
TRUE,
ID_VIEW_WATCH,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI))
TRACE0("Failed to create watch bar\n");
return FALSE; // fail to create
//------------------
// Create property bar:
//------------------
if (!m_wndPropertiesBar.Create (_T("property"), this, CRect (0, 0, 300, 200),
TRUE,
ID_VIEW_PROPERTIES,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
TRACE0("Failed to create Properties Bar\n");
return FALSE; // fail to create
我可以将 QuickWin 应用程序的文本功能添加到我的应用程序的停靠栏、文档模板或只是一个弹出窗口中吗?
【问题讨论】:
这和大型机有关吗? 我添加一些与大型机和视图相关的内容,谢谢! 【参考方案1】:将 QuickWin 的功能集成到应用程序中所需的只是 3 个文本框(一个用于标准输入、标准输出和标准错误)以及 Quickwin 项目中的以下类:
C 重定向 CRedir CParamDlg(只是视觉上的绒毛,不是必需的)CRedirect 类管理新进程的创建以及 stdin/stdout/stderr 的重定向(与 CRedir 结合使用)。
您必须修改 CRedir::OnChildWrite
和 -Started 和 -Terminate 以满足您的需求。这些方法实际上将内容写入视图/文本框/任何东西。查看 CMainFrame::OnCopyData
和 CQuickView::Append
会有所帮助,了解如何做到这一点。
【讨论】:
我的意思是把文本框放在哪里,在停靠栏或要添加的另一个视图或子窗口中?能否提供更详细的解决方案? 我不知道你想把你的文本框放在哪里。你可以把它放在另一个视图中,或者只是放在一个对话框中,这取决于你。以上是关于MFC项目组合:如何将没有文档类的SDI应用程序添加到MDI应用程序中?应该使用子窗口吗?[MFC]的主要内容,如果未能解决你的问题,请参考以下文章
MFC SDI中,如何删除窗口的最大化和最小化功能(窗口右上角的2个图标)
在Visual C++设计中,单文档应用程序中常用的MFC类如何相互获得类的指针?(如CView类获得CDoc类的指针等