lp0683
Messages postés20Date d'inscriptionjeudi 30 novembre 2000StatutMembreDernière intervention21 mars 2010
-
18 avril 2009 à 16:55
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
18 avril 2009 à 18:22
Bonjour à tous :)
J'ai un petit soucis, malgrè que je me soit baladé dans les diverse surjet parlant de ca, j'ai toujours rien trouvé.
Je creer dynamiquement une ScrollBox contenant des TImages pour creer une map. Celle-ci fait 750 x 600.
Le soucis c'est que je veux creer une mape de 40 x 40 par exemple et sachant qu'un TImage fait 25x25 ca fait plus que la taille de la scrollBox ^^
Donc il apparait une scrollBar. C'est bien mignon tout ca, je pensait avoir finit depuis quelques temps mon editeur de map, mais en y revenant aujourd hui, je me rend compte d'un truc facheux, le maximum que je peu avoir en coordonné pour mon tableau de TImages (qui est visible dans ma ScrollBox) va jusqu'a 28 en largeur.
Je me suis penché sur le soucis, en faite, la scrollbar ne sert a rien puisque je calcule la position de la TImage voulue en fonction du bord
j := round(((Sender As TImage).Left)/25);
i := round(((Sender As TImage).Top)/25);
Et donc le defilement n'est pas prit en compte.
J'aurai aimé savoir comment faire la même chose mais en additionnant par exemple la position de ma scrollBar de ma scrollBox à la position de I et J. Comme ca je ne suis pas limité dans la taille de ma map :)
var
BMP : TBitmap; // Image en cache BMPOk : boolean false; // false pas d'image chargée pour l'instant
BMPPt : TPoint = (X:0; Y:0); // Coordonnées du coin supérieur gauche de BMP dans la paintbox
ClikPt: TPoint = (X:0; Y:0); // Coordonnées du click souris en vus du déplacement de BMP
procedure TForm2.FormCreate(Sender: TObject);
begin
DoubleBuffered := true; // Évite le scintillement quand refresh
BMP := TBitmap.Create; // Création du cache pour l'image
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
BMP.Free; // Libération du cache de l'image
end;
procedure TForm2.Open1Click(Sender: TObject);
var PIC : TPicture; // Permet de charger une image BMP, JPG ou PNG
begin
if OpenPictureDialog1.Execute then
begin
PIC := TPicture.Create; // Création
try
PIC.LoadFromFile(OpenPictureDialog1.FileName); // Chargement de l'image
BMP.Width := PIC.Width; // Longueur
BMP.Height := PIC.Height; // Hauteur
BMP.PixelFormat := pf32bit; // Profondeur des couleurs
BMP.Canvas.Draw(0,0,PIC.Graphic); // Transfert
BMPOk := true; // L'image est chargée
PaintBox1.Repaint; // Rafraichissement
finally
PIC.Free; // Libération
end;
end;
end;
procedure TForm2.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// Quand on clique sur la PaintBox
ClikPt.X := X - BMPPt.X; // Récupération et calcul en X du clic
ClikPt.Y := Y - BMPPt.Y; // Récupération et calcul en Y du clic
end;
procedure TForm2.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in Shift then // Si le bouton gauche est enfoncé
begin
BMPPt.X := X - ClikPt.X; // Calcul de la coordonnée en X de BMP dans la paintbox
BMPPt.Y := Y - ClikPt.Y; // Calcul de la coordonnée en Y de BMP dans la paintbox
PaintBox1.Repaint; // on redessine
end;
end;
procedure TForm2.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ClikPt.X := 0; // RAZ
ClikPt.Y := 0; // RAZ
end;
procedure TForm2.PaintBox1Paint(Sender: TObject);
begin
if BMPOk then // Si une image est chargée
(Sender as TPaintBox).Canvas.Draw(BMPPt.X, BMPPt.Y, BMP); // on dessine
end;
end.
pour le reste, c'est du calcul primaire du même acabit, simple...