Сейчас я работаю с приложением 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 в панель приложений моего приложения, в шаблон документа или просто во всплывающее окно?
Все, что вам нужно для интеграции функциональности QuickWin в ваше приложение, — это 3 текстовых поля (по одному для stdin, stdout и stderr) и следующие классы из проекта Quickwin:
CRedirect-класс управляет созданием нового процесса, а также перенаправлением stdin / stdout / stderr (в сочетании с CRedir).
Вы должны изменить CRedir::OnChildWrite
и — Запущено и — Терминат, чтобы соответствовать вашим потребностям. Эти методы фактически записывают содержимое в представление / текстовое поле / что угодно. Полезно посмотреть на CMainFrame::OnCopyData
а также CQuickView::Append
о том, как это можно сделать.
Других решений пока нет …