Гобелен - кликните для возврата на главную
Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.
Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Жладимира Вольфовича Жириновского.
Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.
Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.
Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!
Предположим что у меня в CWebBrowser загружена некоторая страница у которой есть некоторый элемент при клике по которому требуется чтобы были выполнены некоторые действия, например пусть Label1 будет присвоен какой то текст. Как это сделать? Взаимодействие между страницей в TWebBrowser и кодом C++ Builder 6
Для обработки кликов по элементам веб-страницы и выполнения действий в приложении (например, изменения Label1->Caption) нужно:
Добавьте обработчик клика в ваш HTML-элемент:
<button onclick="window.external.OnButtonClick('параметр')">Нажми меня</button>
Создайте класс для обработки событий:
// В заголовочном файле (например, WebBrowserEventHandler.h)
class TWebBrowserEventHandler : public TObject, public IDispatch
{
public:
// IDispatch methods
STDMETHOD(GetTypeInfoCount)(unsigned int* pctinfo) { return E_NOTIMPL; }
STDMETHOD(GetTypeInfo)(unsigned int iTInfo, LCID lcid, ITypeInfo** ppTInfo) { return E_NOTIMPL; }
STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, unsigned int cNames, LCID lcid, DISPID* rgDispId)
{
if (cNames == 1 && wcscmp(rgszNames[0], L"OnButtonClick") == 0)
{
*rgDispId = 1;
return S_OK;
}
return DISP_E_UNKNOWNNAME;
}
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, unsigned int* puArgErr)
{
if (dispIdMember == 1) // OnButtonClick
{
if (pDispParams->cArgs > 0 && pDispParams->rgvarg[0].vt == VT_BSTR)
{
WideString param = pDispParams->rgvarg[0].bstrVal;
Form1->Label1->Caption = "Получен параметр: " + param;
}
return S_OK;
}
return DISP_E_MEMBERNOTFOUND;
}
// IUnknown methods
STDMETHOD_(ULONG, AddRef)() { return 1; }
STDMETHOD_(ULONG, Release)() { return 1; }
STDMETHOD(QueryInterface)(REFIID riid, void** ppv)
{
if (riid == IID_IDispatch || riid == IID_IUnknown)
{
*ppv = static_cast<IDispatch*>(this);
return S_OK;
}
return E_NOINTERFACE;
}
};
// В Unit1.cpp
TWebBrowserEventHandler* handler;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
handler = new TWebBrowserEventHandler();
CppWebBrowser1->RegisterAsBrowser = true;
// Получаем интерфейс документа
IWebBrowser2* wb = CppWebBrowser1->DefaultInterface;
IDispatchPtr docDispatch = wb->GetDocument();
// Устанавливаем наш обработчик
IDispatchEx* docEx;
if (docDispatch->QueryInterface(IID_IDispatchEx, (void**)&docEx) == S_OK)
{
docEx->SetPropertyByName(L"external", (VARIANT*)&handler);
docEx->Release();
}
}
Если предыдущий метод сложен, можно использовать более простой подход.
<button onclick="window.external.SetLabelText('Новый текст')">Обновить Label</button>
// Объявите в классе формы:
TComObjectFactory* factory;
// В FormCreate:
factory = new TComObjectFactory(CLSID_NULL, __classid(TForm1), "", "",
OLEMISC_SIMPLEFRAME|OLEMISC_ACTSLIKELABEL,
tmApartment);
// Добавьте метод в класс формы:
STDMETHODIMP TForm1::SetLabelText(BSTR text)
{
Label1->Caption = WideString(text);
return S_OK;
}
Используйте Navigate с javascript:
// В обработчике события нажатия кнопки:
CppWebBrowser1->Navigate("javascript:window.external.SetLabelText('Текст')");
Для работы window.external необходимо установить RegisterAsBrowser = true.
В IE6 могут быть ограничения безопасности - убедитесь что страница загружена из доверенной зоны.
Для сложных взаимодействий лучше использовать IOleCommandTarget интерфейс.
Выберите подход в зависимости от сложности вашей задачи. Первый вариант наиболее универсален, последний - самый простой для быстрой реализации.
Вы так же можете прочитать следующие статьи: