Доброго времени суток! Пишу GUI на MASM/RadAsm, уперся в проблему с юникодом, вроде все сделал как положено. StaticBox, EditBox, ComboBox почему-то не отображают юникод (остальные контролы поддерживают). В чем может быть ошибка? Вообще перечисленные контролы винды поддерживают юникод? Заранее спасибо!
Каким кодом созданы эти контрольные окна? Если всё создано динамически, то существует CreateWindowExA и CreateWindowExW. Если через шаблон диалога, то существует DialogBoxParamA и DialogBoxParamW. То, что создано с буквой А не будет поддерживать UNICODE.
invoke SendMessageW,[control_created_with_A],WM_GETTEXT,[x],[y] выдает в некоторых контролах(от которых все зависит) юникод-текст.
Главное окно создано динамический через CreateDialogParamW, сами контролы создаются статический через конструктор RadAsm. Текст в контролы я ставлю через SendDlgItemMessageW. Название окна и кнопки выводятся в юникоде, а все остальное в ascii. Возможно контролы окна имеет смысл создавать тоже динамически?
Создаю StaticBox: Код (Text): invoke CreateWindowExW,WS_EX_CLIENTEDGE, ADDR StaticClass,NULL,\ WS_CHILD or WS_VISIBLE or ES_LEFT,\ 50,35,200,25,hWnd,1010,hInstance,NULL Он не создается, GetLastError выдает ошибку 1406, тем не менее CreateWindowEx (ascii) контрол создается, но естественно юникод не арбайтен( Быть может у кого-нибудь есть рабочий семпл юникодового окна с контролами на масме?
alexparser Вам доставляет удовольствие длительное ожидание ответов? Если нет, то почему бы не приложить полный компилируемый проект RadAsm? Кофейная гуща нынче в дефиците.
alexparser Эм... предполагается, что насыщать ошибками проект будет отвечающий? Где юникод-то не отображается? В несуществующем Edit? P.S. Если добавить в ресурсы Edit с идентификатором 199, то текст в нём отображается верно.
l_inc У Вас очевидно винда с русским системным яз., чтобы узнать истину - региональные установки нужно изменить(!) Да, и в этом тоже есть проблема, CreateWindowExW - не создает статикбокс (вовсе не эдит!) Если же юзать CreateWindowEx, то контрол создается, но он не юникодовый. Эдит в ресурсы добавлял - юникода нет!
alexparser А почему стиль ES_LEFT, а не SS_LEFT (хотя оба нулевые, так что можно ни тот, ни другой не указывать)? Ну да ладно: дело было вечером... я просто не заметил этого вызова. Как верно сказал AsmGuru62, функции, работающие с юникодом, должны принимать все строковые параметры в юникоде. Включая StaticClass и ClassName (хотя смысла в регистрации этого класса в упор не вижу). Помимо прочего для того, чтобы диалог правильно отображал юникод, ему нужно выставить поддерживающий его шрифт (свойство диалога Font вместо MS Sans Serif выставить в Courier New, Tahoma и т.п.). И флаг DS_SETFONT не помешает.
Ув. AsmGuru62 & l_inc, спасибо! Вопрос по прежнему не решился, внес все изменения в проект, теперь нарисовался StaticBox, уже хорошо. Но юникод в StaticBox-e так и не появился, и фонты переменял, и как только не извращался, ну никак не выводится это счастье. Чего этой заразе еще может не хватать? Благодарю!
alexparser Дык... о чём говорили-то. Вы же шрифт для диалога установили. Ну так сделайте уже Static частью диалога в ресурсах. Тогда нормально отображаться будет. Но если лёгкие пути не для Вас, то следующим образом можно выставить шрифт для динамически созданного контрола: Код (Text): HDC hDC = GetWindowDC(NULL); LOGFONT lFont; lFont.lfHeight = 12*GetDeviceCaps(hDC,LOGPIXELSY)/72; ReleaseDC(NULL, hDC); lFont.lfWidth = lFont.lfEscapement = lFont.lfOrientation = 0; lFont.lfWeight = FW_NORMAL; lFont.lfItalic = lFont.lfUnderline = lFont.lfStrikeOut = FALSE; lFont.lfCharSet = DEFAULT_CHARSET; lFont.lfOutPrecision = OUT_DEFAULT_PRECIS; lFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; lFont.lfQuality = ANTIALIASED_QUALITY; lFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; _tcscpy(lFont.lfFaceName,TEXT("Times New Roman")); SendDlgItemMessage(hDlg,199,WM_SETFONT,(WPARAM)CreateFontIndirect(&lFont),FALSE); Большую часть параметров структуры можно заполнить, очевидно, статически, как инициализированные данные. Кроме того, на правах замечания... Если текст содержит только символы из нижней части ASCII-таблицы, то можно объявлять текстовые константы в юникоде в таком виде: StaticClass dw 'S','t','a','t','i','c',0, вместо динамического преобразования. Кроме того в масме вроде есть более удобные макросы для этого... Хотя фасм однозначно в этом (и всех остальных ) отношении удобнее.