Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не рисует! Помогите пожалуйста [D7, WinXP]


Cheshit ©   (2002-12-14 18:55:00) 

Наверно очень просто, но что-то упустил:

procedure DrawRFrame
(DC:HDC;Arect:TRect;AColor:TColor;offset:integer);
var ABr:HBRUSH;
ORgn,IRgn,DRgn:HRgn;
begin
SaveDc(DC);
ABr:=CreateSolidBrush(AColor);
ORgn:=CreateRoundRectRgn(ARect.Left-1,ARect.Top-,Arect.Right-1,Arect.Bottom-1,5,5);
InflateRect(ARect,-offset,-offset);
IRgn:=CreateRoundRectRgn(ARect.Left,ARect.Top,Arect.Right,Arect.Bottom,5,5);
CombineRgn(DRgn,ORgn,IRgn,RGN_DIFF);
SelectObject(DC,ABR);
PaintRgn(DC,DRGN);
RestoreDc(DC,-1);
end;


MBo   (2002-12-15 06:37:00) [1]

procedure DrawRFrame
(DC:HDC;Arect:TRect;AColor:TColor;offset:integer);
var ABr:HBRUSH;
ORgn,IRgn:HRgn;
begin
ABr:=CreateSolidBrush(AColor);
ORgn:=CreateRoundRectRgn(ARect.Left-1,ARect.Top-1,Arect.Right-1,Arect.Bottom-1,5,5);
InflateRect(ARect,-offset,-offset);
IRgn:=CreateRoundRectRgn(ARect.Left,ARect.Top,Arect.Right,Arect.Bottom,5,5);
CombineRgn(IRgn,ORgn,IRgn,RGN_DIFF);
FillRgn(DC,IRGN,ABR);
DeleteObject(ABR);
DeleteObject(IRGN);
DeleteObject(ORGN);
end;

1) Главная ошибка - приемный регион для CombineRgn должен существововать! Здесь начальные регионы больше не нужны, поэтому я использовал один из них. Иначе нужно для этого создать, например, прям. регион 1х1.
2) Ни к чему здесь сохранять и восстанавливать контекст - это затратная процедура. При выборе, например, новой кисти, нужно запоминать значение старой (возвращаемое SelectObject), и в конце восстанавливать
3) FillRgn вместо PaintRgn позволило и без этого обойтись
4) Обязательно надо уничтожать созданные тобой объекты GDI


Наверх

Титульная страница Поиск, карта сайта Написать письмо