Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Отдельная процедура обработки сообщений от GroupBox  (Прочитано 16549 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Sosiskin
Интересующийся

eu
Offline Offline

« : 18-08-2010 18:12 » 

Создаю отдельную процедуру для обработки сообщений от элементов, которые находятся на GroupBox.
сам GroupBox лежит на главной форме. Всё работает нормально, но только GroupBox не хочет отрисовываться на форме ((

Код:
WNDCLASS ww;

GetClassInfo(hInst,"BUTTON",&ww);
ww.lpszClassName = "grpBox";
ww.lpfnWndProc = GrpBoxWndProc;
RegisterClass(&ww);

//не хочет рисовать GroupBox на форме
HWND hGroupBox = CreateWindow("grpBox","Traning",WS_CHILD |WS_VISIBLE | WS_BORDER | BS_GROUPBOX,10,10,300,100,hWnd,(HMENU) 100, hInst,NULL);

//Кнопку рисует
CreateWindow("button", "Start Traning", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20,200,100, hGroupBox, (HMENU)118, hInst, NULL);

Процедура обработки кнопки
Код:
LRESULT CALLBACK GrpBoxWndProc(HWND hGroupBox, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:

if(LOWORD(wParam)==118)
{
MessageBox(hWnd, "работает", "!", MB_YESNO|MB_ICONQUESTION);
}
break;
default:
return DefWindowProc(hGroupBox, message, wParam, lParam);
}
return 0;
}
Записан
Sosiskin
Интересующийся

eu
Offline Offline

« Ответ #1 : 18-08-2010 18:14 » 

Собственно вопрос. Почему не хочет рисовать?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 18-08-2010 18:32 » 

где пишешь ?
Используешь только АПИ?

Просто вот эта фраза непонятна
Цитата
от элементов, которые находятся на GroupBox
"в АПИ" и  в MFC этот элемент ничего программно не группирует - лишь визуально, рисуя рамочку по своему краю.


А по вопросу -
1) не рисует - то есть, даже рамку не видать?
2) что возвращает GetLastError() после вызова CreateWindow ?
3) все ли свойства указаны? Например, спай показывает у рамки следующие свойства:


* styles.PNG (3.55 Кб - загружено 2668 раз.)
Записан

Sosiskin
Интересующийся

eu
Offline Offline

« Ответ #3 : 18-08-2010 19:36 » 

Ок. Поясню.
Пишу в Visual C++ 2008 на ВИН АПИ.
Я создаю на главной форме GroupBox, на котором располагаю пару Радио Баттон`ов и кнопку ОК.
Наследую их от GroupBox.
Делаю это для того, чтобы задав координаты GroupBox, можно было легко переместить его в любую часть окна, не испортив положения кнопок внутри GroupBox.

Функция:

HWND hGroupBox = CreateWindow("BUTTON","Traning",WS_CHILD |WS_VISIBLE |  BS_GROUPBOX,10,10,300,100,hWnd,(HMENU) 100, hInst,NULL);

со свойствами WS_CHILD |WS_VISIBLE |  BS_GROUPBOX , легко создаёт GroupBox, но стоит только зарегистрировать класс, как рамка пропадает ((
параметр WS_BORDER выделяет просто прямоугольник, но это не то, чего хотелось бы.

На счет GetLastError().
Можно примерчик в какой момент и как её запускать ?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 18-08-2010 19:43 » 

Цитата
Наследую их от GroupBox.
это тоже поясни ) Как радиокнопки можно наследовать от GroupBox ?

Цитата
Делаю это для того, чтобы задав координаты GroupBox, можно было легко переместить его в любую часть окна, не испортив положения кнопок внутри GroupBox.
это автоматом не произойдёт - рамка никак не связана с радиокнопками. Всё надо двигать вручную Улыбаюсь

Цитата
счет GetLastError().
Можно примерчик в какой момент и как её запускать ?

просто вызвать и посмотреть код. Но, судя по всему, тут это не поможет, ошибка в логике

А прицепи проект? Только удали папки debug, release и файл *.ncb
Записан

Sosiskin
Интересующийся

eu
Offline Offline

« Ответ #5 : 18-08-2010 20:07 » 

Цитата
Наследую их от GroupBox.
это тоже поясни ) Как радиокнопки можно наследовать от GroupBox ?

Функция, которая создаёт GroupBox, возвращает HWND ГроупБокса.
И при создании новой кнопки я его и указываю в качестве Parent`a, а не главное окно.
Всё хорошо двигается при указании координат для GroupBox`a.
вот примерчик:
Код:
[red]HWND hGroupBox[/red] = CreateWindow("BUTTON","Traning",WS_CHILD |WS_VISIBLE |  BS_GROUPBOX,10,10,300,100,hWnd,(HMENU) 100, hInst,NULL);

CreateWindow("button", "Start Traning", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20,200,100,[red] hGroupBox[/red], (HMENU)118, hInst, NULL);
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #6 : 18-08-2010 23:59 » 

Цитата
но стоит только зарегистрировать класс, как рамка пропадает
что именно ты регистрируешь? Регистрировать элементы стандартных контролов (их окон) не надо. Короче, код регистрации в студию!
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 19-08-2010 03:22 » 

Цитата
Всё хорошо двигается при указании координат для GroupBox`a.
хм, интересно. Надо будет проверить, щас немного занят. Может , оно всё так, но тут есть одно "но" - как форма теперь будет ловить сообщения контролов, которые не её (формы) дети ? Улыбаюсь

