| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > помогите разобраться с макросом HANDLE_MSG |
| Автор: yngwie19 24.12.2008, 00:17 | ||||||
| Всем привет. В книге Финогенова "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"? |
| Автор: jonie 24.12.2008, 01:04 | ||||||||
чет я последнее не очень понял, чет там из контекста как-то урвано.. |
| Автор: jonie 24.12.2008, 13:58 | ||||||||
насколько я понимаю из обрывочных сведений идея авторов следующая: "абстракция 0-ого уровня" : используем switch(umsg) { case WM_CRATE: .... break; .... } "1-ый уровень" :
"2-ой уровень":
чета типа того.. |
| Автор: yngwie19 24.12.2008, 14:48 | ||||||
| jonie, а почему тогда если макросы не использовать то мы вместо return пишем break
а при использовании макроса мы получаем
и еще вопрос:
что это за параметр 0L для чего он тут используется,нам он вообще нужен? |
| Автор: mes 24.12.2008, 15:12 | ||
не так.. если используем ретурн то брейк ставить не надо. а ретурн ставим для возвращения результа функции ассоцированной с сообщением а макросы используются для скрытия процесса ассоциации сообщения с конкретной функцией класса. Добавлено через 35 секунд L означает что тип long. |
| Автор: GremlinProg 24.12.2008, 15:29 |
| yngwie19, я так понимаю, ты спрашиваешь параметр функции, определенной в WTL или MFC, а здесь API переместить тему? или я не прав? вобщем, тема мигрировала в Visual C++/MFC/WTL |
| Автор: yngwie19 25.12.2008, 00:11 |
| GremlinProg, Это макрос чистого WINAPI, зачем перенесли? для какой переменной? |
| Автор: mes 25.12.2008, 13:56 | ||
для числовых констант
Добавлено через 1 минуту и 15 секунд A в какой библиотеке определен данный макрос? |
| Автор: yngwie19 25.12.2008, 20:02 |
windowsx.h |
| Автор: Earnest 25.12.2008, 21:07 |
| Возврашаю тему в WinAPI - это таки оно. |
| Автор: GremlinProg 25.12.2008, 21:34 | ||
| HANDLE_MSG, теперь оно ) yngwie19, нули здесь нужны для того, чтобы обработчики сообщений, пересылающие менее трех параметров, можно было задать в одной форме:
т.е. как раз для того, чтобы не смотреть определения в windowsx.h и не искать, какой тип функции передать макросу в параметре fn, т.е. для HANDLE_MSG, все обработчики имеют 3 параметра |
| Автор: yngwie19 26.12.2008, 00:15 |
| Ребят а вообще в практике, часто используют макросы? |
| Автор: yngwie19 26.12.2008, 00:38 |
| И еще вопросик при использовании макроса для функции WM_PAINT. Скажите пожалуйста когда мы описываем функцию OnDestroy для макроса HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy), то мы знаем, что она будет вызована в случае если мы например закроем окно. А что касается использования функции WM_PAINT, то Я так понял, что ее винда вызывает сама. Дело в том что в книге дано описание макроса HANDLE_MSG(hwnd,WM_PAINT,OnPaint), но нигде явно не указывается, что мы ее каким-либо образом вызываем. Т.е получается мы ее просто описали, а вызываем не мы. Поясите пожалуйста когда и кто посылает данное собщение в обработчик сообщений, а главное в какой момент. |
| Автор: mes 26.12.2008, 03:14 | ||
WM_PAINT посылается виндой окну, когда она считает, что оно(или его часть) должно перерисоваться. Т.е когда (становиться) видна часть окна помеченная как невалидная. (т.е та часть окна которая по каким то причинам предполагается, что была затерта и сейчас нужно показать ее юзеру) Программа сама может инициировать перерисовку (точнее сказать посылку окну сообщения WM_PAINT) путем "инвалидования" определенной области. подробнее тут: http://msdn.microsoft.com/en-us/library/ms534870.aspx |
| Автор: yngwie19 26.12.2008, 17:36 |
| mes, Спасибо |
| Автор: yngwie19 26.12.2008, 23:29 | ||
mes, Скажи пожалуйста, мне при использовании макросов не нужно все время смотреть как он разворачивается с помощью определений в windowsx.h, могу ли Я для каждого сообщения просто запомнить какие параметры функция должна принимать и какое возвращать. Ведь при использовании макроса в оконной процедуре мы все время пишем
Эта часть всегда стандартная? |
| Автор: mes 26.12.2008, 23:53 | ||||
так макросы для этого и ввели, чтоб скрыть черную работу по транспортировке сообщения в нужную функцию.. Вид конечной функции можно подглядывать в библиотеке .. он показан в комментах перед определением макроса конкретного сообщения.
Добавлено через 1 минуту и 10 секунд да, для всех сообщений определенных в библиотеке. |
| Автор: yngwie19 27.12.2008, 08:55 |
| mes, Спасибо еще раз |