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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблемы с MessageBox, пытаюсь вывести Box, но вся прога виснет 
V
    Опции темы
Тутанхамец
Дата 13.1.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Пипл, прошу помощи.

Пытаюсь сделать примитивную прогу в Visual C++ без MFC. Всего-то хочу, чтоб при щелчке на меню "Новый файл" появлялся MessageBox. Оконная функция выглядит так:



Код

switch(Message)
    {
    case WM_CREATE:
        return 0;

    HANDLE_MSG(hWnd, WM_COMMAND, fOnCommand);
    return 0;        

    case WM_PAINT:
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
}
    return DefWindowProc(hWnd, Message, wParam, lParam);
}


А функция fOnCommand, на которую переводит стрелки взломщик сообщений, выглядит так:

Код

void fOnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) {

switch(id)
{
case ID_MENUITEM40001:
 
MessageBox(NULL, "qq!", "qqq", MB_OK);
            
        break;
}
}


Проблема в следующем. Если вместо хэндла окна в MessageBox передаю NULL, то бокс появляется не сразу (только пары щелчков мышкой) и не поверх основного окна моей проги. Мне так не надо.

А если делаю так:

MessageBox(hWnd, "qq!", "qqq", MB_OK); //hWnd - глобальная переменная, получаемая в WinMain

или так:

MessageBox(hwnd, "qq!", "qqq", MB_OK);

...то прога вообще подвисает и реагирует на мышку только миганием заголовка окна.

При отладке прога упирается в строчку с MessageBox и дальше ни с места.

Что я делаю не так? Может, кто-нибудь в курсе?.. Заранее благодарен.

Это сообщение отредактировал(а) Тутанхамец - 13.1.2006, 09:43
PM MAIL   Вверх
SergeCpp
Дата 13.1.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



WM_PAINT убери return 0;
PM MAIL WWW ICQ   Вверх
Тутанхамец
Дата 13.1.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Спасибо! smile
PM MAIL   Вверх
Fixin
Дата 13.1.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


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

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



И еще, если взялся за взломщики, то их везде и используй. После HANDLE_MSG возвращать ничего не надо. И используй локальный HWND, хотя это не важно, но стиль программирования требует. ТОгда твой обработчик сообщений выглядел бы так:
Код

switch(Message)    
{    
    HANDLE_MSG(hwnd, WM_CREATE, fOnCreate);
    HANDLE_MSG(hwnd, WM_COMMAND, fOnCommand);
    HANDLE_MSG(hwnd, WM_PAINT, fOnPaint);    
    HANDLE_MSG(hwnd, WM_DESTROY, fOnDestroy);
    return DefWindowProc(hWnd, Message, wParam, lParam);    
}


Обычно, названия функциям ответа на сообщения дают по шаблону WindowName_OnMessage, где
WindowName - название окна (ведь их в проге может быть много.
Message - сообщение, на которое отвечаем.

Если не знаешь, как описывать ф-цию ответа на сообщение, то ищи её в Windowsx.h как строку по шаблону Cls_OnMessage.
PM MAIL ICQ   Вверх
Тутанхамец
Дата 13.1.2006, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Большое спасибо, учту. smile

А есть какой-нибудь аналог взломщиков, чтобы разделять обработку сообщений по источнику возникновения?

То есть, что хочу сказать... вот, допустим, с помощью HANDLE_MSG я избавился от заумного switch в оконной процедуре и все сообщения WM_COMMAND теперь направляются в функцию MyWindow_OnCommand.

Но в этой MyWindow_OnCommand опять придется делать switch с кучей кейсов для каждого меню, кнопки и т.п., посылающих WM_COMMAND?

Или есть варианты?

Можно конечно делать функции типа MyMenu1_OnCommand, MyMenu2_OnCommand и вызывать их из кейсов функции MyWindow_OnCommand...

Но может для этого тоже уже придумано что-нибудь эдакое типа взломщиков?)
PM MAIL   Вверх
Fixin
Дата 13.1.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


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

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



Ну, такого не видел, но кейсы на команды обычно уже не требуют такого дикого количества локальных переменных. Можешь сам организовать такую систему, или сделать отдельно ф-ции на каждый кейс, как сам и говорил. Взломщики - это ОЧЕНЬ простые макросы, которые можно написть самому для любых кейсов. Их ограничение - входные переменные (из которых получаем данные) жестко записаны в макросах. Те, ты же не можешь поменять названия переменных в оконной процедуре.
PM MAIL ICQ   Вверх
Тутанхамец
Дата 13.1.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



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

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


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

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


 




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


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

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