И, действительно, проект прикрепи уже! Так будет быстрее и проще для всех
Записан

Sosiskin
Интересующийся

eu
Offline Offline

« Ответ #8 : 19-08-2010 09:34 » 

Вот проэкт

* Visual Interface - Copy.zip (32.76 Кб - загружено 945 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 19-08-2010 10:17 » 

ничего не могу понять - ты говоришь, что у тебя бокс пропадает, а у меня он нормально нарисован. Или я что-то не понял ))

Ещё, кстати, пропущен break после    case WM_HOTKEY:

А ещё не нужно ругаться в комментариях (даже если очень хочется) - ведь их могут (и прочитают когда нибудь) начальник, клиент или ещё кто )

Записан

Sosiskin
Интересующийся

eu
Offline Offline

« Ответ #10 : 19-08-2010 10:32 » 

Цитата
ничего не могу понять - ты говоришь, что у тебя бокс пропадает, а у меня он нормально нарисован. Или я что-то не понял ))
Там стоит параметр WS_BORDER, он просто рисует рамку. Если вместо него поставить BS_GROUPBOX то останутся только элементы, которые я в GroupBox помещаю. Да и рамка рисуется не так красиво как в GroupBox.

Цитата
Ещё, кстати, пропущен break после    case WM_HOTKEY:
пасиб большое.

Цитата
А ещё не нужно ругаться в комментариях (даже если очень хочется) - ведь их могут (и прочитают когда нибудь) начальник, клиент или ещё кто )
вот тут извиняюсь. прост немного нервы не выдержали )) исправлюсь.
В принципе с GroupBox могу забить. Ну не хочет, так не хочет.

Другой вопрос появился.
Какое сообщение передаёт UpDownControl процедуре обработки сообщений, при нажатии на его кнопки?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 19-08-2010 11:04 » 

Цитата
Если вместо него поставить BS_GROUPBOX то останутся только элементы, которые я в GroupBox помещаю.
хм, не вижу такого. Как была рамка, так и остаётся.
А, кстати, вот про это:
И при создании новой кнопки я его и указываю в качестве Parent`a, а не главное окно.
Всё хорошо двигается при указании координат для GroupBox`a.
вот примерчик:
ты прямо видел это сам ? Пример я не делал, забыл вчера вечером попробовать
Просто у бокса средняя часть не рисуется - для того он и групбокс, чтоб через себя просвечивать ))


Цитата
Ещё, кстати, пропущен break после    case WM_HOTKEY:
пасиб большое.

Цитата
А ещё не нужно ругаться в комментариях (даже если очень хочется) - ведь их могут (и прочитают когда нибудь) начальник, клиент или ещё кто )
вот тут извиняюсь. прост немного нервы не выдержали )) исправлюсь.
В принципе с GroupBox могу забить. Ну не хочет, так не хочет.

Цитата
Какое сообщение передаёт UpDownControl процедуре обработки сообщений, при нажатии на его кнопки?
в пакете студии есть утилитка Spy++ (из меню в самой среде тоже можно запустить - Сервис->Spy++)

выбираешь в ней окно (нажми большой бинокль и перетащи круглый "прицел") на окно-приёмник сообщений. Потом включи логгирование его сообщений (можно отфильтровать их, если надо)
Записан

Sosiskin
Интересующийся

eu
Offline Offline

« Ответ #12 : 19-08-2010 11:18 » 

Цитата
Цитата
Какое сообщение передаёт UpDownControl процедуре обработки сообщений, при нажатии на его кнопки?
в пакете студии есть утилитка Spy++ (из меню в самой среде тоже можно запустить - Сервис->Spy++)

выбираешь в ней окно (нажми большой бинокль и перетащи круглый "прицел") на окно-приёмник сообщений. Потом включи логгирование его сообщений (можно отфильтровать их, если надо)
Огромное спасибо, теперь стало намного легче отлавливать сообщения ))
Записан
Sosiskin
Интересующийся

eu
Offline Offline

« Ответ #13 : 19-08-2010 11:47 » new

Еще вопрос. Как получить ID от UpDownControl после того, как он отправил сообщение WM_VSCROLL процедуре обработки сообщений?
Код:
case WM_VSCROLL:
 wmId  = LOWORD(lParam);
 wmEvent = HIWORD(wParam);
break;
В wmId лежит совсем не тот ID, который я указываю при создании UpDownControl.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 19-08-2010 14:38 » 

попробуй так

GetDlgCtrlID(хендл_контрола)
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines