Как заметил Кубби в одном из комментариев, 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, вы будете необходимо изменить это на соответствующую кодировку, которую вы используете:
Сам 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
, поэтому вам следует убедиться, что вы не подписываетесь на одно и то же событие несколько раз:
HtmlDocument
может содержать более одного Frame/IFrame
, и каждый Frame
может иметь свой собственный HtmlDocument
; IFrames
наверняка есть по одному. Обратитесь к примечаниям в этом вопросе для получения дополнительной информации по этому вопросу:
Пример:
[ 111]