Я только начал использовать GDI +, и будет довольно много конверсий.
Текст, который я рисую, появляется на долю секунды как набор случайных символов. Я проследил проблему до конверсий.
Код обновлен внизу
const wchar_t* convert::stringToWideChar(string String) {
wstring wideString;
for(int i = 0; i < String.length(); i++)
wideString += wchar_t( String[i] );
return wideString.c_str();
}
Используется в качестве:
testing = "Two Two";
const wchar_t* buf = convert::stringToWideChar(testing);
path.AddString(buf, wcslen(buf), &gFontFamily, FontStyleBold, 72, ptOrg, &strFormat);
Фон — то, как текст первоначально нарисован. «Уровень 0» — это то, что должно быть изначально нарисовано. (На скриншоте исходный текст выцветает как следует.)
Есть идеи, чтобы сделать преобразование быстрее? (Самое странное, что это происходит только со случайными конкретными строками, то есть «Два» работает, «Два Два», не «Два Тоо», делает.
обновленный
wstring convert::stringToWideChar(string String) {
wstring wideString;
for(int i = 0; i < String.length(); i++)
wideString += wchar_t(String[i] );
return wideString;
}
Используется в качестве:
const wchar_t* buf = convert::stringToWideChar("leveljjj").c_str();
Re: ваш обновленный код;
Существует разница в времени жизни между автоматической и временной переменными.
Автоматическая переменная объявляется в функции и будет сохраняться до конца области видимости.
Временное будет сохраняться только до конца выражения, частью которого оно является.
Пример;
testing = "Two Two";
const wchar_t* buf = convert::stringToWideChar("leveljjj").c_str();
path.AddString(buf, wcslen(buf), &gFontFamily, FontStyleBold, 72, ptOrg, &strFormat);
В этом случае строка, возвращаемая из stringToWideChar, является временной. Он сохраняется только до завершения выражения, частью которого он является, то есть до тех пор, пока строка назначения не будет завершена. Он будет уничтожен до строки path.AddString.
Если вы, с другой стороны, сделали это;
testing = "Two Two";
std::wstring value = convert::stringToWideChar("leveljjj");
const wchar_t* buf = value.c_str();
path.AddString(buf, wcslen(buf), &gFontFamily, FontStyleBold, 72, ptOrg, &strFormat);
…Значение — это автоматическая переменная, которая сохраняется до конца области видимости. Это означает, что безопасно использовать возвращенный буфер, поскольку переменная все еще допустима для строки AddString.
В вашем обновленном коде ваш вызов c_str () вернет указатель на временный объект (rvalue), который уничтожается через точку с запятой.
Вам нужно что-то вроде этого:
void stringToWideChar(string String, char* destination) {
wstring wideString;
for(int i = 0; i < String.length(); i++)
wideString += wchar_t(String[i] );
memcpy(destination, wideString.c_str(), strlen(wideString.c_str));
}
Убедитесь, что вы предварительно распределили ваш buf, заполните его 0 (чтобы получить 0 терминацию) и т. Д.
Если вы измените функцию преобразования, чтобы она возвращала wstring, это удалит в вашем коде висячую ссылку.