Показать полную графическую версию : [C++Builder 2007] Форма по рисунку
crashtuak
12-04-2009, 17:54
Вот код, по которому форма рисоваться должна по маске void __fastcall TForm1::FormCreate(TObject *Sender)
{
POINT pt;
pt.x = 0; pt.y = 0;
HRGN R1=CreateRgnFromBitmap("C:\\1.bmp",pt,true);
SetWindowRgn(Handle, R1, TRUE);
}
//---------------------------------------------------------------------------
HRGN CreateRgnFromBitmap(Graphics::TBitmap *bmp, TPoint pPoint, bool bEqaul = true)
{
int f, x, y;
bool b = false;
HRGN Rgn, ResRgn = CreateRectRgn(0, 0, 0, 0);
for (y = 0; y < bmp->Height; y++)
for (x = 0; x < bmp->Width; x++)
{
if (!bEqaul^(bmp->Canvas->Pixels[x][y] != bmp->Canvas->Pixels[pPoint.x][pPoint.y]))
{
if (!b)
{ f = x; b = true; }
else
if (x == (bmp->Width - 1))
{
Rgn = CreateRectRgn(f, y, x, y + 1);
CombineRgn(ResRgn, ResRgn, Rgn, RGN_OR);
b = false;
}
}
else
if (b)
{
Rgn = CreateRectRgn(f, y, x, y + 1);
CombineRgn(ResRgn, ResRgn, Rgn, RGN_OR);
b = false;
}
}
return ResRgn;
}
но после компиляции дает ошибку :[BCC32 Error] Unit1.cpp(27): E2148 Default argument value redeclared for parameter 'bEqaul'. Что я делаю не так?
crashtuak
12-04-2009, 18:43
C предыдущей проблемой разобрался, есть новая First chance exception at $7C812AEB. Exception class EAccessViolation with message 'Access violation at address 00401E07 in module 'Project2.exe'. Read of address 2E013A63'. Process Project2.exe (3288). Как побороть? Чувствую я неправильно битмап гружу.
Тут две ошибки:
1) в функции CreateRgnFromBitmap - первый параметр указатель на битмап, а ты передаешь строку - надо вот так:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
POINT pt;
pt.x = 0; pt.y = 0;
Graphics::TBitmap *bmp = new Graphics::TBitmap;
bmp->LoadFromFile("c:\\1.bmp");
HRGN R1=CreateRgnFromBitmap(bmp,pt,true);
SetWindowRgn(Handle, R1, TRUE);
bmp->Free();
}
2) функция CreateRgnFromBitmap реализована ниже чем первый раз используется. Поэтому функция void __fastcall TForm1::FormCreate(TObject *Sender) должна находить ниже ее.
HRGN CreateRgnFromBitmap(Graphics::TBitmap *bmp, TPoint pPoint, bool bEqaul = true)
{
int f, x, y;
bool b = false;
HRGN Rgn, ResRgn = CreateRectRgn(0, 0, 0, 0);
for (y = 0; y < bmp->Height; y++)
for (x = 0; x < bmp->Width; x++)
{
if (!bEqaul^(bmp->Canvas->Pixels[x][y] != bmp->Canvas->Pixels[pPoint.x][pPoint.y]))
{
if (!b)
{ f = x; b = true; }
else
if (x == (bmp->Width - 1))
{
Rgn = CreateRectRgn(f, y, x, y + 1);
CombineRgn(ResRgn, ResRgn, Rgn, RGN_OR);
b = false;
}
}
else
if (b)
{
Rgn = CreateRectRgn(f, y, x, y + 1);
CombineRgn(ResRgn, ResRgn, Rgn, RGN_OR);
b = false;
}
}
return ResRgn;
}
//--------------------------------------------------------------------------- */
void __fastcall TForm1::FormCreate(TObject *Sender)
{
POINT pt;
pt.x = 0; pt.y = 0;
Graphics::TBitmap *bmp = new Graphics::TBitmap;
bmp->LoadFromFile("c:\\1.bmp");
HRGN R1=CreateRgnFromBitmap(bmp,pt,true);
SetWindowRgn(Handle, R1, TRUE);
bmp->Free();
}
crashtuak
13-04-2009, 07:47
1) в функции CreateRgnFromBitmap - первый параметр указатель на битмап, а ты передаешь строку - надо вот так: » Додумался до этого раньше чем ты написал:), но и так спасибо :)2) функция CreateRgnFromBitmap реализована ниже чем первый раз используется. Поэтому функция void __fastcall TForm1::FormCreate(TObject *Sender) должна находить ниже ее. » На счет этого не знаю, у меня как было CreateRgnFromBitmap ниже чем первый раз используется, так и осталось, но зато работает:)
у меня как было CreateRgnFromBitmap ниже чем первый раз используется, так и осталось, но зато работает »
у меня просто BDS без ошибок и зависаний вырубался (как будто и не было его)
crashtuak
13-04-2009, 22:40
у меня просто BDS без ошибок и зависаний вырубался (как будто и не было его) » С ним у меня и не такое было: новою строку начать нажатием ентера невозможно было, а печатая символ вы автоматом стирали следующий:) но потом стало все нормально, а ещё перешел на С++ Билдер 2009 так ваще круто
новою строку начать нажатием ентера невозможно было, а печатая символ вы автоматом стирали следующий » :lol: Так это симптомы случайно нажатой клавиши Insert :biggrin: Нажми её ещё раз и будет счастье. :teeth:
crashtuak
14-04-2009, 19:52
Так это симптомы случайно нажатой клавиши Insert Нажми её ещё раз и будет счастье. » Во блин :) А я тыкал куда попало и все прошло.:). Закрыть бы тему. Я сейчас новую сделаю.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.