![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| yngwie19 |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Всем привет. В книге Финогенова "WIN32 Основы программирования" дошел до раздела Макрос HANDLE_MSG после прочтения которого есть несколько вопросов:
1) Правильно Я понимаю, что использование данного макроса применяется лишь для того чтобы уменьшить структуру swtch-case в оконной процедуре? В принципе можно обходиться без него? 2) В книге дается пример макроса входящего в состав WINDOWSX.H:
2а) Это Я так понимаю общий вид макроса, который используется для всех сообщений. Так? Для сообщения WM_DESTROY он преобразуется в
2б) Почему кстати hwnd,lParam,wParam и функция в отельных скобках? Далее пишут: Для макроса HANDLE_WM_DESTROY дано следующее макроопределение:
Подставив это определение вместо WM_DESTROY и опустив ненужные скобки получим окончательное макрорасширение case WM_DESTROY:return (OnDetroy(hwnd,0L)); Объясните поалуйста вместо чего мы подставяем расширенный макрос WM_DESTROY и что это вообще за странный параметр "0L"? Это сообщение отредактировал(а) yngwie19 - 24.12.2008, 00:30 |
||||||
|
|||||||
| jonie |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
чет я последнее не очень понял, чет там из контекста как-то урвано.. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||||
|
|||||||||
| yngwie19 |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
jonie, Спасибо за ответы.
В книге дается расширенный вид макроса, полученный н основе общего вида макроса:
А также дается макроопределение для WM_DESTROY
И говорят:
Это чтож получается, чтобы для каждого сообщения правильно написать Марос, нужно смотреть определения в windowsx.h и все время подставлять те определения сообщений, которые нужно? Что это за параметр 0L? Да и еще вопрос, зачем тут нужен return? без него макрос описывается не правиьно? Это сообщение отредактировал(а) yngwie19 - 24.12.2008, 08:34 |
||||||||
|
|||||||||
| jonie |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
насколько я понимаю из обрывочных сведений идея авторов следующая: "абстракция 0-ого уровня" : используем switch(umsg) { case WM_CRATE: .... break; .... } "1-ый уровень" :
"2-ой уровень":
чета типа того.. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||||
|
|||||||||
| yngwie19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
jonie,
а почему тогда если макросы не использовать то мы вместо return пишем break
а при использовании макроса мы получаем
и еще вопрос: что это за параметр 0L для чего он тут используется,нам он вообще нужен? |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
не так.. если используем ретурн то брейк ставить не надо. а ретурн ставим для возвращения результа функции ассоцированной с сообщением а макросы используются для скрытия процесса ассоциации сообщения с конкретной функцией класса. Добавлено через 35 секунд L означает что тип long. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
yngwie19, я так понимаю, ты спрашиваешь параметр функции, определенной в WTL или MFC, а здесь API
переместить тему? или я не прав? вобщем, тема мигрировала в Visual C++/MFC/WTL Это сообщение отредактировал(а) GremlinProg - 24.12.2008, 15:42 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
для числовых констант
Добавлено через 1 минуту и 15 секунд A в какой библиотеке определен данный макрос? |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Возврашаю тему в WinAPI - это таки оно.
-------------------- ... |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
HANDLE_MSG, теперь оно )
yngwie19, нули здесь нужны для того, чтобы обработчики сообщений, пересылающие менее трех параметров, можно было задать в одной форме:
т.е. как раз для того, чтобы не смотреть определения в windowsx.h и не искать, какой тип функции передать макросу в параметре fn, т.е. для HANDLE_MSG, все обработчики имеют 3 параметра Это сообщение отредактировал(а) GremlinProg - 26.12.2008, 00:51 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Ребят а вообще в практике, часто используют макросы?
|
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
И еще вопросик при использовании макроса для функции WM_PAINT.
Скажите пожалуйста когда мы описываем функцию OnDestroy для макроса HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy), то мы знаем, что она будет вызована в случае если мы например закроем окно. А что касается использования функции WM_PAINT, то Я так понял, что ее винда вызывает сама. Дело в том что в книге дано описание макроса HANDLE_MSG(hwnd,WM_PAINT,OnPaint), но нигде явно не указывается, что мы ее каким-либо образом вызываем. Т.е получается мы ее просто описали, а вызываем не мы. Поясите пожалуйста когда и кто посылает данное собщение в обработчик сообщений, а главное в какой момент. Это сообщение отредактировал(а) yngwie19 - 26.12.2008, 00:39 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
WM_PAINT посылается виндой окну, когда она считает, что оно(или его часть) должно перерисоваться. Т.е когда (становиться) видна часть окна помеченная как невалидная. (т.е та часть окна которая по каким то причинам предполагается, что была затерта и сейчас нужно показать ее юзеру) Программа сама может инициировать перерисовку (точнее сказать посылку окну сообщения WM_PAINT) путем "инвалидования" определенной области. подробнее тут: http://msdn.microsoft.com/en-us/library/ms534870.aspx |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |