WTL: Аналог MFC-шного CDHtmlDialog
От: stone Канада  
Дата: 10.12.03 12:29
Оценка: 6 (2)
Некоторое время назад я переделал MFC-шный класс под WTL,
может, кому пригодится.
Вот пример использования моего класса:
#include "../wtl_gui/HtmlDialogImpl.h"

class CAboutDlg: public CHtmlDialogImpl<CAboutDlg>
{
public:
    CString    m_sText;

public:
    CAboutDlg(): CHtmlDialogImpl<CAboutDlg>(IDR_HTML_ABOUT, CRect(0, 0, 293, 200))
    {
    }
public:
    BEGIN_MSG_MAP(CAboutDlg)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        COMMAND_ID_HANDLER(IDOK, OnCloseCmd)
        COMMAND_ID_HANDLER(IDCANCEL, OnCloseCmd)
        CHAIN_MSG_MAP(CHtmlDialogImpl<CAboutDlg>)
    END_MSG_MAP()

    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        CHtmlDialogImpl<CAboutDlg>::OnInitDialog(uMsg, wParam, lParam, bHandled);

        // Не показываем скроллбары и 3dborder
        SetHostFlags(DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_SCROLL_NO);

        // Показывать картинки независимо от настроек IE
        SetDlControlFlags(DLCTL_DLIMAGES);

        return TRUE;
    }

    LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
    {
        EndDialog(wID);
        return 0;
    }

public:
    BEGIN_DHTML_DDX_MAP(CAboutDlg)
        DDX_DHtml_ElementValue(_T("txtText"), m_sText)
    END_DHTML_DDX_MAP()

    BEGIN_DHTML_EVENT_MAP(CAboutDlg)
        DHTML_EVENT_ONCLICK(_T("lnkCheckUpdate"), OnCheckUpdate)
        DHTML_EVENT_ELEMENT(DISPID_HTMLELEMENTEVENTS_ONCLICK, _T("btnBrowse"), OnBrowse)
    END_DHTML_EVENT_MAP()


    HRESULT OnBrowse(IHTMLElement *phtmlElement)
    {
        DoDataExchange(TRUE);
        MessageBox(m_sText);
        return S_OK;
    }

    HRESULT  OnCheckUpdate(IHTMLElement *phtmlElement)
    {
        return S_FALSE;
    }

//-----------------------------------------------------------------------------
//    overridables

    STDMETHODIMP ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved)
    {
        // Здесь можно вывести своё контекстное меню
        return S_OK;
    }

};


Пример страницы (записана как HTML ресурс IDR_HTML_ABOUT):

<html>>
    <body>>
     <A id="lnkCheckUpdate" href="about:blank" accesskey="U">Check Update</A>
     <br>>
     <input type="text" id="txtText" value="Text"/>
     <br>>
     <input type="button" id="btnBrowse" value="Browse"/>
    </body>
</html>
S>


Код класса можно взять здесь
Любые замечания приветствуются, но сильно не пинайте
--
Алексей
Re[2]: WTL: Аналог MFC-шного CDHtmlDialog
От: stone Канада  
Дата: 21.11.08 00:16
Оценка: 1 (1)
Здравствуйте, Tee Moore, Вы писали:

TM>Очень заинтересовало, но ссылка битая,

TM> можно выложить еще раз?

Теперь должно лежать здесь.
Если вдруг не откроется, напиши, я вышлю мылом.
Re: WTL: Аналог MFC-шного CDHtmlDialog
От: Tee Moore  
Дата: 20.11.08 16:36
Оценка: +1
Здравствуйте, stone, Вы писали:

S>Некоторое время назад я переделал MFC-шный класс под WTL,

S>может, кому пригодится.

Очень заинтересовало, но ссылка битая,
можно выложить еще раз?
Re[3]: WTL: Аналог MFC-шного CDHtmlDialog
От: Tee Moore  
Дата: 22.11.08 15:20
Оценка:
Здравствуйте, Алексей
У меня вылетают всякие сообщения, толком запустить не удается.
Может у меня не та студия или ВТЛ стоит?
Пробую на VS 2003,WTL 8, винда XP SP3,
Ругается на строку 173 и 175 в файле HtmlDialogImpl.h:
ATL::InlineIsEqualGUID(riid, *pdiid) — говорит InlineIsEqualGUID не принадлежит ATL.
Убрал ATL:: — проглотила, но теперь при загрузке вылетает предупреждение
в файле atlcom.h ,
в функции inline HRESULT CComTypeInfoHolder::GetTI(LCID lcid),
в строке ATLASSERT(!InlineIsEqualGUID(*m_plibid, GUID_NULL) && "Did you forget to pass the LIBID to CComModule::Init?");
Если пропустить это ругательство мимо ушей, то приложение все таки запускается.
Где я накосячил?

А еще у меня немного философский вопрос — зачем нужен HTMLayout когда есть CHtmlDialog?
Re[4]: WTL: Аналог MFC-шного CDHtmlDialog
От: Tee Moore  
Дата: 24.11.08 06:24
Оценка:
TM>в строке ATLASSERT(!InlineIsEqualGUID(*m_plibid, GUID_NULL) && "Did you forget to pass the LIBID to CComModule::Init?");

Разрешилось заменой строки:
hRes = _Module.Init(NULL, hInstance); //в _tWinMain
на такое:
GUID guid;
hRes = _Module.Init(NULL, hInstance, &guid);

если кому будет интересно bug in ATL 7.0/7.1
Re[5]: WTL: Аналог MFC-шного CDHtmlDialog
От: stone Канада  
Дата: 26.11.08 05:36
Оценка:
Здравствуйте, Tee Moore, Вы писали:

TM>Разрешилось заменой строки:

TM> hRes = _Module.Init(NULL, hInstance); //в _tWinMain
TM>на такое:
TM> GUID guid;
TM> hRes = _Module.Init(NULL, hInstance, &guid);

Спасибо за труд! Этот код был написан где-то в 2002-2003 годах, под VC++ 6/ATL 3.0. С тех пор с WTL я не работал, и, подозреваю, там многое что изменилось . Так что, к моему сожалению, вряд ли смогу посоветовать что-то дельное сейчас.
Re[4]: WTL: Аналог MFC-шного CDHtmlDialog
От: Nikolaz Германия www.nikeware.com
Дата: 28.11.08 21:32
Оценка:
Здравствуйте, Tee Moore, Вы писали:

TM>А еще у меня немного философский вопрос — зачем нужен HTMLayout когда есть CHtmlDialog?

Странный вопрос
Если философски подходить, то "затягивает" HTMLayout, просто жуть
А если в деталях, то мне он дал следующее:
1) css там такой, что движку IE и не снилось пока такое к сожалению. То, что я делал через одно "место" в IE для получения необходимого поведения, в HTMLayout на порядки проще и нагляднее;
2) скорость работы просто космическая. Я давече переписал на HTMLayout один наш довольно сложный GUI, построенный на движке IE. Переписывать пришлось по причине того, что форма достаточно сложна и JScript пополам со сложной разметкой, просто уже еле-еле "шевилился";
3) интеграция HTMLayout с собственным кодом более "тесная", нежели пресловутый external в IE;

Посмотрите внимательно примеры от HTMLayout, там много интересного.

Как пример для разминки, попробуйте сделать на IE движке html верску комбобокса, в выпадающем списке которого, есть например три закладки (tab-control) со списком options в каждой. Плюс до кучи еще каких-нибудь элементов. В примерах HTMLayout есть например комбобокс, в выпадающем списке которого таблица Менделеева сверстана. IE "отдыхает" вообщем ... Да и тяжел он для достаточно простых приложений, где красивый GUI нужен. В этом смысле COM здесь в минус.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.