Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Запутался с окнами в Win32 API

Запутался с окнами в Win32 API

Поделиться
s3dworldПостоялецwww3 июля 201013:00#0
Всем доброго дня!

Я создаю все окна с помощью кода через Win32 API. Раньше особых проблем не было, а сейчас решил капнуть намного глубже и сразу попал в тупик (много не ясного). Поиск информации в Интернете ничего не дал.

Для начала хочется разобраться со следующим: вот заполняю структуру класса приложения и регистрирую класс:

WNDCLASSEXA windowClass;

ZeroMemory(&windowClass,sizeof(WNDCLASSEXA));

windowClass.cbSize      = sizeof(WNDCLASSEXA);
windowClass.style      = CS_VREDRAW | CS_HREDRAW;
windowClass.lpfnWndProc    = WinMessage;
windowClass.hInstance    = appInstance;
windowClass.hbrBackground  = CreateSolidBrush(RGB(0,0,0));
windowClass.lpszClassName  = className;

if(!RegisterClassExA(&windowClass))
{
  MessageBoxA(0,"Не могу зарегистрировать класс приложения!","Ошибка",MB_ICONERROR);
  return 1;
}

Получается что сколько бы я не сделал окон, у меня все сообщения будут обрабатываться только через WinMessage:

// Функция обработки сообщений от ОС
long _stdcall Application::WinMessage(HWND _window,UINT _message,WPARAM _wParam,LPARAM _lParam)
{
  switch(_message)
  {
    case WM_DESTROY:
    {
      PostQuitMessage(0);
      break;
    }

    case WM_SYSCOMMAND:
    {
      switch(_wParam)
      {
        case SC_SCREENSAVE:
        case SC_MONITORPOWER:
          return 0;
      }

      return DefWindowProcA(_window,_message,_wParam,_lParam);
    }

    default:
      return DefWindowProcA(_window,_message,_wParam,_lParam);
  }

  return 0;
}

Если я создам 20 окон, то в функцию обработки сообщений от операционной системы (WinMessage) поступит 20 сообщений WM_CREATE, правильно? Где в параметре _window у меня будет идентификатор окна, для которого создалось сообщение, так?

А если я сделаю всего одно окно, но на нём (то есть его дети) будет располагаться ещё несколько окон (кнопки, поля редактирования, метки), то у меня при нажатии (наведении или просто при перерисовке) сообщения опять же будут поступать в WinMessage. Но в качестве параметра _window будет передаваться указатель на то окно (кнопка, метка или ещё там что...), на которое навели (нажали или перерисовать нужно), или же указатель на родительское окно, на котором расположены все другие окна (а в каком-нибудь _wParam или _lParam указатель на уже дочернее окно)?

Просто я пытался функцию WinMessage разделить...написал класс Button, который создаёт кнопки и имеет свой обработчик сообщений. Этот обработчик сообщений вызывается в функции WinMessage. Но в итоге ничего не получилось у меня. А без этого, если много окон, получается очень длинная функция WinMessage, не удобочитаемая и прочее...что в общем не есть хорошо.

И ещё вопрос: вот я создаю кнопку:

// Инициализация
bool Button::Create(
          HWND _window,
          const char* _name,
          const int _x,
          const int _y,
          const int _width,
          const int _height,
          HINSTANCE _appInstance)
{
  if(!(button=CreateWindowA(
    "button",
    _name,
    BS_PUSHBUTTON | BS_CENTER | BS_TEXT | WS_CHILD,
    _x,_y,
    _width,_height,
    _window,
    0,
    _appInstance,
    0))) return true;

  UpdateWindow(button);
  ShowWindow(button,SW_SHOW);

  return false;
}

Как мне изменить цвет кнопки, изменить цвет текста на ней?

1 frag / 2 deathsУчастникwww3 июля 201015:31#1
> Получается что сколько бы я не сделал окон, у меня все сообщения будут обрабатываться только через WinMessage:

Не понял, это с чего бы? Для каждой формы нужен свой класс, формы же разные. А разным классам можно задать разные оконные функции.

> Но в качестве параметра _window будет передаваться указатель на то окно
> (кнопка, метка или ещё там что...), на которое навели (нажали или перерисовать
> нужно), или же указатель на родительское окно, на котором расположены все
> другие окна (а в каком-нибудь _wParam или _lParam указатель на уже дочернее
> окно)?

Родитель. А в качестве LoWord(_wParam) будет передаваться ID кнопки. ID определяешь сам при создании кнопки.

> А без этого, если много окон, получается очень длинная функция WinMessage, не
> удобочитаемая и прочее...

Да прямая работа с WinAPI вообще содержит много уродливой писанины.

s3dworldПостоялецwww3 июля 201015:35#2
TarasB
Спасибо, я как-то никогда и не делал несколько классов программы, поэтому про это и не подумал.

Ну а собственно как мне изменить цвет кнопки?
Как изменить цвет текста на кнопке?

Как изменить фон текстового поля?
Как изменить цвет текста текстового поля?

1 frag / 2 deathsУчастникwww3 июля 201015:42#3
Ну с помощью стандартных библиотек, не напрямую, ты же умеешь менять цвет текста? Ну вот и посмотри, как там реализовано.
kvakvsПостоялецwww3 июля 201015:43#4
Есть подозрение, что WinAPI ты выбрал не на основании каких-то требований, а потому что это первое, что тебе попалось под руки. WinAPI ужасен, ищи приличную библиотеку для твоего языка программирования (QT, MFC, C# WinForms, итд).
X512Постоялецwww3 июля 201016:04#5
s3dworld
> Ну а собственно как мне изменить цвет кнопки?
> Как изменить цвет текста на кнопке?
>
> Как изменить фон текстового поля?
> Как изменить цвет текста текстового поля?
Не надо этого делать. Делай либо свои контролы, желательно согласовавшись с дизайнером, либо ничего не трогай. Вырвиглазных интерфейсов и так хватает...
s3dworldПостоялецwww3 июля 201016:05#6
Да, своё GUI было бы лучше. Но я раньше как то менял цвет фона у текстового поля и цвет текста, не сложно было. Но не помню как делал. Вот и спрашиваю.
cNoNimУчастникwww3 июля 201016:12#7
TarasB
> Не понял, это с чего бы? Для каждой формы нужен свой класс, формы же разные. А
> разным классам можно задать разные оконные функции.
это зачем?
можно юзать одну WinProc, в которой вызывать уже WinProc конкретного окна, в зависимости от Хендла окна.

/ Форум / Программирование игр / Общее

Тема в архиве.

2001—2017 © GameDev.ru — Разработка игр