Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];

Вниз

Зачем нужен DefWindowProcW, если есть DefWindowProcA?   Найти похожие ветки 

 
Пробегал...   (2008-02-08 20:34) [0]

ну и собственно сабж.


 
ketmar ©   (2008-02-08 20:39) [1]

затем, чтобы ты не читал MSDN, а задавал тут идиотские вопросы.

---
Understanding is not required. Only obedience.


 
Черный Шаман   (2008-02-08 20:43) [2]

Ты что студент, дальтоник, W от A отличить не можешь?


 
Пробегал...   (2008-02-08 20:52) [3]

ketmar ©   (08.02.08 20:39) [1]
DefWindowProcW,


а в MSDN даже как-то не различают эти функции: http://msdn2.microsoft.com/en-us/library/ms633572(vs.85).aspx

И уж там точно не написано почему существует две реализации W и A этой функции


 
Пробегал...   (2008-02-08 20:52) [4]

Черный Шаман   (08.02.08 20:43) [2]

а тебе до этого вопроса еще расти надо. Не говоря уже до ответа на него.


 
ketmar ©   (2008-02-08 20:54) [5]

>[3] Пробегал… (2008-02-08 20:52:00)
я за тебя, что ли, буду конкретное место искать? я злой, мне за пивом идти лень.

дам хинт: CreateWindowEx тоже в двух вариантах есть. к чему бы это? а также ещё офигенное количество функций есть в A и W. зачем бы? ответь на два эти вопроса — и всё станет ясно.

---
Understanding is not required. Only obedience.


 
ketmar ©   (2008-02-08 20:56) [6]

и ещё полухинт: WM_CHAR, например. который несколько в разном виде поступает в A и W. но это станет очевидно, когда ответишь на два вопроса.

---
Understanding is not required. Only obedience.


 
Черный Шаман   (2008-02-08 20:56) [7]


> Пробегал...   (08.02.08 20:52) [4]
>
> Черный Шаман   (08.02.08 20:43) [2]
>
> а тебе до этого вопроса еще расти надо. Не говоря уже до
> ответа на него.


В message посылаемому окну(в параметрах) может быть указатель на строку, она может быть как и ansi так и unicode.


 
Пробегал...   (2008-02-08 20:58) [8]

видимо, есть какие-то сообщения, wpr/lpr которых содержит указатель на структуры со строками... У меня больше предположений нет.

Но в какой кодировке посылать сообщения главной функции окна? Получается так что ли: если окно зарегистрировано с помощью RegisterClassW - то посылаются строки Wide, а если RegisterClassA - то строки Ansi?


 
ketmar ©   (2008-02-08 21:00) [9]

>[8] Пробегал… (2008-02-08 20:58:00)
если окно твоё — то ты знаешь. если чужое — магия поработает.

на самом деле ньюансов больше. если тебе просто для общего развития — то хватит и этого. а если надо для чего-то серьёзного, то направление поиска дано.

---
Understanding is not required. Only obedience.


 
Пробегал...   (2008-02-08 21:01) [10]

ketmar ©   (08.02.08 20:54) [5]
а также ещё офигенное количество функций есть в A и W


ууу, ты про это. Значит, ты все таки не понял. Понятно, что на каждую A функцию есть W, но во все эти функции НЕПОСРЕДСТВЕННО передается строки, у них принимаемые параметры разные. Одни принимают Ansi, а другие Wide.

У DefWindowProc же принимаемые параметры АБСОЛЮТНО одинаковые, меня это удивило. А не наличие вообще Wide версий функций ;))))

В принципе, SendMessage тоже есть в версии W, думаю моя догадка в [8] верная.


 
Пробегал...   (2008-02-08 21:08) [11]

Черный Шаман   (08.02.08 20:56) [7]
В message посылаемому окну(в параметрах) может быть указатель на строку, она может быть как и ansi так и unicode.


ну да. А вот как она догадывается в какой кодировке слать сообщения главной функции окна?

И самое даже главное - если это сообщение принять в потоке при выборке - как догадаться в какой она кодировке?


 
ketmar ©   (2008-02-08 21:10) [12]

>[10] Пробегал… (2008-02-08 21:01:00)
нет, это ты не понял. точнее, не пожелал читать мои ответы полностью. хозяин-барин, а я уже всё сказал.

---
Understanding is not required. Only obedience.


 
KilkennyCat ©   (2008-02-08 21:10) [13]

Еще есть понятие совместимости.


 
Черный Шаман   (2008-02-08 21:14) [14]


> Пробегал...   (08.02.08 21:08) [11]
>
> Черный Шаман   (08.02.08 20:56) [7]
> В message посылаемому окну(в параметрах) может быть указатель
> на строку, она может быть как и ansi так и unicode.
>
> ну да. А вот как она догадывается в какой кодировке слать
> сообщения главной функции окна?


