Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как запустить копию основного MDI фрейма в прложен, Как запустить копию основного MDI фрейма 
:(
    Опции темы
Ильнар
Дата 12.9.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 16.1.2006

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



Существует MDI приложение, необходимо запустить копию фрейма основного фрейма приложения в отдельном потоке, по сути получается что надо запустить копию приложения из самого приложения в отдельном потоке. Каким образом я это попытался сделать: завел два новых класса
Код

class CPreviewFrame : public CMDIFrameWnd - класс копия основного фрейма, 
class CPreviewApp : public CWinThread - наследник от CWinThread чтобы можно было в потоке манипулировать графикой


и в обработчике запускаю поток следующим образом

Код

CWinThread *p = AfxBeginThread(RUNTIME_CLASS(CPreviewApp),THREAD_PRIORITY_NORMAL);


Программа ругается, а затем падает на функции LoadFrame(IDR_PREVIEWFRAME) с помощью которой я создаю фрейм. В чем может быть дело?
Класс самого приложения CWinApp, проблема была бы исчерпана если бы можно было завести в приложении еще один экземпляр класса CWinApp, но как известно MFC этого не позволяет.
Что я не так делаю?

PM MAIL   Вверх
voov
Дата 12.9.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

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



а можно узнать, чем вызвана такая необходимость? зачем нужно 2 экземпляра CWinApp?
PM MAIL   Вверх
Ильнар
Дата 15.9.2008, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 16.1.2006

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



Необходимо запустить копию MDI фрейма с другими тулбарами и с другим набором меню (просто скрыть имеющиеся и показать другие не годится), также дочерние окна ChildFrame в этом MDIFrame планируется отображать с другим видом! я предположил что это можно сделать в отдельном потоке! возможно я не прав.  а WinApp я предположил избавит от вываливающихся ассертов, которые никак не удается победить. на самом деле я использую WinThread (см выше). Может есть другие способы?
PM MAIL   Вверх
voov
Дата 15.9.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

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



Значит делать 2 экземпляра WinApp полный абсурд. Так как WinApp представляет собой собственно приложение. А попытки добавить в приложение второе приложение ни к чему хорошему не приведут. То же касается главного окна приложения. У приложения может быть только одно главное окно.
ИМХО, такая постановка задачи говорит либо о неправильном проектировании, либо о не понимании того, как работает приложение с архитектурой документ-вид.
PM MAIL   Вверх
Ильнар
Дата 16.9.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 16.1.2006

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



Значит задача такая: запущено MDI приложение, главное окно содержит несколько тулбаров и загружено с определенным меню!  в MDI приложении открыты несколько документов с использованием одного шаблона DocTemplate, условно назову его шаблон 1, необходимо каким-то образом закрыть все имеющиеся тулбары и открыть другой один тулбар! также перегрузить меню! также необходимо отобразить документы с другоим видом, для этого я использовал другой шаблон DocTemplate, условно назову его шаблон 2. Если делать все это в одном главном окне в основном потоке , то визуально окно приложения танцует, промаргивает пока не завершиттся операция! а это не хорошо, да и не солидно. представьв течении 20-30 сек окно моргает, Child окна закрываются-открываются, не красиво! поэтому я хотел поступить следующим образом: все преобразования документов делаю в дополнительном потоке и в нем же загружаю MDI фрейм с другим тулбаром и другим меню, а потом его просто показываю, а главное окно приложения скрываю ShowWindow(SW_HIDE)  и все выглядит очень здорово!
если есть другие предложения и способы решения задачи, то я буду признателен..
PM MAIL   Вверх
voov
Дата 16.9.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

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



Все равно не очень понятно. В шаблоне 1 и 2 у тебя разные типы документов или один и тот же тип? Что это за преобразования документов, которые ты хочешь делать в отдельном потоке? Кстати, операции над документами (данными) можно делать и в отдельном потоке (скорее всего здесь нужна будет синхронизация данных), но вид, представляющий этот документ, моргать не должен.
Цитата(Ильнар @  16.9.2008,  10:51 Найти цитируемый пост)
необходимо каким-то образом закрыть все имеющиеся тулбары и открыть другой один тулбар! также перегрузить меню!

и это не проблема, главное знать что и когда показывать.
PM MAIL   Вверх
Ильнар
Дата 19.9.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 16.1.2006

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



я разобрался в проблеме, я неправильно работал с шаблоном документов в дополнительном потоке!
теперь возникла другая проблема. как можно отключить загрузка меню в основном MDIFrame? чтобы вообще меню не было
PM MAIL   Вверх
voov
Дата 19.9.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

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



Посмотри в классе приложения (CxxxxApp) метод InitInstance. Там есть такой код
Код

    // create main MDI Frame window
    CMainFrame* pMainFrame = new CMainFrame;
    if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))

PM MAIL   Вверх
Ильнар
Дата 19.9.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 16.1.2006

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



и что с этим кодом делать? 
когда откроется документ, то меню перегружается более полно, а мне надо чтобы его вообще не было когда откроется документ
PM MAIL   Вверх
voov
Дата 19.9.2008, 13:44 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

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



В шаблоне документа указывается меню, которое будет загружено при открытии документа. Убери его, если не нужно меню совсем.
Код

    pDocTemplate = new CMultiDocTemplate(IDR_UntitledTYPE,
        RUNTIME_CLASS(CххххDoc),
        RUNTIME_CLASS(CххххFrame), // custom MDI child frame
        RUNTIME_CLASS(CхххххView));


Можно еще сделать ресурс меню, которое будет пустым.

PM MAIL   Вверх
Ильнар
Дата 19.9.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 16.1.2006

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



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


 




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


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

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