Напомним, что окно в системе Presentation Manager можно рассматривать как объект, состоящий из структуры данных и функции окна, реализующей методы для работы с этими данными.
Понятие класса окна используется для установки соответствия между окном и функцией окна. В системе Presentation Manager существуют так называемые предопределенные классы окна, для которых функции окна уже созданы и находятся внутри Presentation Manager.
Если вы создаете окно на базе предопределенного класса окна, оно будет обладать функциональностью, заложенной в него разработчиками Presentation Manager. Для такого окна вам не нужно создавать свою функцию окна, так как эта функция уже создана.
Тем не менее, вы можете переопределить реакцию этой функции на некоторые или все сообщения, создав на базе предопределенного класса собственное окно, поведение которого отличается от стандартного. Таким образом реализуется механизм наследования: вы создаете свое окно на базе предопределенного класса и изменяете только те методы, которые нужно. Наследование сильно упрощает жизнь программистов, так как они получают возможность использовать почти готовые объекты, при необходимости лишь немного изменяя их поведение.
Создавая главное окно приложения, вы должны зарегистрировать собственный класс, определив внутри своего приложения функцию окна. Эта функция будет обрабатывать сообщения, поступающие в очередь сообщений для вашего окна.
Фрагмент кода, в котором выполняется регистрация класса окна для главного окна приложения представлен ниже:
MRESULT EXPENTRY WndProc(HWND, ULONG, MPARAM, MPARAM); BOOL fRc; CHAR szWndClass[] = "MYWINDOW";
fRc = WinRegisterClass (hab, szWndClass, (PFNWP)WndProc, 0, 0);
if(fRc == FALSE) { WinDestroyMsgQueue (hmq); WinTerminate (hab); return(-1); }
Для регистрации класса окна должна использоваться функция WinRegisterClass , прототип которой приведен ниже:
BOOL WinRegisterClass ( HAB hab, // идентификатор Anchor-block PSZ pszClassName, // имя класса окна PFNWP pfnWndProc, // функция окна ULONG flStyle, // стиль окна ULONG cbWindowData); // дополнительные данные
Имя константы | Описание стиля |
CS_CLIPCHILDREN | Окно не будет рисовать в области своих дочерних окон. Этот стиль может вызвать замедление процесса перерисовки содержимого окна, однако он может оказаться полезен, если процедура рисования внутри дочерних окон отнимает много времени |
CS_CLIPSIBLINGS | Стиль используется для дочерних окон, имеющих общее родительское окно и подавляет рисование одного такого окна внутри других дочерних окон, имеющих общего родителя |
CS_FRAME | Этот стиль имеет главное окно приложения, которое называется Frame Window и используется в качестве платформы для размещения других окон |
CS_HITTEST | Если окно обладает этим стилем, то если указатель мыши находится в области окна, Presentation Manager будет посылать функции окна сообщения WM_HITTEST , которое будет описано в разделе нашей книги, посвященном мыши |
CS_MOVENOTIFY | Если установлен этот стиль, то при перемещении окна пользователем по поверхности рабочего стола функция окна будет получать сообщения WM_MOVE |
CS_PARENTCLIP | Видимая область окна включает область родительского окна |
CS_SAVEBITS | Этот стиль может быть использован для ускорения перерисовки окна, когда пользователь перемещает его или восстанавливает после минимизации либо скрытия. Ускорение происходит за счет того, что изображение области рабочего стола, занимаемой окном, сохраняется как растровое изображение и затем восстанавливается после изменения расположения окна. Использование этого стиля приводит к неэкономному расходованию оперативной памяти, так как для хранения цветного изображения требуется много места |
CS_SIZEREDRAW | Если используется этот стиль, то при любом изменении размеров окна его внутренняя область будет полностью перерисована. С этой целью функция окна получит сообщение WM_PAINT |
CS_SYNCPAINT | Функция окна получит сообщение WM_PAINT сразу после того, как появится необходимость в перерисовке части окна. Если же этот стиль не указан, сообщение WM_PAINT поступит в функцию окна только в том случае, если в очереди нет других сообщений |