Оно после посылки должно конвертироваться в кодировку с которой функция зарегистрирована. Ansi чудесно перегоняется в Wide и Wide с потерями перегоняется в Ansi.

Хотя с этим шаманством - со строками передаваемыми в сообщениях я особо дела не имел.


 
Пробегал...   (2008-02-08 21:21) [15]

ketmar ©   (08.02.08 21:10) [12]
нет, это ты не понял. точнее, не пожелал читать мои ответы полностью. хозяин-барин, а я уже всё сказал


понятно. Свободен ;)

KilkennyCat ©   (08.02.08 21:10) [13]
Еще есть понятие совместимости


супер грамотный комментарий ;)

Черный Шаман   (08.02.08 21:14) [14]
Оно после посылки должно конвертироваться в кодировку с которой функция зарегистрирована


ты хотел сказать - в кодировку с каким окно зарегистрировано? Допустим. Я это же предполагаю.

Но если извлечь это сообщение из GetMessage - как определить кодировку? Логично, чтобы кодировка содержалась где-нибудь в параметрах. Но если бы было так - не нужно было бы две версии DefWindowProc.

Значит, судя по всему, извлекя сообщение в потоке по GetMessage кодировку точно никак не определишь.


 
Игорь Шевченко ©   (2008-02-08 21:22) [16]


> Зачем нужен DefWindowProcW, если есть DefWindowProcA?


Если ты задумаешься о том, как работает SetWindowText, например, вызываемый из DefWindowProc в ответ на сообщение WM_SETTEXT, то ответ тебе будет очевиден.


 
KilkennyCat ©   (2008-02-08 21:26) [17]

> [15] Пробегал...   (08.02.08 21:21)
>
> KilkennyCat ©   (08.02.08 21:10) [13]
> Еще есть понятие совместимости
>
> супер грамотный комментарий ;)


для суперглупых могу и разжевать.


 
Пробегал...   (2008-02-08 21:27) [18]

Игорь Шевченко ©   (08.02.08 21:22) [16]
Если ты задумаешься о том, как работает SetWindowText, например, вызываемый из DefWindowProc в ответ на сообщение WM_SETTEXT, то ответ тебе будет очевиден


ооо... Вот сразу видно профи, сразу понял о чем речь ;) Да, именно над этим я и задумался. Просто нелогично как-то:

WM_SETTEXT  
wParam = 0;                     // not used; must be zero
lParam = (LPARAM)(LPCTSTR)lpsz; // address of window-text string


почему wparam not used? Ведь очень логично было бы там хранить кодировку. Тогда бы DefWindowProc сама бы разобралась с кодировкой.

Впрочем, видимо, все сделано так, потому что сделано имено так ;)


 
Пробегал...   (2008-02-08 21:30) [19]

KilkennyCat ©   (08.02.08 21:26) [17]
для суперглупых могу и разжевать.


да уж не напрягайтесь ;) Советую даже не напрягаться вообще на форуме.

Суперглупо - действительно считать, что такой комментарий может чем-то помочь вопрошающему.


 
ketmar ©   (2008-02-08 21:35) [20]

Удалено модератором


 
Пробегал...   (2008-02-08 21:41) [21]

Удалено модератором


 
ketmar ©   (2008-02-08 21:44) [22]

Удалено модератором


 
Пробегал...   (2008-02-08 21:44) [23]

Игорь Шевченко ©   (08.02.08 21:22) [16]
Если ты задумаешься о том, как работает SetWindowText, например, вызываемый из DefWindowProc в ответ на сообщение WM_SETTEXT


так. Игорь Шевченко меня сбил с толку. Неправильно написано.

Как может SetWindowText вызываться в ответ на WM_SETTEXT, если в справке написано, что SetWindowText приводит к посылке сообщения WM_SETTEXT. Рекурсия какая-то.


 
Пробегал...   (2008-02-08 21:48) [24]

Удалено модератором


 
ketmar ©   (2008-02-08 21:49) [25]

Удалено модератором


 
ketmar ©   (2008-02-08 21:51) [26]

Удалено модератором


 
Игорь Шевченко ©   (2008-02-08 21:58) [27]

Пробегал...   (08.02.08 21:27) [18]


> почему wparam not used? Ведь очень логично было бы там хранить
> кодировку. Тогда бы DefWindowProc сама бы разобралась с
> кодировкой.


потому что он не использовался в Windows 3.1

Хорошо, возьмем WM_GETTEXT, там wParam используется. Для кодировки места не остается


 
Игорь Шевченко ©   (2008-02-08 22:05) [28]

Пробегал...   (08.02.08 21:44) [23]

