как в С++ Builder 6 сделать фигурную форму?
Вариант 1
void UnNormalForm (TForm1* Form1, Graphics::TBitmap* BMP, TColor Transparent)
{
Form1->BorderStyle = bsNone;
Form1->Height = BMP->Height;
Form1->Width = BMP->Width;
HRGN Result=CreateRectRgn (0, 0, 0, 0);
for(int i=0; i!=BMP->Height; ++i)
{
int beg=0;
while(beg!=BMP->Width)
{
while(beg!=BMP->Width && BMP->Canvas->Pixels[beg]==Transparent)
{
++beg;
}
int end=beg;
while(end!=BMP->Width && BMP->Canvas->Pixels[end]!=Transparent)
{
++end;
}
if(beg!=end)
{
HRGN tmp = CreateRectRgn (beg, i, end, i+1);
CombineRgn(Result, Result, tmp, RGN_OR);
DeleteObject(tmp);
beg=end;
}
}
}
SetWindowRgn (Form1->Handle, Result, true);
}
Вариант 2
HRGN Reg1 = CreateRectRgn(0, 0, Width/2, Height/2);
HRGN Reg2= CreateRoundRectRgn (0, 0, Width/2, Height/2, 50, 50);
HRGN Reg3= CreateEllipticRgn(0, 0, Width/2, Height/2);
POINT p[5];
{
p[0] = Point(100, 0);
p[1] = Point(Width-100, 0);
p[2] = Point(Width, Height/2);
p[3] = Point(Width/2, Height);
p[4] = Point(0, Height/2);};
HRGN Reg4 = CreatePolygonRgn(p, 5, ALTERNATE);
но ни что из этого не работает(
подскажите как, а если не сложно скинте работающую программу с коментариями! Спасибо!
1. Загрузить рисунок bmp
2. Если цвет пикселя рисунка равен цвету который приняли за прозрачный,
то сделать соответствующий пиксель канвы прозрачным.
3. В раздел
Код:
private: // User declarations
Код:
Graphics::TBitmap* Picture;// указатль на рисунок
TColor Transparent;// цвет прозрачности
void UnNormalForm();//наша функция
TColor Transparent;// цвет прозрачности
void UnNormalForm();//наша функция
Код:
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{//выделяем память под битмап
Picture = new Graphics::TBitmap();
//загружаем картинку
Picture->LoadFromFile("pic.bmp");//картинка должна быть
//устанавливаем прозрачный цвет
Transparent = clRed;//на картинке должны быть области RGB(255,0,0)
//настройка стиля и размера формы
Height = Picture->Height; Width = Picture->Width;
UnNormalForm();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{//освободим память от картинки
Picture->Free();
}
//---------------------------------------------------------------------------
void TForm1::UnNormalForm(){//реализация функции
HRGN Result=CreateRectRgn (0,0,0,0);
for(int i=0;i != Picture->Height;++i)
{
int beg=0;
while(beg!=Picture->Width)//цикл сканирующий картинку
{//и ищущий пиксели цвета Transparent
while( beg != Picture->Width && Picture->Canvas->Pixels[beg][i] == Transparent)
++beg;
int end = beg;
while( end != Picture->Width && Picture->Canvas->Pixels[end][i] != Transparent)
++end;
if(beg != end)
{
HRGN tmp = CreateRectRgn (beg,i,end,i+1);//если регионы есть
CombineRgn(Result,Result,tmp,RGN_OR);//запомнить их
DeleteObject(tmp);
beg = end;
}
}//сканирующий цикл
}
SetWindowRgn (Handle,Result,true);//применить к окну
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{//выделяем память под битмап
Picture = new Graphics::TBitmap();
//загружаем картинку
Picture->LoadFromFile("pic.bmp");//картинка должна быть
//устанавливаем прозрачный цвет
Transparent = clRed;//на картинке должны быть области RGB(255,0,0)
//настройка стиля и размера формы
Height = Picture->Height; Width = Picture->Width;
UnNormalForm();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{//освободим память от картинки
Picture->Free();
}
//---------------------------------------------------------------------------
void TForm1::UnNormalForm(){//реализация функции
HRGN Result=CreateRectRgn (0,0,0,0);
for(int i=0;i != Picture->Height;++i)
{
int beg=0;
while(beg!=Picture->Width)//цикл сканирующий картинку
{//и ищущий пиксели цвета Transparent
while( beg != Picture->Width && Picture->Canvas->Pixels[beg][i] == Transparent)
++beg;
int end = beg;
while( end != Picture->Width && Picture->Canvas->Pixels[end][i] != Transparent)
++end;
if(beg != end)
{
HRGN tmp = CreateRectRgn (beg,i,end,i+1);//если регионы есть
CombineRgn(Result,Result,tmp,RGN_OR);//запомнить их
DeleteObject(tmp);
beg = end;
}
}//сканирующий цикл
}
SetWindowRgn (Handle,Result,true);//применить к окну
}
//---------------------------------------------------------------------------
Огромное спасибо Meander!