Есть контрол SysHeader32. Для вставки элемента существует структура HDITEMA и HDITEMW (для wide-char). Как правильно написать процедуру вставки нового элемента колонки в виде, приведенным ниже.
код примерный. весь вопрос в преобразовании к wide-char.
LONG AddColumn(const std::string& strText) {
LRESULT ret;
//...
HDITEMA oHItem;
oHItem.pszText = const_cast<char*>(strText.c_str());
//...
// если NTif (m_bIsNt)
{
//...
HDITEMW oHItemW;
oHItemW.pszText = // ??? как сконвертировать правильно ???
//...
ret = SendMessageW(m_hWnd, HDM_INSERTITEMW,0,(LPARAM)&oHItemW);
}
else ret = SendMessage(m_hWnd, HDM_INSERTITEM,0,(LPARAM)&oHItem);
return ret;
}
для конвертации:
WideCharToMultiByte
MultiByteToWideChar
а вот еще у Рихтера:
Microsoft ввела в семейство функций printf своей С-библиотеки дополнительные типы полей, часть из которых не поддерживается в ANSI C. Они позволяют легко сравнивать и смешивать символы и строки с разной кодировкой. Также расширена функция wsprintf операционной системы. Вот несколько примеров (обратите внимание на использование буквы s в верхнем и нижнем регистре):
char szA[100]; // строковый буфер в ANSI
WCHAR szW[100]; // строковый буфер в Unicode
// обычный вызов sprintf: все строки в ANSI
sprintf(szA, "%s", "ANSI Str");
// преобразуем строку из Unicode в ANSI
sprintf(szA, "%S", L"Unicode Str");
// обычный вызов swprintf. все строки в Unicode
swprintf(szW, L"%s", L"Unicode Str");
// преобразуем строку из ANSI в Unicode
swprintf(szW, L"%S", "ANSI Str");
— полностью переведи всё, что связано с UI, на TCHAR. Соответственно, будет
typedef std::basic_string<TCHAR> tstring;
.....
LONG AddColumn(const tstring& strText);
(или используй MFC/ATL CString)
— воспользуйся макросами A2W, A2T и т.п.
— либо вручную переводи строки — mbstowc, MultiByteToWideChar, printf (хотя последнее — извращение какое-то)
Да, а писать код вида
if(m_bIsNT) { ..... }
это как-то очень, очень странно. Мне кажется, проще прицепить Unicows для выполнения твоей юникодной программы на win95, чем делать универсальную программу, в рантайме выбирающую, чем же ей воспользоваться.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Преобразование строки
От:
Аноним
Дата:
12.09.07 08:54
Оценка:
Здравствуйте, Кодт, Вы писали:
К>это как-то очень, очень странно. Мне кажется, проще прицепить Unicows для выполнения твоей юникодной программы на win95, чем делать универсальную программу, в рантайме выбирающую, чем же ей воспользоваться.
А что тогда делать со структурами HDITEMA и HDITEMW, ведь SendMessageW(m_hWnd, HDM_INSERTITEMW,0,(LPARAM)&oHItemW) и SendMessage(m_hWnd, HDM_INSERTITEM,0,(LPARAM)&oHItem); обе расчитывают на свои экземпляры. Как поступить в этом случае?
Здравствуйте, <Аноним>, Вы писали:
А>А что тогда делать со структурами HDITEMA и HDITEMW, ведь SendMessageW(m_hWnd, HDM_INSERTITEMW,0,(LPARAM)&oHItemW) и SendMessage(m_hWnd, HDM_INSERTITEM,0,(LPARAM)&oHItem); обе расчитывают на свои экземпляры. Как поступить в этом случае?
Послать нафиг HDITEMA и HDM_INSERTITEMA вообще. Пользуйся только юникодом. Или обобщённым tchar'овым — HDITEM, HDM_INSERTITEM.
Или ты имеешь дело с каким-то рукописным окном, которое симулирует штатный виндовский Header Control, причём симулирует неправильно? — раз приходится и A-, и W-версии тащить.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: Преобразование строки
От:
Аноним
Дата:
12.09.07 11:15
Оценка:
Здравствуйте, Кодт, Вы писали: К>Послать нафиг HDITEMA и HDM_INSERTITEMA вообще. Пользуйся только юникодом. Или обобщённым tchar'овым — HDITEM, HDM_INSERTITEM.
Хорошо, попробую оставить обобщенный HITEM с TCHAR, надеюсь заработает на Win9x с Unicows. А если нет, то в топку эту Win9x, оставлю тока Unicode )))