Получение координат щелчка мыши в документе WebBrowser

Как заметил Кубби в одном из комментариев, std::wstring_convert (C ++ 11) обеспечивает простое простое решение (вам нужно #include и ):

wstring string_to_convert;

//setup converter
using convert_type = std::codecvt_utf8;
std::wstring_convert converter;

//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
std::string converted_str = converter.to_bytes( string_to_convert );

Я использовал комбинацию wcstombs и утомительное выделение / освобождение памяти, прежде чем я натолкнулся на это.

http://en.cppreference.com/w/cpp/locale / wstring_convert

update (2013.11.28)

Один лайнер может быть указан так (спасибо Guss за ваш комментарий):

std::wstring str = std::wstring_convert>().from_bytes("some string");

Функции Wrapper могут быть указаны следующим образом: (Спасибо ArmanSchwarz за ваш комментарий)

wstring s2ws(const std::string& str)
{
    using convert_typeX = std::codecvt_utf8;
    std::wstring_convert converterX;

    return converterX.from_bytes(str);
}

string ws2s(const std::wstring& wstr)
{
    using convert_typeX = std::codecvt_utf8;
    std::wstring_convert converterX;

    return converterX.to_bytes(wstr);
}

Примечание: есть некоторые разногласия относительно того, следует ли передавать string / wstring в функции как ссылки или как литералы (из-за обновлений C ++ 11 и компилятора). Я оставлю это решение для человека, но его стоит знать.

Примечание. Я использую std::codecvt_utf8 в приведенном выше коде, но если вы не используете UTF-8, вы будете необходимо изменить это на соответствующую кодировку, которую вы используете:

http://en.cppreference.com/w/cpp/header/codecvt

1
задан Jimi 17 January 2019 в 10:36
поделиться

1 ответ

Сам WebBrowser не предоставляет координаты щелчка мышью: вы фактически не щелкаете по клиентской области Control, а щелкаете по содержимому документа.

Вы можете использовать события HtmlDocument.Click или HtmlDocument.MouseDown для получения координат указателя мыши в инициализированных HtmlDocument [ 1118].

Примечание :
Объект
HtmlElementEventArgs возвращает координаты мыши в обеих абсолютных координатах (всей области документа) в e. ClientMousePosition и относительно нажатой HtmlElement, в e.OffsetMousePosition .

Это может быть сложно, потому что вам нужно подписаться на событие Click, когда текущий HtmlDocument уже создан: вы не можете подписаться на событие объекта Document по умолчанию:
, т.е. подписка на событие в Form.Load с:

webBrowser1.Document.Click += (obj, evt) => { /*Do something */ };  

ничего не добьется. Событие никогда не будет инициировано: Document null, поэтому, конечно, это не ссылка на какой-либо текущий / активный HtmlDocument.

HtmlDocument готово, когда возникает событие WebBrowser.DocumentCompleted и для его ReadyState установлено значение WebBrowserReadyState.Complete .

Вы можете подписаться на событие Document.Click, когда документ полностью загружен, а затем удалить событие, прежде чем веб-браузер перейдет на новую страницу, создав новый документ.

Кроме того, событие DocumentCompleted может быть вызвано несколько раз для одной страницы HTML, поэтому вам следует убедиться, что вы не подписываетесь на одно и то же событие несколько раз:

[1137 ] Примечание :
A HtmlDocument может содержать более одного Frame/IFrame , и каждый Frame может иметь свой собственный HtmlDocument; IFrames наверняка есть по одному. Обратитесь к примечаниям в этом вопросе для получения дополнительной информации по этому вопросу:
Как получить значение HtmlElement внутри Frames / IFrames?

Пример:

[ 111]
0
ответ дан Jimi 17 January 2019 в 10:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: