Информация об изменениях

Сообщение Re[6]: как получить фрейм обьекта CDialog от 13.03.2014 7:14

Изменено 01.03.2018 15:04 cupuyc.

Re[6]: как получить фрейм обьекта CDialog
C>>>>Мне нужно в модальное диалоговое окошко вставить элемент ActiveX.
AG>>>С этой задачей, как я понимаю, все получилось. Или же возникли какие-либо проблемы?
C>>Нет, с этой задачей я не справился. У меня получилось только запихнуть сервер автоматизации ворда в свой фрейм наследованный от CMDIChildWnd. В кач-ве вьюшки я использую наследника от CScrollView.
AG>Под понятием "элемент ActiveX" — как правило, понимается нейкий GUI контрол. Конечно, это может быть и НЕ ГРАФИЧЕСКИЙ элемент (в т.ч. и сервер автоматизации). Я сначала подумал, что это какая-то графическая штуковина (как-то связанная с Вашей задачей), но не сам OLE-сервер MS Word.

Ну так я и использую GUI ворда как элемент ActiveX.

AG>>>То есть сервером OLE-automation является MS Word, а клиентом — Ваша программа на MFC. Верно?

C>>Все верно.
AG>Вот неплохие рекомендации — может пригодатся:
AG>http://www.codeproject.com/Articles/34998/MS-Office-OLE-Automation-Using-C
Спасибо за ссылку, но я уже все это прошерстил. Но воспользовался вот этой ссылкой http://support.microsoft.com/kb/238611/en-us .


AG>Обратите внимание на:

AG>

AG>With MFC, use the Visual C++ ClassWizard to generate "wrapper classes" from the Microsoft Office type libraries. These classes, as well as other MFC classes, such as COleVariant, COleSafeArray, and COleException, simplify the tasks of Automation. This method is usually recommended over the others, and most of the Microsoft Knowledge Base examples use MFC.

AG>ИМХО — это примерно то, что Вам требуется. В современных студиях: меню Project/Add Class там MFC и затем "MFC Class from TypeLib"; в открывшемся окне выбираем (add class from) -> File — открываем файл — например: C:\Program Files\Microsoft Office\Office12\EXCEL.EXE — и далее берем требуемые компоненты...
Собственно так я и добавлял классы и компоненты ворда в свой проект.

AG>>>Что делает элемент ActiveX, указанный Вами выше, и какая его роль в обмене инфой с MS Word?

C>>Я открываю документ с помощью ворда в своей программе. Встраиваю ворд как элемент ActiveX и обрабатываю его методами сервера автоматизации. Далее, после того как документ обработан и готов к показу, я его отображаю как дочернее окошко своей программы. Вот в этот самый момент мне и нужна модальность. Что бы программа не выполнялась далее, а застопорилась пока пользователь не закроет окошко с сервером форда.
AG>Что мешает сделать — через импорт библиотеки Type Library — этот же функционал в наследнике CDialog?
Наверное я чего то не знаю. Но мне нужна организация документ — вид + класс — контейнер наследованный от COleClientItem для хранения обьекта AxtiveX насколько я понял. А как это реализовать в наследнике от CDialog я, к сожалению, не представляю. Буду рад помощи.

C>>Все это счастье с автоматизацией ворда разрабатывается в отдельной dll — библиотеке.

AG>А откуда загружается это счастье (то есть длл-ка)?
Есть проект он же .exe, который использует кучу функционала разбросанного по разным подключаемым библиотекам .dll. Так вот в одной такой библиотеке реализована печать документов через MS Office: Excel, Word. Функционал по екселю писали другие разработчики до меня. Мне же сейчас поставили задачу сделать открытие печатных форм с помощью ворда. Запускается сервер автоматизации ворда, его GUI вставляется в дочернее окно нашей программы и после обработки документа отображается на экране пользователю. После долгих поисков в инете и методом проб и ошибок у меня появился рабочий вариант. Но теперь встал вопрос: когда поднимаются несколько печатных форм одна за другой, программа открывает их все сразу причем в отдельных дочерних окнах. Это не есть гуд. Нужно что бы они по очереди поднимались: открылся один документ, пользователь его закрыл крестиком, затем второй и т.д. Ну вот как — то так.
Вот вызов из дллки:

extern "C"__declspec(dllexport)
CWnd* PrintRtfInWordActiveX(CSTString RtfTemplate, CReport report)
{
        CString title="Печать формы";
    CBaseOleWordFrame* child = new CBaseOleWordFrame( true, NULL, title, hInst, 0, "WordOle");
    
    CCreateContext mContext;
    BOOL sucs = false;

    CXContainerWordDoc* doc = new CXContainerWordDoc(child, &sucs, report, RtfTemplate, TRUE);

    mContext.m_pNewViewClass    = RUNTIME_CLASS(CXContainerWordView);
    mContext.m_pCurrentDoc      = doc;
    mContext.m_pNewDocTemplate  = NULL;
    mContext.m_pLastView        = NULL;
    mContext.m_pCurrentFrame    = NULL;
    
    child->Create(NULL, title, WS_OVERLAPPEDWINDOW | WS_CHILD, 
        CFrameWnd::rectDefault, NULL, &mContext);

    child->InitialUpdateFrame( doc, TRUE );
    
    if (sucs) 
        return child;
    else
        return NULL;
}


В классе CXContainerWordView происходит запуск и обработка всего документа в сервере автоматизации (так же как и в этой http://support.microsoft.com/kb/238611/en-us ссылке).
Если нужен еще какой-то код я отпишу.
Re[6]: как получить фрейм обьекта CDialog
del