Преобразование строки
От: Moxie  
Дата: 11.09.07 19:21
Оценка:
Есть контрол 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());
  //...

  // если NT
  if (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;
}
Re: Преобразование строки
От: Sashaka Россия  
Дата: 11.09.07 19:34
Оценка:
ипользуйте TCHAR
Re: Преобразование строки
От: Sashaka Россия  
Дата: 11.09.07 19:44
Оценка: 1 (1)
для конвертации:
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");
Re: Преобразование строки
От: Кодт Россия  
Дата: 12.09.07 06:57
Оценка:
Здравствуйте, Moxie, Вы писали:

Если коротко,

— полностью переведи всё, что связано с 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); обе расчитывают на свои экземпляры. Как поступить в этом случае?
Re[3]: Преобразование строки
От: Кодт Россия  
Дата: 12.09.07 10:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А что тогда делать со структурами 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 )))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.