Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [C++Builder 2007] Форма по рисунку (http://forum.oszone.net/showthread.php?t=137501)

crashtuak 12-04-2009 17:54 1091973

[C++Builder 2007] Форма по рисунку
 
Вот код, по которому форма рисоваться должна по маске
Код:

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 1092030

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)
. Как побороть? Чувствую я неправильно битмап гружу.

Alan85 12-04-2009 21:49 1092173

Тут две ошибки:
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 1092449

Цитата:

Цитата Alan85
1) в функции CreateRgnFromBitmap - первый параметр указатель на битмап, а ты передаешь строку - надо вот так: »

Додумался до этого раньше чем ты написал:), но и так спасибо :)
Цитата:

Цитата Alan85
2) функция CreateRgnFromBitmap реализована ниже чем первый раз используется. Поэтому функция void __fastcall TForm1::FormCreate(TObject *Sender) должна находить ниже ее. »

На счет этого не знаю, у меня как было CreateRgnFromBitmap ниже чем первый раз используется, так и осталось, но зато работает:)

Alan85 13-04-2009 07:53 1092453

Цитата:

Цитата crashtuak
у меня как было CreateRgnFromBitmap ниже чем первый раз используется, так и осталось, но зато работает »

у меня просто BDS без ошибок и зависаний вырубался (как будто и не было его)

crashtuak 13-04-2009 22:40 1093251

Цитата:

Цитата Alan85
у меня просто BDS без ошибок и зависаний вырубался (как будто и не было его) »

С ним у меня и не такое было: новою строку начать нажатием ентера невозможно было, а печатая символ вы автоматом стирали следующий:) но потом стало все нормально, а ещё перешел на С++ Билдер 2009 так ваще круто

Drongo 14-04-2009 12:07 1093635

Цитата:

Цитата crashtuak
новою строку начать нажатием ентера невозможно было, а печатая символ вы автоматом стирали следующий »

:lol: Так это симптомы случайно нажатой клавиши Insert :biggrin: Нажми её ещё раз и будет счастье. :teeth:

crashtuak 14-04-2009 19:52 1094031

Цитата:

Цитата Drongo
Так это симптомы случайно нажатой клавиши Insert Нажми её ещё раз и будет счастье. »

Во блин :) А я тыкал куда попало и все прошло.:). Закрыть бы тему. Я сейчас новую сделаю.


Время: 23:42.

Время: 23:42.
© OSzone.net 2001-