Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Использование CDHtmlDialog


Автор: S.A.P. 18.10.2004, 09:54
Недавно узнал о существовании класса CDHtmlDialog, и решил, что он как нельзя лучше подходит для интерфейса моей будущей программы :) .
Но вопрос вот в чем: можно ли (а если да, то как) програмно сгенерировать HTML текст (пусть он, скажем, будет храниться в CStringList), а потом привязать его к моему объекту класса CDHtmlDialog, вместо привязывания HTML из ресурса, что стоит по умолчанию?
Но это еще не все :) . Как потом привязать обработчики событий к динамически сгенерированным контроллам? Обработчики должны быть на C++, а не на Java Script.
:sample

Автор: S.A.P. 18.10.2004, 21:17
Ну че никто не знает что ли? :(

Народ! Выручайте!

Автор: S.A.P. 1.11.2004, 22:45
Ссори, подниму последний раз. А вдруг ответят :( .

Автор: Step 2.11.2004, 11:41
Цитата(Perchilla @ 18.10.2004, 09:54)

можно ли (а если да, то как) програмно сгенерировать HTML текст

думаю можно. к сожелению сейчас нету МСДН под рукой... ищите....


Цитата(Perchilla @ 18.10.2004, 09:54)

Как потом привязать обработчики событий к динамически сгенерированным контроллам? Обработчики должны быть на C++, а не на Java Script.

я подозреваю что вам нужно просто обрабатывать вм_сомманд и там проверять мессаки от контролов, а вернее ид контрола и ид мессаги

Автор: S.A.P. 2.11.2004, 20:10
Цитата(Step @ 2.11.2004, 11:41)

думаю можно. к сожелению сейчас нету МСДН под рукой... ищите....

Есть MSDN. Там документ представляется в виде каких - то SAFEARRAY, а я что то разобраться не могу как они работают.

Автор: Coocky 2.11.2004, 22:14
Через неделю будет топик.Жди :) У меня по программе обучения только начинается Интернет :)

Автор: S.A.P. 2.11.2004, 22:52
Coocky постарайся как можно быстрее. Буду очень благодарен :thumbs-up .

Автор: Coocky 2.11.2004, 22:56
Цитата
Coocky постарайся как можно быстрее. Буду очень благодарен

Как в Академии учат,так и могу :)
В чем ,конретно загвоздка?

Автор: S.A.P. 2.11.2004, 23:03
Цитата(Coocky @ 2.11.2004, 22:56)

В чем ,конретно загвоздка?

Суть загвоздки, собственно в вопросе. Буду дико благодарен за пример, который привязывает HTML текст из какого - нибудь контейнера типа CStringList к диалогу и обрабатывает событие от какого - нибудь элемента.

Автор: Coocky 2.11.2004, 23:16
Цитата
Буду дико благодарен за пример, который привязывает HTML текст из какого - нибудь контейнера типа CStringList к диалогу и обрабатывает событие от какого - нибудь элемента.

Завтра прогу похожую скину.Может подойдет.Расмотришь через компилятор.Ок?Хотя мало че поймешью.
Программированию под Инет посвящены книги.

Автор: Gorbatovsky 3.11.2004, 21:07
Я недавно использовал класс class CHtmlView

Код


FILE *fil=fopen(file_name,"w+r");
   if(fil==NULL){
 Message_err("Problem to open file !");
 return FALSE;
 }
DesignTask->WriteHtmlFile(fil);

///////забрасываем файл в вид для просмотра печати
if(view)
 view->Navigate2(_T(file_name),NULL,NULL);



таким образом я пишу в файл содержимое страницы, а потом его читаю.
Для обработки данных введеных пользователем тебе нужно парсить содержимое CHtmlView

Автор: S.A.P. 3.11.2004, 21:19
Ну это то понятно. Таким же макаром можно и с DHTMLDialog это провернуть: записать в файл, а потом привязать. Но мне не очень хочется, чтобы документ был доступен через HTM файл во время работы программы :(
Цитата(Gorbatovsky @ 3.11.2004, 21:07)

парсить содержимое CHtmlView

вот это слово мне не очень нравится :( . Т.е. ты хочешь сказать, что я не могу напрямую привязать сишный код к HTML объекту, скажем по его ID, устанавливаемом в HTML тексте?

Автор: Gorbatovsky 3.11.2004, 22:14
Я ведь использовал CHtmlView, поэтому и ипользовал парсинг.
В классе CDHtmlDialog, наверное, можно получать события и получить доступ к к элементам интерфейса странички. Год назад я на эту тему делал опрос (на этом форуме) , но никто не подсказал ничего кроме парсинга. Но время не стоит на месте. Меня эта тема тоже интересует. Очень интересная мысль в своих целях использовать CHtmlView и CDHtmlDialog. Открывается много возможностей...

Автор: S.A.P. 3.11.2004, 23:09
:offtopic
Цитата(Gorbatovsky @ 3.11.2004, 22:14)

Открывается много возможностей...

вот я тоже так подумал. Если использовать в своих программах гибкость DHTML (в качестве интерфейса), то программирование интерфейса перестает быть головной болью, как считалось раньше по отношению к VC++ . :hmmm

Автор: Texel 3.12.2004, 11:08
Люди, мне тоже очень интересна эта тема, за это время вы нашли её решение?

Автор: alien_by 3.12.2004, 12:45
Господа, есть в этом диалоге метод Navigate, позволяет переместится на любой урл!!!.
Что касается связывания элементов диалога, для этого есть куча DDX-ов, которые можно использовать примерно так
Код

// Пишем универсальный контроллер обмена данными
void CMyDHtmlDlg::DoDataExchange(CDataExchange* pDX)
{
CDHtmlDialog::DoDataExchange(pDX);
for( для всех элементов нового диалога, которым это нужно)
  DDX_DHtml_ElementInnerText(pDX, массив названий элементов[..], *(массив указателей на переменные[..]));
// Аналогично для других типов связывания
}

// Переопределяем метод OnNavigateComplete, вызываемый после
// удачного выполнения Navigate
void CMyDHtmlDlg::OnNavigateComplete(
  LPDISPATCH pDisp,
  LPCTSTR szUrl
)
{
   // здесь заполняем массивы названий элементов
   // массивы указателей на переменные для связывания

   // Указываем системе обновить данные о структуре динамического связывания
   UpdateData(false);
}


Понятно, что данный способ, не очень удобен, так как нужно знать для каких элементов какие свойства модифицировать. Поэтому есть другой способ.
В том-же классе, существует набор методов типа GetElementProperty/SetElementProperty и аналогичные им.
Используя эти методы можно выполнять любой обмен данными.

Что касается приёма сообщений от обьектов.
Можно описать универсальную карту сообщений.

Существует всего 5 различных типов сообщений от документа
DHTML_EVENT(dispid, elemName, memberFxn)
Если параметр elemName установлен в NULL, то обработчик будет реагировать на любое сообщение данного типа/подтипа приходящее от документа.

DHTML_EVENT_CLASS(dispid, elemName, memberFxn)
Параметр elemName задаёт CSS класс к которому отностися элемент (т.е. тоже группирует элементы)

DHTML_EVENT_TAG(dispid, elemName, memberFxn)
Соответственно группирует элементы по тэгу

DHTML_EVENT_ELEMENT(dispid, elemName, memberFxn)
выбирает элемент по идентификатору

DHTML_EVENT_AXCONTROL(dispid, controlName, memberFxn)
то-же что и DHTML_EVENT_ELEMENT но для Active-X контролов

У них имеются подтипы.. Подтип задаётся параметром dispid.
Приведу пример.

Код

// описываем карту сообщений
BEGIN_DHTML_EVENT_MAP(CMyDHtmlDlg)
DHTML_EVENT(DISPID_HTMLELEMENTEVENTS_ONCLICK, NULL, OnDocElementClick)
END_DHTML_EVENT_MAP()

HRESULT CMyDHtmlDlg::OnDocElementClick(IHTMLElement *phtmlElement)
{
  IHTMLEventObj *eventObj = NULL;
  // Данная функция позволяет уточнить параметры сообщения, но в принципе
  // можно и без неё...
  if ( !FAILED(GetEvent(&eventObj)) )
  {
    // Выполняем некие действия
  }

  return S_OK
}


Это один из способов придания динамики с помощью стандартных инструментов. Есть ещё одна возможность, но здесь нужно провести некоторые исследования, на них у меня к сожалению, нет времени.

Вообщем идея в следующем, любой обмен данными или сообщениями осуществляется через некий недокументированный механизм базирующийся на наборе классов основанных на CDHtmlSinkHandler и IDispatch. Ежели у кого руки дойдут до него, поделитесь плз.

Автор: Texel 4.12.2004, 17:52
У меня тут вопросы возникли относительно класса CMyDHtmlDlg. Кто-нибудь занет как его прикрутить к MFC SDI приложению? с использованием разделения окна сплитами? Например в одном окне TreeView а вдругом CMyDHtmlDlg. А то я начал роазбираться производные от сласса CDialog не "вставляются" в SDI. Там есть только классы FormView и HtmlView(этот не подходит).
Или подскажите как это организовать на ATL, если такое возможно...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)