Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с макросом HANDLE_MSG 
:(
    Опции темы
Волод
Дата 8.8.2005, 09:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите разобраться с макросом HANDLE_MSG.
В одной из книг библиотеки системного программиста предлагается использовать этот макрос следующим образом:
Код

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{    
    switch(iMsg)
    {
        HANDLE_MSG(hwnd, WM_SIZE, Cls_OnSize);    
        HANDLE_MSG(hwnd, WM_PAINT, Cls_OnPaint);    
        HANDLE_MSG(hwnd, WM_DESTROY, Cls_OnDestroy);    
        default:  
            return DefWindowProc(hwnd, iMsg, wParam, lParam);
    }



При этом функция, переданные через HANDLE_MSG, должна быть такой же, как (цитата)…и обычная функция, за одним исключением - она должна оканчиваться вызовом макрокоманды FORWARD_<имя сообщения> в операторе return (даже если функция имеет тип void)

То есть, например, Cls_OnDestroy описывается так:
Код
 
void Cls_OnDestroy(HWND hwnd)
{
PostQuitMessage(0);
return FORWARD_WM_DESTROY(hwnd, DefWindowProc); 
}


Весь этот код замечательно работает на Си, где не важно, что возвращает функция, но при попытке перенести этот код в C++ компилятор сразу выдает ошибку, что void-функция Cls_OnDestroy не может возвращать значение. Хорошо, DefWindowProc у нас возвращает результат типа LRESULT, и я пытаюсь переопределить проблемную функцию так:
(LRESULT) Cls_OnDestroy(HWND hwnd);
Но выскакивает новая ошибка – оказывается, макросы типа FORWARD_* разворачиваются в код, который в конечном итоге преобразуется к типу void. То есть в сокращенном варианте на языке С вся функция выглядит как:
void Cls_OnDestroy(HWND hwnd){return void} – и на С это компилируется, а на C++ - такой код, получается, вообще нельзя преобразовать? Приведешь к LRESULT – будет ругаться, что возвращаем void, приведешь к void - ругается, что вообще что-то возвращаем…..
Это, собственно, и есть первый вопрос – как коррекно перевести Cи-шный код в код C++ ? - и второй, тоже по теме:
Я тут посмотрел, что большинство подобных функций возвращают вызов ф. DefWindowProc, тогда почему не рекомендуется (по крайней мере, нигде не встретил) описать CALLBLACK - функцию окна так?:
Код

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{    
    switch(iMsg)
    {
        HANDLE_MSG(hwnd, WM_SIZE, Cls_OnSize);    
        HANDLE_MSG(hwnd, WM_PAINT, Cls_OnPaint);    
        HANDLE_MSG(hwnd, WM_DESTROY, Cls_OnDestroy);    
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);



  Вверх
Волод
Дата 8.8.2005, 09:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пока для себя я пришел к выводу, что раз ф. возвращает пустое значение, правильнее всего будет преобразовать все указанные в макросе HANDLE_MSG функции к типу BOOL и вместо void возвращать NULL, FORWARD_* не вызывать совсем, а DefWindowProc, как показано в последнем листинге, вынести за оператор switch... – только вот насколько это правильно?
  Вверх
Fixin
Дата 8.8.2005, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Если возврат - воид, то просто вызови ворвард без ретурна. Вообще, необходимости в его вызове - не вижу.
PM MAIL ICQ   Вверх
Glad
Дата 16.8.2005, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 16.8.2005

Репутация: нет
Всего: нет



Кстати у меня тоже проблема с этим макросом. На С++ он у меня работает. Но я никак не могу понять принцип его работы. Если обрабатываю сообщение WM_CREATE скажем то нужно одно у функции (типа ON_CREATE) 2 параметра. Если обрабатываю другое сообщение у функции неизвестно уже сколько параметров. В МСДНе не нашел smile
PM MAIL   Вверх
Fixin
Дата 17.8.2005, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Смотри <WIndowsX.h>. Если нужна функция, скажем, OnPaint, то ищи в этом файле Cls_OnPaint и смотри параметры.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0677 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.