Не допонял WM_UNICHAR

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Код: Выделить всё

Если wParam - UNICODE_NOCHAR и приложение обрабатывает это сообщение, тогда возвращается значение ИСТИНА (TRUE). Функция DefWindowProc возвратит значение ЛОЖЬ (FALSE) (значение по умолчанию).

Если wParam - не UNICODE_NOCHAR, возвращается значение ЛОЖЬ (FALSE).  Функция DefWindowProc (Unicode) помещает  сообщение WM_CHAR  с теми же самыми параметрами, а функция DefWindowProc (ANSI) помещает или одно или два сообщения WM_CHAR  соответствующее символу (ам) ANSI.
Что надо вернуть и когда? Что такое UNICODE_NOCHAR?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

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

Так что вернуть то? И что такое UNICODE_NOCHAR?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

И где же там хоть слово про то, что такое UNICODE_NOCHAR? И про возврат только какие то непонятные true и false, а ведь оконная процедура возвращает не bool.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):И где же там хоть слово про то, что такое 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

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 не нашёл даже огнелис.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Заметь, я ни разу не слышал про это сообщение до того, как ты создал эту тему. Таким образом мы были с тобой в абсолютно равных условиях на старте. Однако по какой-то неизвестной причине, прочитав статью на 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). Очень рекомендую принять эти данные к сведению.

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

"Возвращаемое значение - это результат обработки сообщения и зависит от этого сообщения".
Ага. А свойства вещества определяется его составом и строением молекулы. Всю школу не мог этот закон запомнить, а получилось только к третьему курсу именно потому, что он не добавляет ни какой новой информации, а от химического закона, да ещё с репутацией великого, с которого якобы началась химия, ожидается хоть какая то осмысленность. Также и эта фраза про возвращаемое значение.
Конкретно в случае сообщения WM_UNICHAR, возвращаемое значение является типом BOOL и может состоять лишь из двух вариантов - TRUE или FALSE. Очень надеюсь, что эта часть понятна, так как понимание второго пункта зависит от понимания первого.
Оно же LRESULT. И вдруг true и false. Не понятно.
В ней вольный исследователь пишет, что не смог добиться от Windows чтобы она вообще присылала это сообщение и рекомендует завязываться не на WM_UNICHAR, а на WM_CHAR, убедившись, что окно было создано уникодным (использовалась CreateWindowW). Очень рекомендую принять эти данные к сведению.
Ну я то добился быстро, кстати, даже на винде врядли есть хоть что то ещё примитивней, даже само создание окна как такового и то сложней. Ключ к решению у Петзолдта:
Сообщения порождают сообщения.
.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

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