Metre de la couleur dans une region

Signaler
Messages postés
6
Date d'inscription
dimanche 12 novembre 2000
Statut
Membre
Dernière intervention
6 mars 2007
-
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
-
Voila ca doit etre tout bête mais je n'y arrive pas donc j'ai une variable



Region : array [1..15] of HRgn; (j'ai mis les coordonnées de la region dans un tablaeu)


Donc je crée les regions ca ya pas de problème :





for r:=1 to 15 do //Création des régions


Region[r]:=CreateRectRgn(Coord[r,1].X+imJeux.Left,Coord[r,1].Y+imJeux.Top,Coord[r,2].X+imJeux.Left,Coord[r,2].Y+imJeux.Top);



end;


Et j'aimerai mettre un peu de couleur a l'intérieur..... comment faire ???

4 réponses

Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
4
Salut,

Pour remplir une région, tu peux utiliser la fonction FillRgn (ou
PaintRgn). Pour la fonction FilleRgn, ton code pourrait ressembler à ça
:





var

Brush : HBRUSH;

DC : HDC;

Couleur : Array[0..15] of TColor;


[.....]



begin

[.....]

DC := GetWindowDC(Handle);



for r:=1 to 15 do

begin



Brush
:= CreateSolidBrush(Couleur[r]);
FillRgn(DC,Region[r],
Brush
);
DeleteObject(
Brush
);

end;

[.....]

end;



Ken@vo



Code, Code, Codec !

Messages postés
6
Date d'inscription
dimanche 12 novembre 2000
Statut
Membre
Dernière intervention
6 mars 2007

merci d'avoir repondu a cette question aussi rapidement, j'ai essayer mais rien n'est afficher... je ne comprend a cause de quoi.... si tu as une idée elle est la bienvenue

En fait quel est la différence entre PaintRgn et FillRgn ???

et à quoi sert DC ??? Que veux dire DC:=GetWindowDC(Handle); ??? cela sert a quoi ???

merci d'avance pour les réponses que tu pourrais m'apporter
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
4
Salut,

Il y a une aide (SDK
Windows
) qui répondra de façon bien plus précise et complète que moi.

J'ai mis
DC:=GetWindowDC(Handle), mais j'aurai pu mettre DC:=GetDC(Handle) ou pour dessiner sur un panel DC:=
GetDC(MonPanel.Handle)
. Il faut savoir où on veut dessiner.


Je ne sais pas ce
que tu veux faire, mais si c'est pour dessiner les
rectangles de couleurs, utiliser sans les connaître les fonctions du
GDI me parait bien téméraire. L'utilisation du canvas et de ses
méthodes me semble plus simple.



Petite précision : un appel à la fonction ReleaseDC(Handle,DC) à la fin de la boucle est fortement recommandé.




Ken@vo



Code, Code, Codec !

Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
2
J'ai modifié un petit peu la déclaration des regions :

var
Regions : array [1..15] of record
Handle : HRgn ;
Couleur : TColor ;
end ;

A ta fiche principale, tu rajoutes un bouton de nom "BoutonTest", et sur l'evenement OnClick de celui ci tu copies le code suivant :

procedure TForm1.BoutonTestClick(Sender: TObject);
var
r : integer ;
Brush : HBRUSH;
DC : HDC;
begin
for r:=1 to 15 do
begin
with Regions[r] do
begin
// Création des régions aléatoirement ( valeur allant de 0 à 199, et couleur aléatoire)
Handle:=CreateRectRgn ( random(200),random(200),random(200),random(200));
Couleur := RGB( random(256),random(256),random(256) ) ;

// Ici on récupère le "device context" de la fiche principale
// (le DC sous windows représente à peu de chose près le canvas sous delphi)
DC := GetWindowDC(Form1.Handle);

// création d'une brosse pour dessiner à la couleur de la region
Brush := CreateSolidBrush(Couleur);

// Remplissage de la région
FillRgn(DC,Handle,Brush);

// Suppression des divers objets créés
DeleteObject(Brush);
ReleaseDC(Handle,DC);
DeleteObject(Handle);
end;
end ;
end;

Ce que l'on constate après avoir lancé le code ci dessus, c'est que l'on dessine sur la fiche mais également sur tous les composants qui se trouvent en dessous de la zone délimitée par le carré [0..199,0..199]. ATTENTION, pour Windows, le point (0,0) correspond au coin haut gauche de la fiche (F) et non au coin haut gauche de la zone client (C).
__________________
|F CAPTION
|__________________
|C ZONE CLIENT
|
|

Eh oui c'est ça lorsque l'on s'attaque aux API Windows, y'a beaucoup plus de travailles à faire !!

Donc pour pouvoir dessiner dans une zone spécifique, il faudra calculer ses coordonnées à partir du coin haut gauche de la fiche.

Si tu rajoutes un composant TShape rectangle sur ta fiche, il va te permettre de déterminer la zone où l'on souhaite dessiner. Le code devient alors :

procedure TForm1.Button2Click(Sender: TObject);
var
r : integer ;
Brush : HBRUSH;
DC : HDC;
CoordCanvas : Tpoint;
CoordDC : Tpoint;
begin
for r:=1 to 15 do //Création des régions
begin
with Region[r] do
begin
// On récupère les coordonnées Canvas de la forme
CoordCanvas.X := Shape1.Left;
CoordCanvas.Y := Shape1.Top ;

// On les convertit en coordonnées écran
CoordDC := ClientToScreen( CoordCanvas ) ;

// On leur ajoute ensuite les coordonnées du coin haut gauche de la fiche (F)
// Ce qui nous donne la position du TShape par rapport au coin (F)
CoordDC.X := CoordDC.X - Form1.Left ;
CoordDC.Y := CoordDC.Y - Form1.Top ;

// On crée les regions aléatoirement en tenant compte de l'origine du TShape
// en coordonnées "DC" et de sa taille
Handle:=CreateRectRgn ( CoordDC.X + random( Shape1.Width )
, CoordDC.Y + random( Shape1.Height )
, CoordDC.X + random( Shape1.Width )
, CoordDC.Y + random( Shape1.Height )
) ;

// Le reste est identique
Couleur := RGB( random(256),random(256),random(256) ) ;
DC := GetWindowDC(Form1.Handle);
Brush := CreateSolidBrush(Couleur);
FillRgn(DC,Handle,Brush);
DeleteObject(Brush);
ReleaseDC(Handle,DC);
DeleteObject(Handle);
end ;
end ;
end;

Voila, à l'execution du code , on dessine les regions dans la zone représentée (et non définie !!) par le TShape.

Cordialement.