Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2010, 22:35   #1
nickel-j
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 28
По умолчанию Изменение маски (формы) рабочей области окна

Привет, народ!
Для меня это новая тема, я раньше не знал о таких возможностях Винды. Может кто-нибудь занимался подобной проблемой как изменение рабочей области окна со стандартной прямоугольной? Тогда киньте код или ссылки на источник, заранее спасибо
nickel-j вне форума Ответить с цитированием
Старый 18.05.2010, 03:00   #2
litrovith
Пользователь
 
Регистрация: 15.07.2008
Сообщений: 28
По умолчанию

http://www.codeproject.com/KB/GDI/rgncreator.aspx
litrovith вне форума Ответить с цитированием
Старый 19.05.2010, 12:55   #3
nickel-j
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 28
По умолчанию

Спасибо, но эта прога меняет форму рисунка, а мне нужно изменить форму именно рабочей области окна
nickel-j вне форума Ответить с цитированием
Старый 19.05.2010, 14:48   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

используйте регионы, так вы ограничите видимую область окна(ну и рабочую соответственно)
а сам прямоугольник всетаки будет прямоугольником.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.05.2010, 21:58   #5
nickel-j
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 28
По умолчанию

Спасибо, буду пробовать
nickel-j вне форума Ответить с цитированием
Старый 21.05.2010, 23:06   #6
nickel-j
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 28
По умолчанию Трансформация регионов

Вот с регионами все неплохо, нашел в нете нормальный источник, сделал окно в форме эллипса и пр. Но вот код, в котором обыгрывается трансформация регионов, не смог запустить:
Код:
HRGN hRgn, hHdrRgn;

case WM_SIZE:
        {// трансформации
         XFORM xf, xf2;

         // буфер для хранения данных описывающих первый "луч"
         // здесь вызов GetRegionData(HRGN, 0, NULL) с “нулями” возвращает число байт, необходимых для хранения информации о регионе. В данной статье содержимое структуры LPRGNDATA не имеет значения. Имеет  значение то, что она представляет определенный регион
         LPRGNDATA lpRgnData;

         // прямоугольник описанный вокруг региона
         RECT rt,rc;

         //массив точек для создания первого "луча"
         POINT pnt[4];
         pnt[0].x=rc.left;				pnt[0].y=rc.top+(rc.bottom-rc.top)/2;
         pnt[1].x=rc.left+(rc.right-rc.left)*3/4;	pnt[1].y=rc.top+(rc.bottom-rc.top)*3/4;
         pnt[2].x=rc.left+(rc.right-rc.left)/2;	        pnt[2].y=rc.top+(rc.bottom-rc.top)/2;
         pnt[3].x=rc.left+(rc.right-rc.left)*3/4;	pnt[3].y=rc.bottom-(rc.bottom-rc.top)*3/4;

         // создадим первый "луч"
         DeleteObject(hRgn);
         hRgn = CreatePolygonRgn(pnt, 4, ALTERNATE);
         _ASSERT(hRgn);

         //буфер для хранения данных описывающих первый "луч"
         lpRgnData = GlobalAlloc(GMEM_FIXED, sizeof(RGNDATA)*GetRegionData(hRgn, 0, NULL));
         _ASSERT(lpRgnData);

         //получение данных
         GetRegionData(hRgn, GetRegionData(hRgn, 0, NULL), lpRgnData);

         xf.eM11 = -1;		//в данном случае
         xf.eM22 = 1;		//она описывает зеркальное
         xf.eM12 = xf.eM21 = 0;	//отображение относительно
         xf.eDx  = xf.eDy  = 0;	//оси ординат

         //создание второго "луча" используя данный первого и струкутуры
         //описывающей необходимые изменения
         hHdrRgn = ExtCreateRegion(&xf, GetRegionData(hRgn, 0, NULL), lpRgnData);
         _ASSERT(hHdrRgn);

         //смещение второго "луча" (т. к. ось ординат проходит через
         //верхний левый угол)
         OffsetRgn(hHdrRgn, rc.right-rc.left, 0);

         //объединение первого и второго "лучей"
         CombineRgn(hRgn, hRgn, hHdrRgn, RGN_OR);

         GlobalFree(lpRgnData);	//удаление промежуточного буфера

         //еще буфер для хранения данных о двух первых "лучах"
         lpRgnData = GlobalAlloc(GMEM_FIXED, sizeof(RGNDATA)*GetRegionData(hRgn, 0, NULL));

         //получение данных
         GetRegionData(hRgn, GetRegionData(hRgn, 0, NULL), lpRgnData);

         xf.eDx=xf.eDy=0;		//здесь структура XFORM
         xf.eM11=xf.eM22=0;	//определяет поворот
         xf.eM12=1;			//относительно центра
         xf.eM21=-1;		//на 180 градусов

         xf2.eDx=xf2.eDy=0;			// необходимая для масштабирования
         xf2.eM21=xf2.eM12=0;			// повернутых лучей.
         xf2.eM11=(float)(rc.right-rc.left)/(rc.bottom-rc.top);	// Так как в общем случае
         xf2.eM22=(float)(rc.bottom-rc.top)/(rc.right-rc.left);	// окно не квадратное, а прямоугольное

         CombineTransform(&xf, &xf, &xf2);	//объединение двух трансформаций

         // и создание повернутых и промаштобированных "вертикальных лучей"
         DeleteObject(hHdrRgn);
         hHdrRgn = ExtCreateRegion(&xf, GetRegionData(hRgn, 0, NULL), lpRgnData);

         GlobalFree(lpRgnData);	//удаление промежуточного буфера

         // сместим полученные "вертикальные лучи", это так же связано
         // с положением центра координат в верхнем левом углу
         GetRgnBox(hHdrRgn, &rt);
         OffsetRgn(hHdrRgn,
         -rt.left+(rc.left+(rc.right-rc.left)/2-(rt.right-rt.left)/2), -rt.top+(rc.top));

         //получение "звезды"
         CombineRgn(hRgn, hRgn, hHdrRgn, RGN_OR);

         //очистим дополнительный регион
         DeleteObject(hHdrRgn);
         SetWindowRgn(hWnd, hRgn, TRUE);

         return 0;
        }
Проблема в том, что функция _ASSERT не определена. Ошибка не уходит и после подключения assert.h - возможно, кто-то знает, что надо сделать? Заранее спасибо
nickel-j вне форума Ответить с цитированием
Старый 22.05.2010, 08:53   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Requirements
Macro Required header
_ASSERT <crtdbg.h>
Справку посмотреть религия не позволяет?
p51x вне форума Ответить с цитированием
Старый 22.05.2010, 14:34   #8
nickel-j
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 28
По умолчанию

Да вроде бы не мешает=)
nickel-j вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение размера области пользователя Пепел Феникса Win Api 6 07.12.2009 16:50
Изменение размера окна Anfall Общие вопросы Delphi 5 14.03.2009 10:06
отсечение области окна нестандартной формы Makcydrl Win Api 3 07.05.2008 01:36
Разбиение окна на области? HunterMan Win Api 2 03.04.2008 22:18
Сохранение области формы Marsik Помощь студентам 11 15.11.2007 21:00