Комбинация проектов MFC: как добавить приложение SDI без класса документа в приложение MDI? Следует ли использовать дочернее окно? [MFC]

Сейчас я работаю с приложением MDI MFC и хочу добавить в приложение функцию консоли / командной строки. Единственная функция, которую я хочу использовать в QuickWin (см. Ниже), — это использовать ее текстовую область и функцию обработки, которая захватывает ввод. Если я смогу добавить его во всплывающее диалоговое окно или панель инструментов, это будет здорово!
И я получил src-код приложения SDI без класса документа, как это (ссылка: HTTP: //www.codeproject.com /…/ QuickWin -…):

Мой вопрос: могу ли я добавить приложение в мое приложение MDI и как работать с исходными или заголовочными файлами, такими как:
MainFrm.cpp / MainFrm.h и класс вроде: 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 текстовых поля (по одному для stdin, stdout и stderr) и следующие классы из проекта Quickwin:

  • CRedirect
  • CRedir
  • CParamDlg (только оптический пух, не обязательно)

CRedirect-класс управляет созданием нового процесса, а также перенаправлением stdin / stdout / stderr (в сочетании с CRedir).

Вы должны изменить CRedir::OnChildWrite и — Запущено и — Терминат, чтобы соответствовать вашим потребностям. Эти методы фактически записывают содержимое в представление / текстовое поле / что угодно. Полезно посмотреть на CMainFrame::OnCopyData а также CQuickView::Append о том, как это можно сделать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]