Не могу понять, как работает SDI - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь создать текстовый редактор, используя пустой проект. Мне тяжело оборачиваться вокруг SDI. Что это делает именно? Также, как я могу использовать классы?

auto pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(BaseDocument),
    RUNTIME_CLASS(BaseFrame),
    RUNTIME_CLASS(BaseView));

if (!pDocTemplate)
    return FALSE;
AddDocTemplate(pDocTemplate);

Я попытался использовать документ так:

auto xtra = (BaseDocument*)pDocTemplate->OpenDocumentFile(newDlg.currPath);

Возвращает ошибку «Файл не может быть открыт».

Редактировать: Когда я пытаюсь просто пропустить созданное мной диалоговое окно и просто запустить код «Шаблон», возникает ошибка, когда он достигает

if (!ProcessShellCommand(cmdInfo)) return FALSE;

Вот целое приложение:

BEGIN_MESSAGE_MAP(BaseApp, CWinApp)
ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)
END_MESSAGE_MAP()

BaseApp::BaseApp() {
SetAppID(_T("AbduTextEditor"));
}


BaseApp::~BaseApp()
{
}
BaseApp theApp;

BOOL BaseApp::InitInstance() {
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();

SetRegistryKey(_T("AbduTextEditor"));
LoadStdProfileSettings(5);

m_pRecentFileList->ReadList();

auto pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(BaseDocument),
    RUNTIME_CLASS(BaseFrame),
    RUNTIME_CLASS(BaseView));


if (!pDocTemplate)
    return FALSE;
AddDocTemplate(pDocTemplate);
/*
BeginningDlg newDlg;
BOOL newdoc;

for (auto i = 0; i <= 4; i++) {
    newDlg.rf.Add(m_pRecentFileList->operator[](i));
}

switch (newDlg.DoModal()) {
case 1:
    newdoc = FALSE;
    break;
case 3:
    newdoc = TRUE;
    break;
default:
    return FALSE;
}
auto xtra = (BaseDocument*)pDocTemplate- 
>OpenDocumentFile(newDlg.currPath);*/

CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);


AfxInitRichEdit2();

EnableShellOpen();
RegisterShellFileTypes(TRUE);

if (!ProcessShellCommand(cmdInfo))
    return FALSE;



m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();

return TRUE;
}


int BaseApp::ExitInstance()
{
m_pRecentFileList->WriteList();

return CWinApp::ExitInstance();
}

Вот где mydlg.currPath установлен

void BeginningDlg::OnBnClickedOpenbutton(){
CString string = _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*||");

CFileDialog filedlg(TRUE,nullptr,nullptr, OFN_FILEMUSTEXIST| 
OFN_ENABLEINCLUDENOTIFY,string,this);

filedlg.m_ofn.lpstrInitialDir = path;
INT_PTR pInt = filedlg.DoModal();

if (pInt == IDOK) {
    currPath.Append(filedlg.GetPathName());
    EndDialog(1);
}
}

1 Ответ

0 голосов
/ 06 января 2019

Вам необходимо переопределить сообщение ON_CREATE для кадра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...