Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

Зачем нужен 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.016 c
2-1203953995
rebroff
2008-02-25 18:39
2008.03.23
Команда MS-DOS


2-1203705791
Eero
2008-02-22 21:43
2008.03.23
Как передать неявно созданный объект в процедуру?


4-1178650355
Strate
2007-05-08 22:52
2008.03.23
Опять ListView, изменение колонки.


4-1185701082
emfs
2007-07-29 13:24
2008.03.23
размеры рабочего стола


15-1202789867
Slider007
2008-02-12 07:17
2008.03.23
С днем рождения ! 12 февраля 2008 вторник