Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1294 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Auteur Sujet :

[affichage 2D] recherche solution... pb de couleurs.... (ça marche !)

n°144035
youdontcar​e
Posté le 24-05-2002 à 15:22:33  profilanswer
 

Reprise du message précédent :
tu devrais songer à potasser sérieusement win32 ...  
 
et à lire la DOC ! :)
 
hBitmap := CreateCompatibleBitmap(Canvas.Handle, Width, Height);  
hBitmapDC := CreateCompatibleDC(hBitmap);
SelectObject(hBitmapDC, hBitmap);  
 
je comprends même pas comment ça peut compiler ...
 
il faut :
 
* créer un dc compatible
* créer une image
* la sélectionner dans le dc
 
hBitmapDC := CreateCompatibleDC(Canvas.Handle);  
hBitmap := CreateCompatibleBitmap(hBitmap, Width, Height);  
SelectObject(hBitmapDC, hBitmap);

mood
Publicité
Posté le 24-05-2002 à 15:22:33  profilanswer
 

n°144044
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 24-05-2002 à 15:27:19  profilanswer
 

youdontcare a écrit a écrit :

 
hBitmap := CreateCompatibleBitmap(hBitmap, Width, Height);  




 

Citation :


The CreateCompatibleBitmap function creates a bitmap compatible with the device that is associated with the specified device context.  
 
HBITMAP CreateCompatibleBitmap(
  HDC hdc,        // handle to DC
  int nWidth,     // width of bitmap, in pixels
  int nHeight     // height of bitmap, in pixels
);
 


 
 
heu.. t'as p'têtre fait une faute de frappe mais ton hBitMap, c'est pas un hdc ;) ... mais je vois ce ke tu veux dire... ;)


---------------
Boolay for ever...
n°144045
youdontcar​e
Posté le 24-05-2002 à 15:29:09  profilanswer
 

Moustaaki a écrit a écrit :

heu.. t'as p'têtre fait une faute de frappe mais ton hBitMap, c'est pas un hdc ;) ... mais je vois ce ke tu veux dire... ;)


effectivement, je me suis trompé. c'est hbitmapDC of course ;)

n°144048
antp
Super Administrateur
Champion des excuses bidons
Posté le 24-05-2002 à 15:30:23  profilanswer
 

youdontcare a écrit a écrit :

 
hBitmapDC := CreateCompatibleDC(Canvas.Handle);  
hBitmap := CreateCompatibleBitmap(hBitmap, Width, Height);
SelectObject(hBitmapDC, hBitmap);  




 
:non:
 
hBitmap := CreateCompatibleBitmap(hBitmapDC, Width, Height);
 
:D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°144050
antp
Super Administrateur
Champion des excuses bidons
Posté le 24-05-2002 à 15:30:51  profilanswer
 

pfff je suis trop lent là :/


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°144051
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 24-05-2002 à 15:30:56  profilanswer
 

Code :
  1. procedure TSpectrumControl.CreateWnd;
  2. begin
  3.    inherited;
  4. hBitmapDC := CreateCompatibleDC(Canvas.Handle);
  5.    hBitmap := CreateCompatibleBitmap(hBitmapDC, Width, Height);
  6. SelectObject(hBitmapDC, hBitmap);
  7. end;


 
 
oui :) effectivement, ça marche bp mieux comme ça ;)
mes neuronnes ayant lu la doc en du se deconnecter le tps ke j'ouvre delphi :D
dsl ;)
le paintWnd fonctionne maintenant, ya juste le blit pour l'affichage d'une colonne ki foire mais j'ai du faire une conneries dans le même style... j'vais voir ça ;)


---------------
Boolay for ever...
n°144076
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 24-05-2002 à 15:44:37  profilanswer
 

aller antp, elle est pout toi celle là ;)
 
comportement étrange de la part de mon prog (pas si étrange ke ça vu ma façon de programmer ;))
 

Code :
  1. TSpectrumControl = class (TCustomControl)
  2.    private
  3.       hBitmap: HWnd;
  4.       hBitmapDC: HDC; // Device context compatible pour le bitmap.
  5.    protected
  6.       procedure PaintWindow(DC: HDC); override;
  7.    public
  8.       procedure CreateWnd; override;
  9.       procedure DestroyWnd; override;
  10.       procedure blitColumn(col: integer);
  11.       procedure fillSurface;
  12. end;
  13. implementation
  14. uses Types, Graphics;
  15. procedure TSpectrumControl.CreateWnd;
  16. begin
  17.    inherited;
  18. hBitmapDC := CreateCompatibleDC(Canvas.Handle);
  19.    hBitmap := CreateCompatibleBitmap(hBitmapDC, Width, Height);
  20. SelectObject(hBitmapDC, hBitmap);
  21. end;
  22. procedure TSpectrumControl.DestroyWnd;
  23. begin
  24.    inherited;
  25.    DeleteObject(hBitmap);
  26. DeleteDC(hBitmapDC);
  27. end;
  28. {
  29.    blit une colonne formée par des pixels de couleurs "aléatoires".
  30.    // faudra ensuite faire une méthode ki affiche à partir d'un buffer.
  31. }
  32. procedure TSpectrumControl.blitColumn(col: integer);
  33. var
  34.    i: integer;
  35.    couleur: TColor;
  36. begin
  37.    couleur := clRed;
  38.    for i:= 0 to Width do begin
  39.       if (setPixel(hBitmapDC, Col, i, couleur) = -1) then begin
  40.          MessageBox(Handle, 'Error@blitColumn@TSpectrumControl :  could not paint on DC ','error', MB_OK);
  41.          Exit;
  42.       end;
  43.       couleur := TColor(couleur + i*Col);
  44.    end;
  45.    BitBlt(Canvas.Handle, Col, 0, 1, Height, hBitmapDC, Col, 0, SRCCOPY);
  46. end;
  47. procedure TSpectrumControl.PaintWindow(DC: HDC);
  48. begin
  49.    inherited;
  50. BitBlt(DC, 0, 0, Width, Height, hBitmapDC, 0, 0, SRCCOPY);
  51. end;
  52. procedure TSpectrumControl.fillSurface;
  53. begin
  54.    with canvas do begin
  55.       Brush.Color := clBlack;
  56.       FillRect(ClipRect);
  57.    end;
  58.    FillRect(hBitmapDC, canvas.ClipRect, GetStockObject(BLACK_BRUSH));
  59. end;
  60. end.


 
 
le pb :
j'ai fait une boucle dans mon main ki se déclenche kan on appuie sur un bouton : de 0 à la taille du composant, j'appelle blitColumn(indiceDeParcours);  
la première fois, ça marche nickel. la seconde, faut appeller implicitement paintWnd en cachant la fenêtre et en la remontrant pour ke le "spectre" s'affiche...
sinon, fillSurface marche nickel.


---------------
Boolay for ever...
n°144089
youdontcar​e
Posté le 24-05-2002 à 15:49:06  profilanswer
 

InvalidateRect() ...

n°144091
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 24-05-2002 à 15:49:48  profilanswer
 

youdontcare a écrit a écrit :

InvalidateRect() ...  



mici :)


---------------
Boolay for ever...
n°144166
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 24-05-2002 à 16:35:41  profilanswer
 

heu kestion conne : pourkoi ça marche le premier coup et pas après ?
 
rque :  j'ai bô tourner mon rect dans tous les sens, le InvalidateRect attend l'appel de beginPaint pour afficher d'après la doc... ainsi, c'est affiché ka la fin de la boucle ki appelle blitColumn...
 
 
la doc :

Citation :


The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT message occurs or until the region is validated by using the ValidateRect function.  


 
donc, ça ne fait rien tant k'il nya pas WM_PAINT appelé... ça ne fait que le rajouter dans une "pile" de raffraichissement...
 
et ValidateRect

Citation :


This function validates the client area within a rectangle by removing the rectangle from the update region of the specified window.


si je comprend bien, ça te supprime la région de la fenêtre  spécifiée par les coordonnées du rectangle de la pile de raffraichissement.
 
 
 
bon, ça marche si on fait un paintWnd à chaque fois mais ça clignote et ça ralentit...
 
 
 
 
 
MAIS POURKOI ça MARCHE BIEN LE PREMIER COUP ???! :??:

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 24-05-2002 à 16:47:27--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
mood
Publicité
Posté le 24-05-2002 à 16:35:41  profilanswer
 

n°144232
Willyzekid
Posté le 24-05-2002 à 18:02:25  profilanswer
 

J'ai pas lu le reste du topic mais tu m'as pas l'air familié avec Win32.
 
InvalidateRect dit juste a windows que ta fénetre a besoin d'être repeinte...Autrement dit, après un InvalidateRect, windows va insérer le message WM_PAINT dans la file des messages.
Tu auras donc un appel a tes opérations sous WM_PAINT (que c'est mal dit!!)
 
Montre voir ta file de dispaching des messages....


---------------
Horizon pas Net, reste à la buvette!!
n°144235
Willyzekid
Posté le 24-05-2002 à 18:05:26  profilanswer
 

Moustaaki a écrit a écrit :

 
 
 
bon, ça marche si on fait un paintWnd à chaque fois mais ça clignote et ça ralentit...
 




 
Ton PaintWindow(DC: HDC); tu l'appelle quand?
(oui je racroche le topic au milieu et alors? :) )


---------------
Horizon pas Net, reste à la buvette!!
n°144240
HelloWorld
Salut tout le monde!
Posté le 24-05-2002 à 18:25:43  profilanswer
 

Au fait, en passant juste comme ça, tu avais jeté un coup d'oeil à TBitmap ... ?
 

Citation :

La classe TBitmap est l'encapsulation d'un objet Windows HBITMAP et HPALETTE.
 
En-tête
 
vcl/graphics.hpp
 
Description
 
TBitmap contient l'image interne du graphique bitmap et gère automatiquement la réalisation de la palette. Un bitmap est un objet graphique puissant, utilisé pour créer, manipuler (mise à l'échelle, défilement, rotation ou dessin) et stocker des images comme fichiers sur disque.
Pour dessiner un bitmap dans un canevas, appelez la méthode Draw ou StretchDraw d'un objet TCanvas en lui transmettant comme paramètre un objet TBitmap.
La création de copies d'un objet TBitmap est très rapide puisque ce sont les handles qui sont copiés et pas l'image elle-même. Si l'image est modifiée, alors que le handle est partagé par plusieurs objets TBitmap, l'image est réellement dupliquée avant d'effectuer les modifications.


 
T'aurais peut être juste eu le blit à coder toi même ...
Sinon n'oublie pas de poster tout le code une fois que ça marche ;)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°144242
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 24-05-2002 à 18:26:06  profilanswer
 

Willyzekid a écrit a écrit :

 
 
Ton PaintWindow(DC: HDC); tu l'appelle quand?
(oui je racroche le topic au milieu et alors? :) )  




 
je le fait à la fin de ma fonction procedure TSpectrumControl.blitColumn(col: integer);  soit après le invalidate pour le forcer à afficher ce ki est dans la pile d'affichage.... mais c pa top. ça clignote, c pas bô et c lent...
 
 
mais kelkun peut m'expliquer pourkoi ça fonctionne une fois mais pas 2 ?

n°144246
HelloWorld
Salut tout le monde!
Posté le 24-05-2002 à 18:31:55  profilanswer
 

Code :
  1. procedure TSpectrumControl.blitColumn(col: integer);
  2. var
  3.   i: integer;
  4.   couleur: TColor;
  5. begin
  6.   couleur := clRed;
  7.   for i:= 0 to Width do begin
  8.      if (setPixel(hBitmapDC, Col, i, couleur) = -1) then begin
  9.         MessageBox(Handle, 'Error@blitColumn@TSpectrumControl :  could not paint on DC ','error', MB_OK);
  10.         Exit;
  11.      end;
  12.      couleur := TColor(couleur + i*Col);
  13.   end;
  14.   BitBlt(Canvas.Handle, Col, 0, 1, Height, hBitmapDC, Col, 0, SRCCOPY);
  15. end;


 
c'est pas plutôt Height ? ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°144277
Willyzekid
Posté le 24-05-2002 à 19:29:46  profilanswer
 

Moustaaki a écrit a écrit :

 
 
je le fait à la fin de ma fonction procedure TSpectrumControl.blitColumn(col: integer);  soit après le invalidate pour le forcer à afficher ce ki est dans la pile d'affichage.... mais c pa top. ça clignote, c pas bô et c lent...
 
 
mais kelkun peut m'expliquer pourkoi ça fonctionne une fois mais pas 2 ?  




 
Comprend pas trop. Dans TSpectrumControl.blitColumn(col: integer)  je vois pas d'appel à PaintWindows. En fait, je voudrais avoir tout ton code (surtout ce qui concerne l'affichage):
- récupération des messages
- les procedures d'affichages et à quelle moment elles sont appellées (notamment blitColumn(col: integer) et PaintWindow(DC: HDC)).
 
C'est là dessus que le problème se pose sans doute....A voir!


---------------
Horizon pas Net, reste à la buvette!!
n°144340
HelloWorld
Salut tout le monde!
Posté le 24-05-2002 à 21:07:22  profilanswer
 

Citation :

Comprend pas trop. Dans TSpectrumControl.blitColumn(col: integer)  je vois pas d'appel à PaintWindows. En fait, je voudrais avoir tout ton code (surtout ce qui concerne l'affichage):  
- récupération des messages  
- les procedures d'affichages et à quelle moment elles sont appellées (notamment blitColumn(col: integer) et PaintWindow(DC: HDC)).


 
PaintWindows affiche toute la fenêtre (500 colonnes).
blitColumn n'affiche qu'une colonne ...
les procédures d'affichage ce sont les blit. Les 2 procedures ci dessus sont les 2 procedure d'affichage (partiel et total).
c'est du Delphi. Y'a pas de récupération des msg. c'est Delphi qui le fait et qui appelle automatiquement PainWindow lors de WM_PAINT.
blitColumn est appelée après le calcul d'une colonne.
 
 
Au fait, je me suis apperçu qu'il faut mieux utiliser SetPixelV à la place de SetPixel.

 

[jfdsdjhfuetppo]--Message édité par HelloWorld le 24-05-2002 à 21:13:18--[/jfdsdjhfuetppo]


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°144369
Willyzekid
Posté le 24-05-2002 à 22:05:25  profilanswer
 

HelloWorld a écrit a écrit :

 
 
PaintWindows affiche toute la fenêtre (500 colonnes).
blitColumn n'affiche qu'une colonne ...
les procédures d'affichage ce sont les blit. Les 2 procedures ci dessus sont les 2 procedure d'affichage (partiel et total).
c'est du Delphi. Y'a pas de récupération des msg. c'est Delphi qui le fait et qui appelle automatiquement PainWindow lors de WM_PAINT.
blitColumn est appelée après le calcul d'une colonne.
 
 
Au fait, je me suis apperçu qu'il faut mieux utiliser SetPixelV à la place de SetPixel.  
 
 




 
:lol:
 
bon...honte sur moi, j'ai pas les yeux en face des trous :(
J'ai jamais codé en delphi donc ca va limiter le champs; Par contre, j'ai pas mal rencontré de prb de perf graphique en prg windows donc là j'auru pu aider !! Mais comme je comprends pas d'où viennent les DC, ni les appels, c'est mort ! :)

 

[jfdsdjhfuetppo]--Message édité par Willyzekid le 24-05-2002 à 22:05:43--[/jfdsdjhfuetppo]


---------------
Horizon pas Net, reste à la buvette!!
n°144370
Willyzekid
Posté le 24-05-2002 à 22:09:29  profilanswer
 

Le truc de base (mais ca j'imagine que c'est déjà fait!) c'est de faire le maximum de blit en dehors de l'appel à WM_PAINT. Parce que les messages windows, c'est lent!
 
Donc de faire les blit quand il n'y a pas de message dans la queue....Et bien sûr de les faire tous ensemble (pas d'interuption par du calcul qui n'a pas grand chose à voir)
 
Voici donc ma maigre participation, je retourne dormir :lol:


---------------
Horizon pas Net, reste à la buvette!!
n°144378
HelloWorld
Salut tout le monde!
Posté le 24-05-2002 à 22:31:44  profilanswer
 

Citation :


Le truc de base (mais ca j'imagine que c'est déjà fait!) c'est de faire le maximum de blit en dehors de l'appel à WM_PAINT. Parce que les messages windows, c'est lent!  
 
Donc de faire les blit quand il n'y a pas de message dans la queue....Et bien sûr de les faire tous ensemble (pas d'interuption par du calcul qui n'a pas grand chose à voir)


 
Je comprend pas trop ce que tu veux dire (comment ca les messages c'est lent ... et en dessiner en dehors de WM_PAINT comment tu fais ? (quand c'est pas de l'animation ou acquisition temps réel comme là) ...)
 
Voici où on en est actuellement :
lors du calcul, pour chacune des 500 colonne :
- on dessine la nouvelle colonne via des SetPixel dans un bitmap de base en mémoire
- on blit seulement la nouvelle colonne (blit de 1 pixel de large) sur le composant
 
lors de WM_PAINT :
- on blit tout le bitmap sur le composant


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°144405
Willyzekid
Posté le 24-05-2002 à 23:02:34  profilanswer
 

avec HDC GetDC et ReleaseDC, on obtient les DC et dans la boucle de récupération des messages (pas en delphi donc), on les utilise pour dessiner.
 
Mais effectivement, là, le prb ne se pose apparement pas.
 
Le prb, c'est que à chaque appel à PaintWindow (a travers WM_PAINT), ca clignote? Pourtant cette fonction ne blit qu'un bloc :ouch: Y a aucune raison que ca clignote..
 
procedure TSpectrumControl.PaintWindow(DC: HDC);  
begin  
  inherited;  
BitBlt(DC, 0, 0, Width, Height, hBitmapDC, 0, 0, SRCCOPY);  
end;
 
je crains que je ne vous soit pas très utile sur ce coup là! :(
 
Sinon (si j'ai bien compris le prb) une manière encore mieux de faire (mais là on se perd dans des milliards de possibilité et a priori ca devrait tourner sans), ce serait de:
 
 
1 passer en inverted colors avec SetROP2(HDC, int fnDrawMode) ou prendre la couleur du fond si le fond est uni
2 redessiner les points au même endroit pour les effacer
3 reprendre la brush normale
4 dessiner les nouveaux points avec SetPixel
 
 
Recommencer à 1...


---------------
Horizon pas Net, reste à la buvette!!
n°144460
youdontcar​e
Posté le 25-05-2002 à 02:05:07  profilanswer
 

Willyzekid a écrit a écrit :

Le prb, c'est que à chaque appel à PaintWindow (a travers WM_PAINT), ca clignote? Pourtant cette fonction ne blit qu'un bloc :ouch: Y a aucune raison que ca clignote..


peut-être qu'il demande l'effacement du background ...

n°144471
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 25-05-2002 à 04:46:07  profilanswer
 

HelloWorld a écrit a écrit :

Au fait, en passant juste comme ça, tu avais jeté un coup d'oeil à TBitmap ... ?
 

Citation :

La classe TBitmap est l'encapsulation d'un objet Windows HBITMAP et HPALETTE.
 
En-tête
 
vcl/graphics.hpp
 
Description
 
TBitmap contient l'image interne du graphique bitmap et gère automatiquement la réalisation de la palette. Un bitmap est un objet graphique puissant, utilisé pour créer, manipuler (mise à l'échelle, défilement, rotation ou dessin) et stocker des images comme fichiers sur disque.
Pour dessiner un bitmap dans un canevas, appelez la méthode Draw ou StretchDraw d'un objet TCanvas en lui transmettant comme paramètre un objet TBitmap.
La création de copies d'un objet TBitmap est très rapide puisque ce sont les handles qui sont copiés et pas l'image elle-même. Si l'image est modifiée, alors que le handle est partagé par plusieurs objets TBitmap, l'image est réellement dupliquée avant d'effectuer les modifications.


 
T'aurais peut être juste eu le blit à coder toi même ...
Sinon n'oublie pas de poster tout le code une fois que ça marche ;)  




 
la première version du logiciel utilise ça... mais on a des ralentissements d'affichage de tps en tps... voilà donc je cherchais kelke chose de plus rapide... on m'a lancé dans le win32... et finalement c'est pour tomber sur le même résultat ?

n°144472
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 25-05-2002 à 04:47:48  profilanswer
 

HelloWorld a écrit a écrit :

Code :
  1. procedure TSpectrumControl.blitColumn(col: integer);
  2. var
  3.   i: integer;
  4.   couleur: TColor;
  5. begin
  6.   couleur := clRed;
  7.   for i:= 0 to Width do begin
  8.      if (setPixel(hBitmapDC, Col, i, couleur) = -1) then begin
  9.         MessageBox(Handle, 'Error@blitColumn@TSpectrumControl :  could not paint on DC ','error', MB_OK);
  10.         Exit;
  11.      end;
  12.      couleur := TColor(couleur + i*Col);
  13.   end;
  14.   BitBlt(Canvas.Handle, Col, 0, 1, Height, hBitmapDC, Col, 0, SRCCOPY);
  15. end;


 
c'est pas plutôt Height ? ...  




 
heu, oui plutôt oui !!!! mais kel con... j'hallucine ....  :ouch:  
 
j'peux pas tester maintenant car je ne suis évidement pas au boulot... tu crois ke ça va changer kelke chos e?

n°144473
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 25-05-2002 à 04:52:35  profilanswer
 

Willyzekid a écrit a écrit :

 
 
Comprend pas trop. Dans TSpectrumControl.blitColumn(col: integer)  je vois pas d'appel à PaintWindows. En fait, je voudrais avoir tout ton code (surtout ce qui concerne l'affichage):
- récupération des messages
- les procedures d'affichages et à quelle moment elles sont appellées (notamment blitColumn(col: integer) et PaintWindow(DC: HDC)).
 
C'est là dessus que le problème se pose sans doute....A voir!  




 
 
alors, j'ai pas le code sous la main...
 
le blitColumn (de mémoire) je le fais à partir de ma fenêtre principale.
 
kan j'appuie sur le bouton, je fais :
for i:=0 to Width do begin
   blitColumn(i);
end;
 
tout simplement... le but est de l'utiliser de cette manière, je veux faire un objet bien encapsuler, donc pas d'appel à win32 à l'extérieur de l'objet...
 
 
ensuite, le painWnd, je l'ai enlevé parceque ça clignotait, donc... et je l'ai mis à cet endroit :
 
[code]
procedure TSpectrumControl.blitColumn(col: integer);  
var  
  i: integer;  
  couleur: TColor;  
begin  
  couleur := clRed;  
  for i:= 0 to Width do begin  
     if (setPixel(hBitmapDC, Col, i, couleur) = -1) then begin  
        MessageBox(Handle, 'Error@blitColumn@TSpectrumControl :  could not paint on DC ','error', MB_OK);  
        Exit;  
     end;  
     couleur := TColor(couleur + i*Col);  
  end;  
  BitBlt(Canvas.Handle, Col, 0, 1, Height, hBitmapDC, Col, 0, SRCCOPY);  
=> appel à invalidate ici sur un rect(je ne sais plu koi mais g vérif 20 fois:sarcastic:)
=>appel à paintWnd

 
end;

n°144475
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 25-05-2002 à 05:04:39  profilanswer
 

²

youdontcare a écrit a écrit :

peut-être qu'il demande l'effacement du background ...  




 
oui, en effet, mais si je ne demande pas l'effacement du background, c'est pareil... ça fait exactement la même chose sauf ke si c'est déjà remplit, on a l'impression kil ne se passe rien (au lieu ke les colonnes soient supprimées une à une puis que tout soit affiché).
 
pff.. je ne sais plus si j'ai testé de "forcer" le paintWnd sans l'effacement du background... dsl.. je vous dirais ça lundi !

n°144487
Willyzekid
Posté le 25-05-2002 à 09:46:26  profilanswer
 

Moustaaki a écrit a écrit :

 
 
=> appel à invalidate ici sur un rect(je ne sais plu koi mais g vérif 20 fois:sarcastic:)
=>appel à paintWnd

 
end;  




 
Ben c'est là qu'est le prb à mon avis...
avec Invalidate, tu dis déjà que tu veux repeindre donc la prochaine fois, windows va mettre un WM_PAINT dans la file et donc apparement appeller PaintWnd...
En attendant, tu repeind déjà la fenètre avec PaintWnd
 
Tu as un PaintWnd de trop...(a priori celui blitColomun)


---------------
Horizon pas Net, reste à la buvette!!
n°144683
HelloWorld
Salut tout le monde!
Posté le 25-05-2002 à 20:28:23  profilanswer
 

Je suis d'accord ...
 

Citation :

=> appel à invalidate ici sur un rect(je ne sais plu koi mais g vérif 20 fois )
=>appel à paintWnd


 
En appelant invalidaterect, tu provoque indirectement un appel à paintWnd ...
Tu n'as pas à appeller paintWnd. L'appeller directement (si c'est bien cette fonction qui gère WM_PAINT) c'est _mal_, car cette fonction ne doit être appelée que lors de WM_PAINT, et pas à un autre moment.
Afin de l'appeler "proprement", tu provoques lenvoit de WM_PAINT via invalidaterect.
 
Mais ce que je comprend pas, c'est que font des 2 lignes dans BliColomn ... BlitColomn affiche 1 colonne.
Si a chaque colonne tu réaffiches tout le bitmap et qu'en plus tu invalidate => tu provoques son effacement et son réaffichage, ben je trouve normal que ca couille.
ces 2 lignes doivent gercler.
le blit complet doit être fait dans paintwnd, et paintwnd ne doit jamais être appelée par toi.
 

Citation :

heu, oui plutôt oui !!!! mais kel con... j'hallucine ....  :ouch:  
 
j'peux pas tester maintenant car je ne suis évidement pas au boulot... tu crois ke ça va changer kelke chos e?


 
Je sais pas, on le saura demain. Ce qui est sûr c'est que ça fait pas du bien.
 
C'est très bizarre que ça clignote ...
A partir du moment où on blit, ca ne doit pas clignoter.
Decris précisement quand est-ce que ça clignote.
Pour le TBitmap, c'était juste comme ca.
Nan ca n'aurait pas été pareil, il aurait fallu coder soit même les blits.
j'ai testé rapidos, et ça rammait lors de l'affectation des points ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°145256
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 27-05-2002 à 10:04:06  profilanswer
 

à propos de SetPixelV
 
bon, je viens de tester et apparement, mon DC n'est pas compatible : la fonction renvoie systématiquement false.


---------------
Boolay for ever...
n°145267
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 27-05-2002 à 10:30:38  profilanswer
 

donc :
 
 
avec InvalidateRect :
 

Code :
  1. procedure TSpectrumControl.blitColumn(col: integer);
  2. var
  3.    i: integer;
  4.    couleur: TColor;
  5.    rec : TRect;
  6. begin
  7.    couleur := clYellow;
  8.    for i:= 0 to Height do begin
  9.       if (setPixel(hBitmapDC, Col, i, couleur) = -1) then begin
  10.          MessageBox(Handle, 'Error@blitColumn@TSpectrumControl :  could not paint on DC ','error', MB_OK);
  11.          Exit;
  12.       end;
  13.       couleur := TColor(couleur + i*Col);
  14.    end;
  15.    rec := Rect(Col, 0, Col+1, Height);
  16. // le background n'est pas effacé (?)
  17.    InvalidateRect(self.Handle, @rec, false);
  18.    BitBlt(Canvas.Handle, Col, 0, 1, Height, hBitmapDC, Col, 0, SRCCOPY);
  19. end;
  20. procedure TSpectrumControl.PaintWindow(DC: HDC);
  21. begin
  22.    inherited;
  23. BitBlt(DC, 0, 0, Width, Height, hBitmapDC, 0, 0, SRCCOPY);
  24. end;


 
 
donne ça : http://membres.lycos.fr/clancsicn/test1.zip
 
 
 
 
sans InvalidateRect :
 
 

Code :
  1. procedure TSpectrumControl.blitColumn(col: integer);
  2. var
  3.    i: integer;
  4.    couleur: TColor;
  5. begin
  6.    couleur := clYellow;
  7.    for i:= 0 to Height do begin
  8.       if (setPixel(hBitmapDC, Col, i, couleur) = -1) then begin
  9.          MessageBox(Handle, 'Error@blitColumn@TSpectrumControl :  could not paint on DC ','error', MB_OK);
  10.          Exit;
  11.       end;
  12.       couleur := TColor(couleur + i*Col);
  13.    end;
  14.    BitBlt(Canvas.Handle, Col, 0, 1, Height, hBitmapDC, Col, 0, SRCCOPY);
  15. end;


 
ça donne ça :http://membres.lycos.fr/clancsicn/test2.zip
 
 
 
 
 
 
 
maintenant, l'un de vous m'a demandé de mettre la boucle d'appel à blitColumn, la voici :
 

Code :
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var
  3.    i: integer;
  4. begin
  5.    for i := 0 to spectrumCtrl.Width - 1 do begin
  6.       spectrumCtrl.blitColumn(i);
  7.    end;
  8. end;


 
 
voili voilou...
 
 
ah ouai, en fait ça clignote si j'appelle la fonction Repaint de la VCL delphi à la fin de BlitColumn... au temps pour moi :D


---------------
Boolay for ever...
n°145309
HelloWorld
Salut tout le monde!
Posté le 27-05-2002 à 11:31:06  profilanswer
 

Citation :

à propos de SetPixelV  
 
bon, je viens de tester et apparement, mon DC n'est pas compatible : la fonction renvoie systématiquement false.


FALSE = 0 on est bien d'accord ... pas -1 ...
Tu as fait GetLasrError pour t'assurer que c'est bien un pblm de compatibilité ?
Car c'est bizarre que SetPixel marche et pas SetPixelV.
L'avantage avec SetPixelV, c'est qu'elle renvoit un BOOL et peut donc être batchée. Le batch je suis en train de voir comment ça fonctionne, mais en tous cas quand une fonction est batchée c'est bien. J'ai modifié mon prog avec des SetPixelV et en jouant avec la limite du batch (= le nombre de fonction mises en attente avant d'être exécutées toutes d'un coup) et je suis parvenu à 50% de vitesse en plus, mais ... je sais plus comment j'ai fait ! :??: la premier coup j'y suis arrivé et après non, queudale. Je comprend pas pkoi.
 
Ton prog1 tourne bien, malgré ton code bizarre.
Le prog2 déconne pas vraiment. La première fois c'est ok. Puis quand on vide c'est la cata. Je sais pas ce que tu as mis dans don code pour vider, mais c'est bizarre ca : apres avoir vidé, on dirait que tester ne fait plus rien, mais il bosse comme il faut :
lance le prog,
appui sur vider,
appui sur tester : ca fait rien, en apparence ...
minimise puis refait apparaître (=> WM_PAINT) et fiou, on a notre truc.
appui sur tester ... ca affiche des colonnes ... noires ...
 
Donc ca marche très bien, si ce n'est que après un appui sur vider ca affiche des colonnes noires ...
Fais nous voir le code que tu as mis dans vider ... http://forum.hardware.fr/icones/icon16.gif

 

[jfdsdjhfuetppo]--Message édité par HelloWorld le 27-05-2002 à 11:36:18--[/jfdsdjhfuetppo]


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°145313
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 27-05-2002 à 11:33:02  profilanswer
 

YAAAAAAaaaaaaaaaaa !!!!!!
 
 
ça y est, je crois que c'est bon, fin presque !!!!
 
alors, le pb apparement se situait dans ma fonction fillSurface :
 
au lieu de faire ça :

Code :
  1. procedure TSpectrumControl.fillSurface;
  2. begin
  3.    with canvas do begin
  4.       Brush.Color := clBlack;
  5.       FillRect(ClipRect);
  6.    end;
  7.    FillRect(hBitmapDC, canvas.ClipRect, GetStockObject(BLACK_BRUSH));
  8. end;


 
 
je fais ça :

Code :
  1. procedure TSpectrumControl.fillSurface;
  2. begin
  3.    FillRect(hBitmapDC, canvas.ClipRect, GetStockObject(BLACK_BRUSH));
  4.    Repaint;
  5. end;


 
et v'là !!!
 
 
bon, maitenant... je ne peux pas afficher de trucs en couleur... c'est p'têtre le type de données que j'utilise qui n'est pas compatible ou alors c'est le DC dont le format de couleur n'est pas le bon... si c'est le cas, comment changer le format de couleur d'un HDC ?
 
 
je vous posterais le code en entier lorsque le composant sera totalement opérationnel, indépendant, tout ça... bref, quand ça sera un bel objet utilisable :)


---------------
Boolay for ever...
n°145322
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 27-05-2002 à 11:39:35  profilanswer
 

bon, alors, la couleur.... :(
 

Code :
  1. var
  2.    i: integer;
  3.    couleur: COLORREF;
  4.    rec : TRect;
  5. begin
  6.    couleur := RGB(125,255,123);
  7.    for i := 0 to Height do begin
  8.       if (setPixel(hBitmapDC, Col, i, couleur) = -1) then begin
  9.          MessageBox(Handle, 'Error@blitColumn@TSpectrumControl :  could not paint on DC ','error', MB_OK);
  10.          Exit;
  11.       end;


 
ça m'affiche du blanc... j'en déduit que mon device context est configuré pour du noir et blanc... comment je le change, ça ?


---------------
Boolay for ever...
n°145327
HelloWorld
Salut tout le monde!
Posté le 27-05-2002 à 11:44:50  profilanswer
 

Citation :

hBitmapDC := CreateCompatibleDC(Canvas.Handle);


 
Ca créé un bitmap compatible avec ton canvas ...
Si ton canvas est en monochrome, ça créé un bitmap monochrome ...
Ca vient de ton composant ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°145328
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 27-05-2002 à 11:45:59  profilanswer
 

HelloWorld a écrit a écrit :

 
 
Donc ca marche très bien, si ce n'est que après un appui sur vider ca affiche des colonnes noires ...
Fais nous voir le code que tu as mis dans vider ... http://forum.hardware.fr/icones/icon16.gif  
 
 




 
vivi, c'est vider qui merdait ;)
je v essayer de faire ton truc avec setPixelV ... kestion de nb : c'est koi, un batch ?  :ange:

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 27-05-2002 à 11:54:42--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°145329
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 27-05-2002 à 11:50:01  profilanswer
 

HelloWorld a écrit a écrit :

Citation :

hBitmapDC := CreateCompatibleDC(Canvas.Handle);


 
Ca créé un bitmap compatible avec ton canvas ...
Si ton canvas est en monochrome, ça créé un bitmap monochrome ...
Ca vient de ton composant ...  




 
 
ok, je v voir si ya pas un attribut pour le changer... parcequ'il existe un composant héritant du même objet (TPanel) qu'on peut remplir avec n'importe qu'elle couleur. ça doit donc être possible !


---------------
Boolay for ever...
n°145333
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 27-05-2002 à 11:54:04  profilanswer
 

Moustaaki a écrit a écrit :

 
 
 
ok, je v voir si ya pas un attribut pour le changer... parcequ'il existe un composant héritant du même objet (TPanel) qu'on peut remplir avec n'importe qu'elle couleur. ça doit donc être possible !  




 
 
heu ... bah non... on ne peut pas le modifier et par défaut, il n'est pas monochrome puisque, je viens de tester, on peut très bien afficher du rouge dedans....
 
alors, est ce que je pourrais changer ça au niveau du DC avec  
ChangeDisplaySettingsEx ?
 
ref doc msn : http://msdn.microsoft.com/library/ [...] s_3tfc.asp

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 27-05-2002 à 11:55:55--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°145335
HelloWorld
Salut tout le monde!
Posté le 27-05-2002 à 11:54:45  profilanswer
 

Citation :

procedure TSpectrumControl.fillSurface;  
begin  
  FillRect(hBitmapDC, canvas.ClipRect, GetStockObject(BLACK_BRUSH));  
  Repaint;  
end;


 
ouai ... moi je pensais à :
 

Citation :

procedure TSpectrumControl.fillSurface;  
begin  
  FillRect(hBitmapDC, canvas.ClipRect, GetStockObject(BLACK_BRUSH));  
  FloodFill(TonComposant);  
end;

 
 
Mais bon, c'est pareil.
 
Un batch ... je suis en train de me documenter la dessus.
Batch = "Traitement par lot"
SetPixelV peut être batchée = elle n'est pas exécutée tout de suite, mais ajoutée au batch du GDI ... une sorte de buffer de fonctions graphiques ...
Quand le batch est plein, fiout, tout est torché d'un coup.
Je pige pas trop pourquoi c'est plus rapide ainsi, mais c'est comme ça ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°145341
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 27-05-2002 à 11:58:15  profilanswer
 

HelloWorld a écrit a écrit :

Citation :

procedure TSpectrumControl.fillSurface;  
begin  
  FillRect(hBitmapDC, canvas.ClipRect, GetStockObject(BLACK_BRUSH));  
  Repaint;  
end;


 
ouai ... moi je pensais à :
 

Citation :

procedure TSpectrumControl.fillSurface;  
begin  
  FillRect(hBitmapDC, canvas.ClipRect, GetStockObject(BLACK_BRUSH));  
  FloodFill(TonComposant);  
end;

 
 
Mais bon, c'est pareil.
 
Un batch ... je suis en train de me documenter la dessus.
Batch = "Traitement par lot"
SetPixelV peut être batchée = elle n'est pas exécutée tout de suite, mais ajoutée au batch du GDI ... une sorte de buffer de fonctions graphiques ...
Quand le batch est plein, fiout, tout est torché d'un coup.
Je pige pas trop pourquoi c'est plus rapide ainsi, mais c'est comme ça ...  




 
 
ah oui, ça pourrait être pas mal en effet ! pour faire ce qu'on disait au début : afficher 3 colonnes en même temps par exemple pour augmenter les performances :)  :hello:


---------------
Boolay for ever...
n°145343
HelloWorld
Salut tout le monde!
Posté le 27-05-2002 à 12:00:57  profilanswer
 

Ouh la l'ami, pas trop vite ... :)
ChangeDisplaySettings ca change les settings de ton écran : genre la résolution ... rien à voir avec les DC.
 

Code :
  1. hBitmapDC := CreateCompatibleDC(Canvas.Handle);


 
Y'a pas à chercher, l'erreur est là ...
Peut être que c'est pas le canvas qu'il faut lui filer, mais ton composant.Handle plutôt ...
ou alors peut etre que ton canvas est monochrome à ce stade et qu'il est associé plus tard à ton composant et devient alors polychrome ...
Peut être que juste avant tu peux modifier le nombre de couleurs de ton canvas ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°145346
HelloWorld
Salut tout le monde!
Posté le 27-05-2002 à 12:05:20  profilanswer
 

Citation :

ah oui, ça pourrait être pas mal en effet ! pour faire ce qu'on disait au début : afficher 3 colonnes en même temps par exemple pour augmenter les performances :)  :hello:


 
Eh bien y'a qu'à tester !
Met ça dans ton create :
GdiSetBatchLimit( ... );
où ... c'est le nombre max de SetPixelV à accumuler (Heigth * Nb_Col_Dun_Coup = 200 * 3 = 600 par exemple)...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4

Aller à :
Ajouter une réponse
 

Sujets relatifs
moteur de rechercheCCS comment ca marche les classes ?
j ai fait un Moteur de recherche avec saisi semi auto...[PHP - setlocale en FR marche pas]
[VB] Toolbar IE (Je paie pour la solution!!!)Problèmes d'affichage avec les pseudo-frames
Tri d'un tableau selon plusieurs critères + affichage d'icone[JAVA] Repaint ne marche pas :(((( [Resolu]
[CSS]couleurs des liens...[BDD] Recherche cours sur les formes normales
Plus de sujets relatifs à : [affichage 2D] recherche solution... pb de couleurs.... (ça marche !)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR