[quote="tom_85"]no tak... przepraszam że się nie odzywałem oraz dziękuje za pomoc, bardzo się przydały Wasze podpowiedzi
chodziło mi o to żeby po zwiększeniu formy obiekt image dalej zajmował cały dostępny obszar, żeby piksele nie były rozciągnięte oraz żeby kursor nie był tak "dziwnie" skalowany. Problem jest już rozwiązany... co prawda nie potrafiłem poradzić sobie z tym w obiekcie Image ale za to w obiekcie PaintBox wszystko mi działa tak jak chciałem
Jak zwykle nieocenioną pomocą okazała się strona
http://cyfbar.republika.pl która moim zdaniem jest lepsza od każdej książki o języku C++.
Niestety pojawił się następny problem... otóż chciałem wczytywać obrazek z pliku, no i przy pierwszym wczytaniu zawsze wszystko jest ok ale przy kolejnym... drugim, trzecim, czwarty... gdy najadę kursorem nad listę plików (w otwartym okienku OpenPictureDialog) to program mi się po prostu wyłącza :/ podobnie dziej się gdy próbuje wczytać obrazek za pomocą OpenDialog. Na początku myślałem że to wina programu (bo po wczytaniu zamieniam obrazek na 8-kolorowy) ale okazało się że nie :/ Zrobiłem sobie formę na którą wrzuciłem tylko OpenPictureDialog no i to samo się dzieje :/ Więc to chyba wina tych komponentów... da się to jakoś "naprawić" ??
- Kod: Zaznacz cały
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
bmp = new Graphics::TBitmap();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClick(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
bmp->LoadFromFile(OpenPictureDialog1->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete bmp;
}
chyba że przed ponownym wczytaniem do bmp trzeba go jakoś "wyczyścić" albo zwolnić pamięć ?? chociaż też próbowałem już kilku funkcji które niestety nic nie dawały :/
--------------------------------------------------------
tak w ramach ścisłości wklejam kod "właściwego" programu
- Kod: Zaznacz cały
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
bool pioro = 0;
TPoint pozycja;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DoubleBuffered = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
bmp = new Graphics::TBitmap();
Image1->Picture->Bitmap->LoadFromResourceName((int)HInstance, "MENUKOLORY");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete bmp;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
pioro = 1;
pozycja = Point(X, Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
pioro = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if(pioro)
{
PaintBox1->Canvas->MoveTo(pozycja.x, pozycja.y);
bmp->Canvas->MoveTo(pozycja.x, pozycja.y);
pozycja = Point(X, Y);
PaintBox1->Canvas->LineTo(X, Y);
bmp->Canvas->LineTo(X, Y);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)
{
if(CSpinEdit1->Value < 1)
CSpinEdit1->Value = 1;
else if(CSpinEdit1->Value > 100)
CSpinEdit1->Value = 100;
else
{
PaintBox1->Canvas->Pen->Width = CSpinEdit1->Value;
bmp->Canvas->Pen->Width = CSpinEdit1->Value;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Otwrzbmp1Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
{
bmp->LoadFromFile(OpenPictureDialog1->FileName);
Form1->Width = bmp->Width + 98;
Form1->Height = bmp->Height + 73;
PaintBox1->Canvas->Draw(0, 0, bmp);
//--- konwersja na 8 kolorów ---
TColor kolor;
byte rv, gv, bv;
for(int i = 0; i < bmp->Height; ++i)
{
for(int j = 0; j < bmp->Width; ++j)
{
kolor = bmp->Canvas->Pixels[j][i];
rv = GetRValue(kolor);
gv = GetGValue(kolor);
bv = GetBValue(kolor);
(rv >127) ? (rv = 255) : (rv = 0);
(gv >127) ? (gv = 255) : (gv = 0);
(bv >127) ? (bv = 255) : (bv = 0);
bmp->Canvas->Pixels[j][i] = RGB(rv, gv, bv);
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Zapiszbmp1Click(TObject *Sender)
{
if(SavePictureDialog1->Execute())
bmp->SaveToFile(SavePictureDialog1->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
bmp->Width = PaintBox1->Width;
bmp->Height = PaintBox1->Height;
PaintBox1->Canvas->Draw(0, 0, bmp);
}
Było oczywiście więcej problemów ale jakoś sobie z nimi poradziłem
na stronie Pana Profesora był kod do zmiany poszczególnych kolorów w pikselach z wykorzystaniem funkcji ScanLine ale mi jakoś nie chciał działać bo co 3 piksel chyba funkcja opuszczała... jeszcze miałem trochę problemów z tym odświeżaniem tego wszystkiego ale poradziłem sobie z tym tak że jednocześnie rysuje po PaintBox i po bmp i w zdarzeniu onPaint obiektu PaintBox przerysowywuje to sobie