Программирование на C++ глазами хакера


Нестандартные окна - часть 2


HRGN CreateEllipticRgn( int nLeftRect, // х - координата левого верхнего угла int nTopRect, // у - координата левого верхнего угла int nRightRect, // х - координата правого нижнего угла int nBottomRect // у - координата правого нижнего угла );

Данная функция создает регион окна (область) в виде эллипса. В качестве параметров передаются размеры эллипса.

int SetWindowRgn( HWND hWnd, // Указатель на окно HRGN hRgn, // Предварительно созданный регион BOOL bRedraw // Флаг перерисовки окна );

Эта функция назначает указанному в качестве первого параметра окну созданный регион, который передается во втором параметре. Если последний параметр (флаг) равен TRUE, то окно после назначения нового региона будет перерисовано, иначе это придется сделать в явном виде самостоятельно. В предложенном коде после установки региона есть вызов функции UpdateWindow, которая перерисовывает окно, поэтому последний параметр можно было бы установить и в FALSE.

Запустите приложение, и вы увидите окно овальной формы (рис. 3.3).

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

HRGN FormRgn, RectRgn; RECT WRct; GetwindowRect(hWnd, &WRct); FormRgn=CreateEllipticRgn(0,0,WRct.right-WRct.left,WRct.bottom-WRct.top);

RectRgn=CreateRectRgn(100, 100, WRct.right-WRct.left-100, WRct.bottom-WRct.top-100); CombineRgn(FormRgn,FormRgn,RectRgn,RGN_DIFF); SetWindowRgn(hWnd, FormRgn, TRUE);

Рис. 3.3. Окно овальной формы

Здесь объявлены две переменные типа HRGN. В первой (FormRng) создается овальный регион функцией CreateEllipticRgn, а во второй — прямоугольный с помощью функции CreateRectRgn. Для функции CreateRectRgn так же как и при создании овального региона указываются четыре координаты, задающие размер прямоугольника. Результат сохраняется в переменной RectRng.

После создания двух областей они объединяются с помощью функции CombineRng:

int CombineRgn( HRGN hrgnDest, // Указатель на результирующий регион HRGN hrgnSrc1, // Указатель на первый регион HRGN hrgnSrc2, // Указатель на второй регион int fnCombineMode // Метод комбинирования );




Начало  Назад  Вперед



Книжный магазин