<font size="2"></span><font size="3"></span>Witam, mam do napisania program w C++ builderze:
-
Zaladowac standardowa bitmape z pliku. Utworzyc DIB o takich samych rozmiarach. Przekopiowac zawartosc bitmapy do DIB. Wyzerowac wszystkie skladowe oprócz czerwonej.Wyswietlic bitmape na formularzu.
-
Jak zmodyfkowac program, aby DIB narysowany na formularzu nie znikal przy przerysowaniu formularza? Jak go odswierzac?
-
Napisac program, który bodzie na calej powierzchni formularza pokazywal powiekszony fragment pulpitu znajdujacy sie pod myszka. Aby zdarzenie OnMouseMove bylo wywolywane poza formularzem, nalezy wcisnac klawisz myszy wewnatrz formularza i nie puszczajac go przesuwac kursorem po calym ekranie.
Napisany przeze mnie fragment programu wygląda następująco
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HBITMAP hbmp=NULL;
BYTE*bitmapa=NULL;
HDC dc=NULL;
TCanvas *c;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DoubleBuffered = true;
Graphics :: TBitmap * bmp = new Graphics :: TBitmap();
bmp -> Width = Image1 -> Width;
bmp -> Height = Image1 -> Height;
Image1 -> Picture -> Assign(bmp);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
BitBlt(Canvas->Handle, 0, 0, Image1 -> Picture -> Width, Image1 -> Picture -> Height, dc, 0, 0, SRCCOPY);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Zakoncz1Click(TObject *Sender)
{
Close();
if(hbmp!=NULL) DeleteObject(hbmp); // Usuwanie bitmapy
if(dc!=NULL)DeleteDC(dc);
if(c!=NULL) delete c; // Usuwanie Canvas
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Wczytaj1Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
Image1 ->Picture -> LoadFromFile(OpenPictureDialog1->FileName);
BITMAPINFOHEADER bi;
memset(&bi,0,sizeof(BITMAPINFOHEADER));
bi.biSize=sizeof(BITMAPINFOHEADER); // Rozmiar tej struktury
bi.biWidth= Image1 -> Picture -> Width; // Szeroko´s´c bitmapy
bi.biHeight= Image1-> Picture -> Height; // Wysoko´s´c bitmapy
bi.biPlanes=1; // Musi by´c równe 1
bi.biBitCount=24; // Ilo´s´c bitów na piksel
bi.biCompression=BI_RGB; // Format bez kompresji
dc=CreateCompatibleDC(Canvas->Handle);
hbmp=CreateDIBSection(dc,(BITMAPINFO*)&bi,
DIB_RGB_COLORS,(VOID**)&bitmapa,NULL,0);
if(hbmp==NULL) ShowMessage("Bitmapa nie utworzona!");
SelectObject(dc,hbmp);
c=new TCanvas();
c->Handle=dc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
BITMAP b;
GetObject(hbmp,sizeof(BITMAP),&b);
Image1->Picture->Bitmap->PixelFormat=pf24bit;
RGBQUAD *kolumna;
int w=Image1->Picture->Bitmap->Width;
int h=Image1->Picture->Bitmap->Height;
for(int x=0;x<h;++x)
{
kolumna=(RGBQUAD*)Image1->Picture->Bitmap->ScanLine[x];
for(int y=0;y<w;++y)
{
int b= kolumna[y].rgbBlue;
int g=kolumna[y].rgbGreen;
int r=kolumna[y].rgbRed;
<b>bitmapa[y*b.bmWidthBytes+x*3]=b;
bitmapa[y*b.bmWidthBytes+x*3+1]=g;
bitmapa[y*b.bmWidthBytes+x*3+2]=r;</b>
}
}
Image->Repaint();
}
//---------------------------------------------------------------------------
W miejscu przeze mnie pogrubionym w czasie kompilacji pojawia się błąd: ?Structure required on left side of . or .*? . Byłbym wdzięczny gdyby ktoś wytłumaczył mi w czym tkwi błąd.
// po cholerę przyklejasz taki wątek? chcesz bana zaliczyć? - Ł