Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Много-оконное приложение. Нужен совет. 
:(
    Опции темы
ShurikA
Дата 16.2.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Вообщем так (описывать долго, но надо):

Делаю много-оконное приложение в котором:

Код

class CFibImApp : public CWinApp
...


Внутри него, в его BOOL CFibImApp::InitInstance() создаётся CMDIFrameWnd
Код

BOOL CFibImApp::InitInstance()
{
    CWinApp::InitInstance();
    CMDIFrameWnd* pFrame = new CMainFrame;
    if (!pFrame)
        return FALSE;
    m_pMainWnd = pFrame;
    // create main MDI frame window
    if (!pFrame->LoadFrame(IDR_MAINFRAME))
        return FALSE;

    HINSTANCE hInst = AfxGetResourceHandle();
    m_hMDIMenu  = ::LoadMenu(hInst, MAKEINTRESOURCE(IDR_FibImTYPE));
    m_hMDIAccel = ::LoadAccelerators(hInst, MAKEINTRESOURCE(IDR_FibImTYPE));
    
    pFrame->ShowWindow(m_nCmdShow);
    pFrame->UpdateWindow();
    return TRUE;
}


в меню IDR_MAINFRAME существует File->New, при нажатии на неё (как бы это не было удивительно) вызывается функция CFibImApp::OnFileNew() :
Код

void CFibImApp::OnFileNew() 
{
    CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
    // create a new MDI child window
    pFrame->CreateNewChild(
        RUNTIME_CLASS(CChildFrame), IDR_FibImTYPE, m_hMDIMenu, m_hMDIAccel);
}

с уже зарание определёнными новыми Menu и Accelerators.

...открыли... открылось smile

далее:

CChildFrame наследует от CMDIChildWnd.
В CChildFrame есть обьект CChildView m_wndView который в свою очередь наследует от CWnd.
Создаём:
Код

int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    // create a view to occupy the client area of the frame
    if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, 
        CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
    {
        TRACE0("Failed to create view window\n");
        return -1;
    }

    return 0;
}


и наконец CChildView:
как уже сказанно выше он имеет своё Menu в котором есть обьект File->Open вызывающий (естественно) OnFileOpen().
Код

void CChildView::OnFileOpen()
{
    CString strFilter;
    CSimpleArray<GUID> aguidFileTypes;
    HRESULT hResult;

    hResult = imgOriginal.GetExporterFilterString(strFilter,aguidFileTypes);
    if (FAILED(hResult)) {
        CString fmt;
        fmt.Format("GetExporterFilter failed:\n%x - %s", hResult, _com_error(hResult).ErrorMessage());
        ::AfxMessageBox(fmt);
        return;
    }

    CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);
    dlg.m_ofn.nFilterIndex = m_nFilterLoad;
    hResult = (int)dlg.DoModal();
    if(hResult != IDOK) {
        return;
    }

    m_nFilterLoad = dlg.m_ofn.nFilterIndex;
    imgOriginal.Destroy();
    hResult = imgOriginal.Load(dlg.GetFileName());
    if (FAILED(hResult)) {
        CString fmt;
        fmt.Format("Load image failed:\n%x - %s", hResult, _com_error(hResult).ErrorMessage());
        ::AfxMessageBox(fmt);
        return;
    }

    Invalidate();
    UpdateWindow();
}

то есть, запрашиваем у юзера фаил (картинку) и загоняем в imgOriginal, после чего перерисовываем окно уже с картинкой.

Сделали... Работает!!! Прекрасно!!! ..... да не очень smile

получается глупо: чтобы открыть картинку, надо открыть новое окно и только потом выбрать фаил и открыть. Хотелось бы иметь File->Open в меню главного окна. Чтобы сначало запросить фаил а потом уже открыть новое окно, залить туда фотау и показать, не так ли?

Хорошо, делаем:
Создал File->Open в меню главного окна (CFibImApp::IDR_MAINFRAME) есть, присобачили функцию CFibImApp::OnFileOpen()...
и вот тут я застрял!!!! smile

единственно до чего я дошёл:
Код

void CFibImApp::OnFileOpen()
{
    m_pMainWnd->PostMessage(WM_COMMAND, ID_FILE_NEW, NULL);
}

и поменял OnFileNew() на:
Код

void CFibImApp::OnFileNew() 
{
    CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
    // create a new MDI child window
    pFrame->CreateNewChild(
        RUNTIME_CLASS(CChildFrame), IDR_FibImTYPE, m_hMDIMenu, m_hMDIAccel);
    pFrame->PostMessage(WM_COMMAND, ID_FILE_OPEN, NULL,NULL);
}


все работает и даже картинку показывает, но сразу после этого убивает окно с картинкой...

вот такая беда smile


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 17.2.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Неужели нт кто не знает??? smile


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 17.2.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



ShurikA,
раз уж ты пишешь в MFC, создай шаблон документа (в смысле DocTemplate), зарегистрируй его в InitInstance и не мучайся. После этого стандартный обработчик CWinApp::OnFileOpen все тебе сделает. А если все же хочешь сам - обращайся к первоисточникам.


--------------------
...
PM   Вверх
ShurikA
Дата 17.2.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Earnest
Спасибо.
Исправь меня если я не прав, но то как я сделал это почти так как ты сказал, только без как такового определения DocTemplate...


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 21.2.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(ShurikA @ 17.2.2006, 22:49 Найти цитируемый пост)
Исправь меня если я не прав, но то как я сделал это почти так как ты сказал, только без как такового определения DocTemplate...

Ты не прав.
(Если бы ты был прав, у тебя бы все работало. smile)
Объяснять детали долго, пол-MFC привести надо. Лучше сделай стандартным образом.



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.