+ Ответить в теме
Страница 1 из 2
1 2 ПоследняяПоследняя
Показано с 1 по 10 из 14

Тема: Не допонял WM_UNICHAR

  1. #1
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию Не допонял WM_UNICHAR

    Код :
    1. Если wParam - UNICODE_NOCHAR и приложение обрабатывает это сообщение, тогда возвращается значение ИСТИНА (TRUE). Функция DefWindowProc возвратит значение ЛОЖЬ (FALSE) (значение по умолчанию).
    2.  
    3. Если wParam - не UNICODE_NOCHAR, возвращается значение ЛОЖЬ (FALSE).  Функция DefWindowProc (Unicode) помещает  сообщение WM_CHAR  с теми же самыми параметрами, а функция DefWindowProc (ANSI) помещает или одно или два сообщения WM_CHAR  соответствующее символу (ам) ANSI.
    Что надо вернуть и когда? Что такое UNICODE_NOCHAR?
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,082
    Вес репутации
    21

    По умолчанию Re: Не допонял WM_UNICHAR

    Здесь очень подробно всё описано.

    Не рекомендую читать автоматический перевод статьи на русский язык, так как там легко закрадываются ошибки, которые порой ставят всё с ног на голову. Например, в приведённом куске текста вместо "возвращает значение ИСТИНА" должно быть по смыслу "следует вернуть значение ИСТИНА". Речь идёт о твоей WindowProc.
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

  4. #3
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию Re: Не допонял WM_UNICHAR

    Так что вернуть то? И что такое UNICODE_NOCHAR?
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

  5. #4
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,082
    Вес репутации
    21

    По умолчанию Re: Не допонял WM_UNICHAR

    Ты статью-то прочёл? Я должен прочесть и пересказать, что ли? Там это всё описано.
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

  6. #5
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию Re: Не допонял WM_UNICHAR

    И где же там хоть слово про то, что такое UNICODE_NOCHAR? И про возврат только какие то непонятные true и false, а ведь оконная процедура возвращает не bool.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

  7. #6
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,082
    Вес репутации
    21

    По умолчанию Re: Не допонял WM_UNICHAR

    Цитата Сообщение от Сионист Посмотреть сообщение
    И где же там хоть слово про то, что такое UNICODE_NOCHAR?
    Плохо читал. Там об этом есть.

    Цитата Сообщение от Сионист Посмотреть сообщение
    И про возврат только какие то непонятные true и false, а ведь оконная процедура возвращает не bool.
    Вот, что написано о том, что возвращает WindowProc:
    Return value

    Type:
    Type: LRESULT

    The return value is the result of the message processing and depends on the message sent.
    Ещё вопросы имеются?
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

  8. #7
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию

    Цитата Сообщение от Romeo Посмотреть сообщение
    Вот, что написано о том, что возвращает WindowProc:

    Ещё вопросы имеются?
    И?????????????

    Плохо читал. Там об этом есть.
    Ровно 3 места:
    The WM_UNICHAR message can be used by an application to post input to other windows. This message contains the character code of the key that was pressed. (Test whether a target app can process WM_UNICHAR messages by sending the message with wParam set to UNICODE_NOCHAR.)
    ,
    If wParam is UNICODE_NOCHAR and the application processes this message, then return TRUE. The DefWindowProc function will return FALSE (the default).
    и
    If wParam is not UNICODE_NOCHAR, return FALSE. The Unicode DefWindowProc posts a WM_CHAR message with the same parameters and the ANSI DefWindowProc function posts either one or two WM_CHAR messages with the corresponding ANSI character(s).
    . Больше UNICODE_NOCHAR не нашёл даже огнелис.
    Последний раз редактировалось Romeo; 16.12.2015 в 09:09.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

  9. #8
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,082
    Вес репутации
    21

    По умолчанию Re: Не допонял WM_UNICHAR

    Ладно. Видимо придётся разжевать.

    Заметь, я ни разу не слышал про это сообщение до того, как ты создал эту тему. Таким образом мы были с тобой в абсолютно равных условиях на старте. Однако по какой-то неизвестной причине, прочитав статью на MSDN, я всё понял, а ты не понял ничего. Выводы делай сам...

    Пункт №1. Что возвращает WindowProc? Оконная процедура возвращает LRESULT, и в документации (выжимку из которой я вставлял выше) написано, что (перевожу) "Возвращаемое значение - это результат обработки сообщения и зависит от этого сообщения". То есть, разные сообщения могут возвращать разные по смыслу значения и операционная система, зная какое сообщение она передала в WindowProc, будет правильным образом реагировать на них. Конкретно в случае сообщения WM_UNICHAR, возвращаемое значение является типом BOOL и может состоять лишь из двух вариантов - TRUE или FALSE. Очень надеюсь, что эта часть понятна, так как понимание второго пункта зависит от понимания первого.

    Пункт №2. Как же правильно обрабатывать сообщение WM_UNICHAR и что такое UNICODE_NOCHAR? Дело в том, что операционная система на каждый нажатый уникодный символ генерирует два сообщения WM_UNICHAR. В первом она как бы спрашивает, хочет ли приложение обрабатывать уникодный символ, а во втором собственно присылает этот уникодный символ (если первый раз WindowProc отреагировала утвердительно). Если бы тебе нужно было реализовать такую функциональность, ты бы как это сделал? По-моему выход один и он очевиден - передавать специальный флажок, чтобы различать эти два вызова. Так мы приходим к ответу на вопрос, что такое UNICODE_NOCHAR. Это просто флажок. Если он взведён, значит ОС не прислала нам ещё символа (отсюда название дефайна), а просто спрашивает нас, хотим ли мы обработать уникодный символ. Если мы возвращаем FALSE (точно так же как это делает DefWindowProc), тогда второе сообщение WM_UNICHAR даже не будет сгенерировано. Если же мы вернули TRUE, значит ОС сгенерирует второй раз сообщение WM_UNICHAR, но на этот раз уже без флажка UNICODE_NOCHAR. Вместо флажка wParam будет содержать сам уникодный символ. После его обработки мы обязаны вернуть FALSE (это тоже указано в статье).

    Помимо того, что я прочитал указанную выше коротенькую документашку на MSDN, я ещё погуглил, что интересного пишут в интернетах об этом сообщении. Набрёл на вот такую достаточно занятную статью. В ней вольный исследователь пишет, что не смог добиться от Windows чтобы она вообще присылала это сообщение и рекомендует завязываться не на WM_UNICHAR, а на WM_CHAR, убедившись, что окно было создано уникодным (использовалась CreateWindowW). Очень рекомендую принять эти данные к сведению.

    Напоследок хочу в очередной раз подчеркнуть, что для того, чтобы осознать всё вышесказанное не нужно быть семи пядей во лбу или потратить неделю на исследования. Достаточно просто здравого смысла и ключевых навыков по поиску в интернете нужной информации. Оба умения обязаны быть у каждого программиста, иначе он в принципе не имеет права себя считать программистом...
    Последний раз редактировалось Romeo; 16.12.2015 в 17:06.
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

  10. #9
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию

    "Возвращаемое значение - это результат обработки сообщения и зависит от этого сообщения".
    Ага. А свойства вещества определяется его составом и строением молекулы. Всю школу не мог этот закон запомнить, а получилось только к третьему курсу именно потому, что он не добавляет ни какой новой информации, а от химического закона, да ещё с репутацией великого, с которого якобы началась химия, ожидается хоть какая то осмысленность. Также и эта фраза про возвращаемое значение.
    Конкретно в случае сообщения WM_UNICHAR, возвращаемое значение является типом BOOL и может состоять лишь из двух вариантов - TRUE или FALSE. Очень надеюсь, что эта часть понятна, так как понимание второго пункта зависит от понимания первого.
    Оно же LRESULT. И вдруг true и false. Не понятно.

    В ней вольный исследователь пишет, что не смог добиться от Windows чтобы она вообще присылала это сообщение и рекомендует завязываться не на WM_UNICHAR, а на WM_CHAR, убедившись, что окно было создано уникодным (использовалась CreateWindowW). Очень рекомендую принять эти данные к сведению.
    Ну я то добился быстро, кстати, даже на винде врядли есть хоть что то ещё примитивней, даже само создание окна как такового и то сложней. Ключ к решению у Петзолдта:
    Сообщения порождают сообщения.
    .
    Последний раз редактировалось Romeo; 17.12.2015 в 09:02.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

  11. #10
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    38
    Сообщений
    1,213
    Вес репутации
    17

    По умолчанию Re: Не допонял WM_UNICHAR

    А свойства вещества определяется его составом и строением молекулы. Всю школу не мог этот закон запомнить именно потому, что он не добавляет ни какой новой информации
    А вот определение нуля можешь рассказать? Какую новую информацию оно дает?
    2B OR NOT(2B) = FF

+ Ответить в теме
Страница 1 из 2
1 2 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения