DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 2009
-
15 août 2005 à 23:11
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 2009
-
21 août 2005 à 17:25
Donc voila mon probleme : J'ai une appli, j'ai pas envie de boutons ni de Timages ni de composants externes ( j'apprends) dedans, et je travaille avec des if PtInRegion(....) et les onMouseUp/down de la form. Jusque là facile. Apres j'ai deux bitmaps, de la taille de la form, l'un présentant la form avec tout les boutons "éteint", et l'autres tout les boutons "allumés".
Le but étant lorsque j'ai le OnMouseDown dans une région, de repeindre la dite région (donc de repeindre localement le canvas de ma form) avec le bouton allumé, prélevé dans le bitmap idoine, aux coordonnées adéquates. Et de meme avec le onMouseUp, donc.
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008 16 août 2005 à 04:13
var
Form1: TForm1;
BitmapBoutonUp:TBitmap;
BitmapBoutonDown:TBitmap;
implementation
{$R *.dfm}
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
case X of // si coordonné x de la zone du bouton
1..100: case Y of
1..100:begin // si coordonné Y de la zone du bouton
canvas.Draw(1,1,BitmapBoutonDown);
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
BitmapBoutonUp:=TBitmap.Create;
BitmapBoutonUp.LoadFromFile('c:\BitmapBoutonUp.bmp');
// load from ressource ou autre ...
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(BitmapBoutonUp);
FreeAndNil(BitmapBoutonDown);
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
case X of
1..100: case Y of
1..100:begin
canvas.Draw(1,1,BitmapBoutonUp);
end;
end;
end;
end;
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 16 août 2005 à 10:20
Merci.... Ca ne repeint qu'un pixel a chaque fois, ou bien ? Mon probleme est de repeindre une région cliquée en entier.
Je pense qu'un GetRgnBox pour avoir le rectangle englobant de la région et une recopie pixel a pixel avec test de PtInRegion pourrait marcher, mais ca risque pas de ramer ?
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 17 août 2005 à 00:01
Bon, c'est jouissif ce truc, entre getcursor (qui marche pas lors d'un evenement onclick) et les x,y d'un onclick (par exemple) qui ne travaillent pas dans les meme coordonnées ( form.left et form.top a ajouter)
et ces foutues régions qui elles sont définie dans les unités écran encore différentes, je rame !
On va dire que ca marche, Delphi me dit que BrushCopy est dépassé, et mes régions sont rectangulaires, donc ne présentent aucun interet, vu que truc ci dessus recopie un rectangle, je pouvais bosser avec des Timages....
Pour profiter des régions pleinement reste a recopier les bons pixels (ceux de la région) et pas tous.
HRegion:=CreateEllipTicRgn(0,0,100,100);
//HRegion c'est la région du bouton, devrais correspondre avec
//l'image du bouton que l'on va dessiner plus tard (selectClipRgn(Canvas.Handle,HRegion);...)
SelectClipPath(HRegion,Rgn_Copy);
// select englobe tous les points pour vérification futur ,ça pourrait
// être l'union de 3 HRegion .Wow Tout un Bouton etc..
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// donc Si ça correspond à la zone cliquer
if(PtInRegion(HRegion,X,Y)=true)then
begin
//on détermine la zone de dessin ,ici l'ellipse seulement
selectClipRgn(Canvas.Handle,HRegion);
//et on copie l'image bitmap sur le canvas
BitBlt(Form1.Canvas.Handle,//la fenêtre de destination
0,//coordonné Horizontale du rectangle de destination
0,//coordonné Verticale du rectangle de destination
100,//la largeur Width du rectangle de destination
100,//la Hauteur Height du rectangle de destination
BitmapBoutonDown.Canvas.Handle,//la fenêtre source
0,//coordonné Horizontale du rectangle source
0,//coordonné Verticale du rectangle source
SrcCopy);//Raster Operation Code //
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if(PtInRegion(HRegion,X,Y)=true)then
begin
selectClipRgn(Canvas.Handle,HRegion);
BitBlt(Canvas.Handle,0,0,100,100,BitmapBoutonUp.Canvas.Handle,0,0,SrcCopy);
//Idem avec l'autre Bitmap
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(BitmapBoutonUp);
FreeAndNil(BitmapBoutonDown);
DeleteObject(HRegion);
//et on libère les objets
end;
end.
Bon, je me suis amuser un peu , recherche Win32 Core API ,c'est plutôt assez complet ce que l'on peut faire avec api de windows...
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 17 août 2005 à 15:16
Marche pas.
Si je mets "selectClipRgn(Canvas.Handle,HRegion);", ca ne repeint pas.
Avec 0 ( le hndl du deviceContext du bureau) à la place de Canvas.Handle, ok, ca repeint.
J'ai fait ca :
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var RectPaint: Trect;
CurrRgn:Integer;
begin
if PtInRegion(RgnPRV,X+Form1.Left,Y+Form1.Top) then
CurrRgn:=RgnPRV;
if PtInRegion(RgnPLAY,X+Form1.Left,Y+Form1.Top) then
CurrRgn:=RgnPLAY;
if PtInRegion(RgnPAUS,X+Form1.Left,Y+Form1.Top) then
CurrRgn:=RgnPAUS;
if PtInRegion(RgnSTOP,X+Form1.Left,Y+Form1.Top) then
CurrRgn:=RgnSTOP;
if PtInRegion(RgnNXT,X+Form1.Left,Y+Form1.Top) then
CurrRgn:=RgnNXT;
if (CurrRgn = RgnPRV) or
(CurrRgn = RgnPLAY) or
(CurrRgn = RgnPAUS) or
(CurrRgn = RgnSTOP) or
(CurrRgn = RgnNXT) then
begin
GetRgnBox(CurrRgn,RectPaint);
selectClipRgn(0,CurrRgn);
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 19 août 2005 à 11:12
Rien que cette instruction là n'a pas l'air de marcher de la meme manière chez toi et chez moi.
selectClipRgn(Form1.Canvas.Handle,CurrRgn);
Avec le handle du canvas de la form (ci-dessus) ,il ne se passe strictement rien chez moi. Si je le remplace par zéro c'est à dire le handle du bureau windoz, la ca marche, ca repeint, le bitblt remplit son office (mais il recopie tout les pixels du rectangle englobant la region).
Ca peut etre lié à mon O.S., je suis sous win98se. Je n'en sais rien.
Si tu veux jeter un oeil au source complet je peux l'uploader quelque part.