Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.107.90] |
|
Сообщ.
#1
,
|
|
|
Вопрос в том как отобразить в статиках греческие символы.
Вот код, которым я вывожу текст в статик char str[][256] = {"0","1","2","3"}; for (i=0; i<4; i++) { hwnd[i+1] = CreateWindowEx(0, WC_STATIC, NULL, dwstylelabel, 0, 24*i, 100, 20, hwnd[0], (HMENU) (1001 + i), hinstance, NULL); } //... for (i=0; i<4; i++) { SetDlgItemText(hwnd[0], 1001+i, str[i]); } Вод код который выводит греческие символы, HFONT hfont; HDC hdc; char symbol[2]; symbol[0] = 'a'; // что-бы вывести букву альфа symbol[1] = 0; //... hfont = CreateFont(15, 7, 0, 0, FW_NORMAL, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Symbol")); hdc = GetDC(hwnd[i+1]); SetBkMode(hdc, TRANSPARENT); SelectObject(hdc, hfont); TextOut(hdc, 0, 0, symbol, (INT) strlen(symbol)); ReleaseDC(hwnd[i+1], hdc); DeleteObject(hfont); Однако это как-бы рисование и немного не подходит. Потому что, если делать свое рисование, то нужно полностью рисовать во всех статиках а их у меня массив и получается невыгодно - из-за пары греческих букв переписывать рисование всем статикам. Нарисовать на форме тоже не подходит - кроме этого есть еще рисунки и если рисовать еще на форме все начинает рябить. Смотрю в сторону использования символов юникода. В итоге вопрос: Как отобразить в статиках греческие символы с помощью юникода ? |
Сообщ.
#2
,
|
|
|
Да просто использовать wchar_t заместо char'а и вызывать (если надо) TextOutW.
Добавлено Ну и SetDlgItemTextW, само собой. |
Сообщ.
#3
,
|
|
|
Заменил char на wchar_t
Было: char str[][256] = {"0","1","2","3"}; Стало: wchar_t str[][256] = {"0","1","2","3"}; Ругается error C2440: 'initializing' : cannot convert from 'const char [2]' to 'wchar_t' This conversion requires a reinterpret_cast, a C-style cast or function-style cast |
Сообщ.
#4
,
|
|
|
Цитата Mr.Brooks @ В итоге вопрос: Как отобразить в статиках греческие символы с помощью юникода ? Попробовать так: Пуск->Программы->Стандартные->Служебные->Таблица символов. Поищи в нужном фонте нужный символ. Скопируй от туда и вставь в строку своей программы (или выясни, какой у него двоичный код и вставь в свою программу кодом) Как-то так: const TCHAR* pStr = _T("0123 αδθλμ 3210"); |
Сообщ.
#5
,
|
|
|
Цитата Mr.Brooks @ Ругается error C2440: 'initializing' : cannot convert from 'const char [2]' to 'wchar_t' This conversion requires a reinterpret_cast, a C-style cast or function-style cast Поставь перед строкой префикс L - L"0", L"1".... Тогда статические строки будут в юникоде. И, судя по всему, у тебя проект скомпилирован в ascii. Лучше установи в свойствах проекта Use Unicode Character Set, либо вызывай SetDlgItemTextW |
Сообщ.
#6
,
|
|
|
Попробовал поставить
const TCHAR* pStr = _T("0123 αδθλμ 3210"); или префикс L -> не понимает. Изменил в свойствах проекта Use Unicode Character Set -> понял, и выдал 180 ошибок типа: Form.cpp(83) : error C2664: 'AppendMenuW' : cannot convert parameter 4 from 'const char [4]' to 'LPCWSTR' Form.cpp(609) : error C2664: 'UnregisterClassW' : cannot convert parameter 1 from 'char [256]' to 'LPCWSTR' ... Что-то мне не очень хочется переписывать весь проект ради двух-трех символов. (в конце концов можно написать alfa, beta, gamma - в немецкой программе такое видел) Трудоемкость это пол-беды, главное что получается код менее читаемый, когда перед каждыми "" эти L напичканы. Вывод : Хомуты - этот юникод. Лучше попробовать по-другому. Думаю изменить шрифт нужных статиков на "Symbol". //hfont = (HFONT) GetStockObject(DEFAULT_GUI_FONT); // <- это заменил hfont = CreateFont(15, 7, 0, 0, FW_NORMAL, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Symbol")); // <- на это for (i=0; i<e::hwndubound; i++) { SendMessage(e::hwnd[i], WM_SETFONT, (WPARAM) hfont, NULL); } ... но к сожалению не помогло. Вопрос SetDlgItemText() вообще может ли вывести текст другим шрифтом ? |
Сообщ.
#7
,
|
|
|
Эта функция вообще текст не выводит, а просто засылает его контролу. А сам контрол конечно может выводить всяческими установленными шрифтами!
|
Сообщ.
#8
,
|
|
|
Сообщ.
#9
,
|
|
|
Я как-то так делал:
::SendMessageW( edit, WM_SETFONT, (WPARAM)myFont12, TRUE); ::SendMessageW( edit, EM_LIMITTEXT, 16, 0); |
Сообщ.
#10
,
|
|
|
А можно как-то в прекомпиляции менять целые строки? (пусть посимвольно и склеивая...)
Т.е. символы я бы так мог менять: #define GREKI(qq) (wchar_t(945+qq-'a')) // 945-код альфы А вот как поменять целую строчку: "proba" чтобы скомпилилось со строкой L"προβα" ? |
Сообщ.
#11
,
|
|
|
Цитата Mr.Brooks @ Попробовал поставить const TCHAR* pStr = _T("0123 αδθλμ 3210"); или префикс L -> не понимает. Вероятно, ты не использовал #include <tchar.h> Это надо делать потому, что ты используешь "CreateWindowEx", "CreateFont" и другие подобные вызовы. Дело в том, что этих функций не существует. Есть "CreateWindowExA" и "CreateWindowExW", "CreateFontA", "CreateFontW". Какая именно будет подставлена, зависит от настроек проекта ASCII/UNICODE. Чтобы для функций такого рода всегда подставлялись правильные параметры используются определения из файла tchar.h. (_T(), _TEXT(), _tcslen() вместо strlen() итд итп) Подобные мероприятия делают исходники "универсальными" - т.е. дают возможность собрать как ASCII так и UNICODE приложение без изменения исходных текстов. Скрытый текст Лучше всегда поступать таким образом, поскольку может оказаться, что сделанный исходник (или его часть) пригоден для частого использования и может быть помещён в библиотеку. А библиотеки перспективнее делать для разных параметров компиляции из одних исходников. Т.е. ASCII/UNICODE, x86/x64. Всего получается 4 штуки. CreateFont, например Цитата ... Header Wingdi.h (include Windows.h) Library Gdi32.lib DLL Gdi32.dll Unicode and ANSI names CreateFontW (Unicode) and CreateFontA (ANSI) ... |
Сообщ.
#12
,
|
|
|
Цитата Mr.Brooks @ const TCHAR* pStr = _T("0123 αδθλμ 3210"); или префикс L -> не понимает. Естественно, не понимает, потому что макросы TCHAR и _T у тебя раскрываются как ansi-строки, char и "" соответственно. Кроме и того, не забывай, что cpp-файл, в котором ты объявляешь эти строки сохраняется тоже в ansi, соответственно указать там напрямую греческие символы не получится. Попробуй сохранить/загрузить нужные строки из ресурсов, из string table, например при помощи CString::LoadString. |
Сообщ.
#13
,
|
|
|
Получилось. Сделал так:
1) добавил #include <tchar.h> 2) создаю статик с символом альфа hwndstatic = CreateWindowExW(0, WC_STATICW, L"\x03B1", dwstylelabel, 200, 40, 20, 20, hwnd, (HMENU) 1001, hinstance, NULL); Скрытый текст Все, конечно верно, UNICODE без сомнений перспективен, но что-то мне напряжно с этими вещами работать. Ну например я так и не смог добиться скопировать одну строку в другую с юникодовскими кодами, прошу прощения за каламбур. Было раньше в программе - все понятно глобальная строка из 256 символов копируется в локальную из 256 символов. потом строку выводим в статик, тоже все понятно. Все работает. namespace e { extern char globalstr[256]; } //... char str[256]; strcpy(str, e::globalstr); SetDlgItemText(hwnd, 1001, str); Теперь с юникодом. Искал аналог на strcpy() нашел похожую lstrcpy(), но и то после 2 часов жонглирования с _T() или TEXT() или L впереди или W позади а также LPTSTR, TCHAR, wchar_t и т.д. максимум что мне удалось это вывести в метку знак ?. Студия все время тужилась сохранить исходник в юникоде, когда я ставил в код символ - это понятно. Но мне не очень нравиться такая идея, поскольку я для некоторых вещей пользуюсь обычным блокнотом и мне это разнообразие кодировок текстовых документов не нужно. Так что сделал как выше указано в п1,2. Если у кого-нибудь есть желание черкатите пару строк как создав такое hwndstatic = CreateWindowExW(0, WC_STATICW, NULL, dwstylelabel, 200, 40, 20, 20, hwnd, (HMENU) 1001, hinstance, NULL); потом NULL(надпись) заменить на код L"\x03B1" и использовать SetDlgItemTextW для отображения на статике альфы. так для интереса, нет - так нет, у меня в принципе ... Вопрос решен. Всем спасибо. |
Сообщ.
#14
,
|
|
|
Цитата Mr.Brooks @ Ну например я так и не смог добиться скопировать одну строку в другую с юникодовскими кодами, прошу прощения за каламбур. Было раньше в программе - все понятно глобальная строка из 256 символов копируется в локальную из 256 символов. Искал аналог на strcpy() нашел похожую lstrcpy(), но и то после 2 часов жонглирования с _T() или TEXT() или L впереди или W позади Про это можно почитать тут. Постарайся найти .iso образ MSDN и тогда не всегда обязательно искать в Сети. Получишь справочник у себя на диске. |