Проблема с юникодом

Тема в разделе "WASM.BEGINNERS", создана пользователем alexparser, 24 апр 2010.

  1. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    Доброго времени суток!

    Пишу GUI на MASM/RadAsm, уперся в проблему с юникодом, вроде все сделал как положено.
    StaticBox, EditBox, ComboBox почему-то не отображают юникод (остальные контролы поддерживают).
    В чем может быть ошибка?
    Вообще перечисленные контролы винды поддерживают юникод?

    Заранее спасибо!
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Каким кодом созданы эти контрольные окна?

    Если всё создано динамически, то существует CreateWindowExA и CreateWindowExW.
    Если через шаблон диалога, то существует DialogBoxParamA и DialogBoxParamW.

    То, что создано с буквой А не будет поддерживать UNICODE.
     
  3. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    invoke SendMessageW,[control_created_with_A],WM_GETTEXT,[x],[y]
    выдает в некоторых контролах(от которых все зависит) юникод-текст.
     
  4. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    Главное окно создано динамический через CreateDialogParamW, сами контролы создаются статический через конструктор RadAsm.
    Текст в контролы я ставлю через SendDlgItemMessageW.
    Название окна и кнопки выводятся в юникоде, а все остальное в ascii.
    Возможно контролы окна имеет смысл создавать тоже динамически?
     
  5. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    Создаю StaticBox:
    Код (Text):
    1.         invoke CreateWindowExW,WS_EX_CLIENTEDGE, ADDR StaticClass,NULL,\
    2.                         WS_CHILD or WS_VISIBLE or ES_LEFT,\
    3.                         50,35,200,25,hWnd,1010,hInstance,NULL
    Он не создается, GetLastError выдает ошибку 1406, тем не менее CreateWindowEx (ascii) контрол создается, но естественно юникод не арбайтен(

    Быть может у кого-нибудь есть рабочий семпл юникодового окна с контролами на масме?
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    alexparser
    Вам доставляет удовольствие длительное ожидание ответов? Если нет, то почему бы не приложить полный компилируемый проект RadAsm? Кофейная гуща нынче в дефиците.
     
  7. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    Выкладываю проект.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    alexparser
    Эм... предполагается, что насыщать ошибками проект будет отвечающий? Где юникод-то не отображается? В несуществующем Edit?

    P.S. Если добавить в ресурсы Edit с идентификатором 199, то текст в нём отображается верно.
     
  9. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    l_inc
    У Вас очевидно винда с русским системным яз., чтобы узнать истину - региональные установки нужно изменить(!)
    Да, и в этом тоже есть проблема, CreateWindowExW - не создает статикбокс (вовсе не эдит!)
    Если же юзать CreateWindowEx, то контрол создается, но он не юникодовый.
    Эдит в ресурсы добавлял - юникода нет!
     
  10. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Код (Text):
    1. ADDR StaticClass
    Вот эта строка должна быть также UNICODE.
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    alexparser
    А почему стиль ES_LEFT, а не SS_LEFT (хотя оба нулевые, так что можно ни тот, ни другой не указывать)? :) Ну да ладно: дело было вечером... я просто не заметил этого вызова. :) Как верно сказал AsmGuru62, функции, работающие с юникодом, должны принимать все строковые параметры в юникоде. Включая StaticClass и ClassName (хотя смысла в регистрации этого класса в упор не вижу).
    Помимо прочего для того, чтобы диалог правильно отображал юникод, ему нужно выставить поддерживающий его шрифт (свойство диалога Font вместо MS Sans Serif выставить в Courier New, Tahoma и т.п.). И флаг DS_SETFONT не помешает.
     
  12. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    Ув. AsmGuru62 & l_inc, спасибо!

    Вопрос по прежнему не решился, внес все изменения в проект, теперь нарисовался StaticBox, уже хорошо.
    Но юникод в StaticBox-e так и не появился, и фонты переменял, и как только не извращался, ну никак не выводится это счастье.

    Чего этой заразе еще может не хватать?

    Благодарю!
     
  13. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    Да, на всякий, вот исходники.
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    alexparser
    Дык... о чём говорили-то. Вы же шрифт для диалога установили. Ну так сделайте уже Static частью диалога в ресурсах. Тогда нормально отображаться будет. Но если лёгкие пути не для Вас, то следующим образом можно выставить шрифт для динамически созданного контрола:
    Код (Text):
    1.     HDC hDC = GetWindowDC(NULL);
    2.     LOGFONT lFont;
    3.     lFont.lfHeight = 12*GetDeviceCaps(hDC,LOGPIXELSY)/72;
    4.     ReleaseDC(NULL, hDC);
    5.     lFont.lfWidth = lFont.lfEscapement = lFont.lfOrientation = 0;
    6.     lFont.lfWeight = FW_NORMAL;
    7.     lFont.lfItalic = lFont.lfUnderline = lFont.lfStrikeOut = FALSE;
    8.     lFont.lfCharSet = DEFAULT_CHARSET;
    9.     lFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
    10.     lFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    11.     lFont.lfQuality = ANTIALIASED_QUALITY;
    12.     lFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
    13.     _tcscpy(lFont.lfFaceName,TEXT("Times New Roman"));
    14.     SendDlgItemMessage(hDlg,199,WM_SETFONT,(WPARAM)CreateFontIndirect(&lFont),FALSE);
    Большую часть параметров структуры можно заполнить, очевидно, статически, как инициализированные данные.

    Кроме того, на правах замечания... Если текст содержит только символы из нижней части ASCII-таблицы, то можно объявлять текстовые константы в юникоде в таком виде: StaticClass dw 'S','t','a','t','i','c',0, вместо динамического преобразования. Кроме того в масме вроде есть более удобные макросы для этого... Хотя фасм однозначно в этом (и всех остальных :)) отношении удобнее.
     
  15. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    Мой респект l_inc!

    Теперь все стало на свои места)