Использование web-интерфейса в MFC-приложениях
От: Александр Шилоносов Молдова  
Дата: 25.03.04 19:32
Оценка: 100 (3) -1
Статья:
Использование web-интерфейса в MFC-приложениях
Автор(ы): Александр Шилоносов
Дата: 19.09.2004
Cтатья описывает способы использования MFC-класса CHtmlView и технологии DHTML для создания web-интерфейса в MFC приложении.


Авторы:
Александр Шилоносов

Аннотация:
Cтатья описывает способы использования MFC-класса CHtmlView и технологии DHTML для создания web-интерфейса в MFC приложении.
Re: Использование web-интерфейса в MFC-приложениях
От: Nikolaz Германия www.nikeware.com
Дата: 23.09.04 03:43
Оценка:
Здравствуйте, Александр Шилоносов, Вы писали:

АШ>Статья:



АШ>Авторы:

АШ> Александр Шилоносов

АШ>Аннотация:

АШ>Cтатья описывает способы использования MFC-класса CHtmlView и технологии DHTML для создания web-интерфейса в MFC приложении.

В дополнение расскажу как мы реализовывали в CHtmlView аналог DoDataExchange механизма (как альтернатива использования OnBeforeNavigate2 в том контексте, в каком он описан в данной статье). Мы использовали переопределение интерфейса external у объекта window. Использовали Advanced Hosting Interfaces для его переопределения. Фактически external был сделан в WebBrowser именно для подобных целей. Например у IE через него можно работать с фаворитами (метод AddFavorites у external). Дополнительно есть еще несколько методов, специфичных для IE, именно IE, а не для WebBrowser. Нужно понимать эту разницу, потому как IE есть приложение, используещее WebBrowser для одной единственной задачи — броузинг в интернет. Я бы даже переименовал WebBrowser контрол как-нибудь по другому, чтобы не возникало путаницы между IE и WebBrowser. Задача ведь WebBrowser состоит всего лишь(!) в скачивании html страниц с некоторого адреса и их отображения, а уж под каким "соусом" они преподносятся — это дело того приложения, которое его использует, буть то IE, Norton Antivirus или ваше приложение.

В нашем случае, когда мы создаем свое приложение, используя WebBrowser, мы можем переопределить свойство window.external. Задача external — возвращать некий dispInterface. Для DoDataExchange мы поступили следующим образом. Создали на базе класса CCmdTarget обьект с поддержкой Automation (CCmdTarget::EnableAutomation()). В классе определили dispatch map (DECLARE_DISPATCH_MAP()) с некоторым набором методов (один из них был UpdateData(BOOL bUpdate)). Через Advanced Hosting Interfaces по запросу WebBrowser мы отдавали ему указатель на наш обьект CCmdTarget — m_pCmdTarget->GetIDispatch(TRUE). Т.е. когда в скрипте встречалась строка window.external.<что-то>, происходил доступ к нашему CCmdTarget based объекту со стороны HTML. Например, по нажатию кнопки Ok на html странице мы вызывали window.external.UpdateData(true). Сам UpdateData в CCmdTarget based классе просто вызывал стандартный UpdateData у CHtmlView. Таким образом мы просто задействовали стандартный подход, который реализован в MFC. Осталось только "разобраться" с самим DoDataExchange у нашего CHtmlView. Были написаны DDX_* аналоги для работы со стандартными HTML объектами (edit'ы, combobox'ы и тому подобными). Вместо числовых ID_ значений мы использовали строковые аналоги, типа "1005", "password_field" (где password_field был как id у edit на html странице — <edit id="password_field" ... ). Вообщем получили стандартный DoDataExchange механизм. Замечу, что писалось это несколько лет тому назад, когда еще не было MFC 7.0. Как потом обнаружилось, в седьмой версии нечто очень похожее было реальзовано.

Развивая эту механику, мы реализовали в нашей системе доступ к объектной модели проекта. Теперь все объекты в MFC приложении были доступны и из HTML, и как оказалось, было потом написано достаточно много логики приложения именно с использованием JScript (код имплементации выглядел намного проще и был выигрыш в сроках реализации).

Подытожу. Идея external в том, чтобы дать разработчику шлюз между HTML и неким внешним кодом, который использует WebBrowser (для нас это С++) и реализовывать свои методы и свойства со своими параметрами, а не использовать OnBeforeNavigate2, передавая параметры через navigate

Спасибо за внимание,
Николай Египко
Re: Использование web-интерфейса в MFC-приложениях
От: nevermind  
Дата: 04.12.04 15:44
Оценка:
хорошая статья. особенно впечатлили вызовы скриптов с передачей параметров — классно!

кстати, есть довольно простой способ убрать рамку activex'a — вызывать функцию setwindowrgn() для его окна, передав ей регион размерами на 1-2 пиксел меньше, чем у окна
Re: Использование web-интерфейса в MFC-приложениях
От: Аноним  
Дата: 12.07.07 07:03
Оценка:
Здравствуйте, Александр Шилоносов.

Вот у меня есть пару комментариев по поводу
HTML -> MFC -> HTML
Из Вашей статьи следует, что перегрузив OnBefforeNavigate2 можно получить данные, а вызовом JavaScript можно передать данные обратно в HTML.
Модель очень красивая но:

допустим приложение в OnBefforeNavigate2, получив указание, запустило поток для расчета чего либо и завершила свою деятельность,
функция OnDocumentComplite, при этом, не была вызвана так мы отменили навигацию.
Когда поток завершит свою задачу, он должен вызвать JavaScript (чтобы уведомить HTML), но не сможет этого сделать т.к. документ не загружен
QueryInterface() вернет ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.