Ну InternalSetWindowText - какая разница. Главное, ты понял, что я имею в виду - то, что у сообщения есть строковые параметры, кодировка которых определяется тем, какие функции были вызваны для их посылки и обработки (A или W)


 
Пробегал...   (2008-02-08 22:16) [29]

Игорь Шевченко ©   (08.02.08 21:58) [27]

ну в принципе логично, наследие тянется издалека...

А я правильно предположил, что если окно зарегистрировано RegisterClassA - то и все сообщения текстовые ему будут в ANSI перекодироваться, а если с помощью RegisterClassW - то соответственно unicode?

А я бы тогда ошибся. Потому что регистрирую я под NT с помощью RegisterClassW, а внутри по привычке вызывал просто DefWindowProc - и главное ведь полное соответствие параметров и соответственно никаких предупреждений.


 
KilkennyCat ©   (2008-02-08 22:18) [30]

Удалено модератором


 
Пробегал...   (2008-02-08 22:18) [31]

и еще интересно, по какому алгоритму винда преобразует ansi в unicode? Наверное, в соответствии с локалью потока, но с локалью потока, где вызывается send/post-message или там где оно принимается?


 
guav ©   (2008-02-08 22:22) [32]

На самом деле всё немного более запутано, некоторые сообщения, например LVN_GETDISPINFO, имеют различные коды для A и W версий, и в Wide оконную процедуру может попасть Ansi сообщение и наоборот.


 
Игорь Шевченко ©   (2008-02-08 23:04) [33]


> и еще интересно, по какому алгоритму винда преобразует ansi
> в unicode


MultiByteToWideChar и WideCharToMultiByte, в качестве кодовой страницы выступает константа CP_ACP

Сообщения будут преобразоваться перед их обработкой - то есть, перед тем, как будет вызвана та оконная процедура, которая их обрабатывает  (и после обработки, если сообщение имеет выходные параметры типа строки)


> А я правильно предположил, что если окно зарегистрировано
> RegisterClassA - то и все сообщения текстовые ему будут
> в ANSI перекодироваться, а если с помощью RegisterClassW
> - то соответственно unicode?


Все зависит еще от того, как было создано окно (CreateWindowExA, CreateWindowExW).
Например, если ты создаешь окно от класса Edit вызовом CreateWindowExA (как делается в VCL), то все сообщения, обрабатываемые оконной процедурой VCL, приходят в Ansi-кодировке, а необработанные перекодируются в unicode внутри вызова DefWindowProcA в момент вызова оригинальной процедуры оконного класса Edit


 
Сатир   (2008-02-09 14:52) [34]


> Зачем нужен DefWindowProcW, если есть DefWindowProcA?

для поддержки Unicode
W- unicode
A- ansi

Вычитал у Рихтера:)


 
ketmar ©   (2008-02-09 15:01) [35]

>[34] Сатир (2008-02-09 14:52:00)
там интересных вещей больше, на самом деле. %-)
я когда-то ковырялся, мог бы рассказать, если бы кое-кто не полез в анал. а так — лениво вспоминать.

---
Understanding is not required. Only obedience.


 
Сатир   (2008-02-09 15:03) [36]


> там интересных вещей больше, на самом деле. %-)

согласен, но сам особо не вникал, поскольку писать на винапи не было нужды.
но для общего развития тоже ничего, в смысле, книжка Рихтера ничего.


 
ketmar ©   (2008-02-09 15:08) [37]

>[36] Сатир (2008-02-09 15:03:00)
>книжка Рихтера ничего

фигасе «ничего»… O_o

---
Understanding is not required. Only obedience.


 
Сатир   (2008-02-09 15:10) [38]


> фигасе «ничего»… O_o

ладно-ладно, зачётная книжка, сдаюсь:)

сейчас по дотнету Рихтера читаю, тоже интересно.


 
begin...end ©   (2008-02-09 15:17) [39]

У меня, типа, оффтопик... А что за интересная тенденция смены ников? Семёнычи тут всякие, Пробегающие...


 
KilkennyCat ©   (2008-02-09 15:23) [40]

> begin...end ©   (09.02.08 15:17)

а это в целях безопасности. вдруг, глупость сморозят.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.009 c
15-1202820631
Ega23
2008-02-12 15:50
2008.03.23
Коллеги, нужна помощь в тестировании программы.


15-1202629339
@!!ex
2008-02-10 10:42
2008.03.23
Редактирование видео


6-1183210878
Kor
2007-06-30 17:41
2008.03.23
Обмен данными через Dial-up модем.


2-1203502618
Ultimate
2008-02-20 13:16
2008.03.23
Возможно вовсе глупо звучит... но...


11-1186121703
BMouradov
2007-08-03 10:15
2008.03.23
Поворот изображений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский