C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Диалог создания/выбора нового документа. CNewTypeDlg / MFC / Visual C++

Диалог создания/выбора нового документа. CNewTypeDlg
A: (Leprecon)
Оригинальная ссылка: нету

Всем, кто хоть раз создавал в MDI приложении больше одного шаблона документа, известна ситуация, когда при запуске приложения или создания нового документа вылезает стандартный МФСишный диалог "Новый документ". В нем вам предлагается выбрать один из созданных вами шаблонов. По этому шаблону приложение создаст новый документ, фрейм и представление для него. Описан этот диалог в файле "docmgr.cpp" - class CNewTypeDlg : public CDialog и нам он в общем-то недоступен. Вот что необходимо для создания собственного диалога выбора нового документа:
1. Создать свой класс менеджера документов.
class CMyDocManager : public CDocManager
{
public:
    CMyDocManager();

public:

public:
// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMyDocManager)
    public:
    virtual void OnFileNew();
    //}}AFX_VIRTUAL

};
2. В нем нам необходима лишь одна виртуальная функция
void CDocManager::OnFileNew(); Именно в ней вызывается стандартный диалог выбора шаблона для нового документа.
3. Необходимо создать свой класс диалога выбора
class CMyNewTypeDlg : public CDialog
4. В функции void CMyDocManager::OnFileNew() вызываем свой диалог:
void CMyDocManager::OnFileNew()
{
    if (m_templateList.IsEmpty())
    {
        TRACE0("Error: no document templates registered with CWinApp.\n");
        AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
        return;
    }

    // Если всего один зарегистрированный шаблон документа,
    // то не вызываем диалог выбора, а создаем документ этого типа. 
    CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();
    if (m_templateList.GetCount() > 1)
    {
        // more than one document template to choose from
        // bring up dialog prompting user
        CMyNewTypeDlg dlg(&m_templateList);
        int nID = dlg.DoModal();
        if (nID == IDOK)
        {
            // Берем указатель на выбранный шаблон документа.
            CDocTemplate* pTemplate = dlg.m_pSelectedTemplate;
        }
    }

    // Создаем новый документ по этому шаблону.
    CDocument* pDoc = pTemplate->OpenDocumentFile(NULL);
}
5. Меняем МФСишный менеджер документов на свой. Создание менеджера происходит в функции
void CWinApp::AddDocTemplate(CDocTemplate* pDocTemplate);
void CMyApp::AddDocTemplate(CDocTemplate* pTemplate)
{
    if (m_pDocManager == NULL)
        m_pDocManager = new CMyDocManager;
    m_pDocManager->AddDocTemplate(pTemplate);
}
Примечание:
Если при запуске MDI приложения, новый документ вообще не нужно создавать, то вставьте следующую строчку в функцию InitInstance(), вашего приложения:
    ...........
    // Parse command line for standard shell commands, DDE, file open
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);

    // Dispatch commands specified on the command line
    cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing; // Вот эту строчку!
    if (!ProcessShellCommand(cmdInfo))
        return FALSE;
    .........


Если есть какие-то замечания, предложения или что-то еще, то пишите:
leprecon@pisem.net.