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

 


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

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

n°143077
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 11:18:42  profilanswer
 

Reprise du message précédent :

Citation :


 Handle to the device context


 
ça, ça peut être n'importe kel handle vers un élément graph'.. heu... vers n'importe kel "window" ?
par exemple, s'il me vient l'idée folle d'afficher des pixels dans mon radio button, c'est possible en passant le handle vers ce radio button ? où s'agit-t-il uniquement du handle vers la fenêtre (au sens visuel du terme, pas au sens API cette fois) parente ?
 
 
 
ou comment pouvoir dire un jour : "bonjour, je suis trilingue, je parle le français, l'anglais et le microsoft... les microsoftiens sont des gens venus d'une autre planéte... leur but est d'écraser le monde... mais je me suis soumis un jour à apprendre leur langage... je n'avais pas le choix... on m'a forcé.

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 23-05-2002 à 11:35:38--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
mood
Publicité
Posté le 23-05-2002 à 11:18:42  profilanswer
 

n°143088
youdontcar​e
Posté le 23-05-2002 à 11:25:27  profilanswer
 

Moustaaki a écrit a écrit :

ouai, fin ça, c valable parce ke c'est du "procédural"... c'est po de l'objet...
mon bureau windows pourrait être un élément graphique particulier tout comme une fenêtre... chacun ayant une méthode repaint redéfini et spécifique...
enfin, cela est peut-être conçu de cette manière avec les MFC ? :sarcastic:


windows c'est "procédural" car ça a commencé il y a 20 ans et ça a eu le mérite de rester compatible avec les vieilles apps. donc oui, l'applic peut paraître monolithique ... mais tu as par ex un fonctionnement objet pour les windowprocs.  
 
et oui, les mfc encapsulent tout ça.

n°143099
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2002 à 11:31:25  profilanswer
 

Avec C++Builder et Delphi y a toujours ce truc procédural, mais encapsulé.
La seule partie procédurale visible c'est le .dpr dans Delphi et le .cpp du nom de ton projet dans C++Builder.
Le Application.Run() correspond à la fonction qui fait la boucle de messages.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°143105
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-05-2002 à 11:34:55  profilanswer
 

Moustaaki a écrit a écrit :

merci en tout cas à tous ceux ki m'ont aidé dans ce topic avec une spéciale dédicace (cacedédi, ouai ! :D) à :love: HelloWord :love:  




ouais, ben g compris quoi ! ma solution était toute pourrie  :cry:  
enfin bon, au moins tu sauras ce qu'est le VBL, j'aurais pas tout perdu  :sweat:


---------------
J'ai un string dans l'array (Paris Hilton)
n°143108
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 11:37:32  profilanswer
 

Harkonnen a écrit a écrit :

 
ouais, ben g compris quoi ! ma solution était toute pourrie  :cry:  
enfin bon, au moins tu sauras ce qu'est le VBL, j'aurais pas tout perdu  :sweat:  




 
mais non, tout le monde a fait avancer le shmililiblick ici ;) et c'est bien cool ;)


---------------
Boolay for ever...
n°143112
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 11:42:00  profilanswer
 

antp a écrit a écrit :

Avec C++Builder et Delphi y a toujours ce truc procédural, mais encapsulé.
La seule partie procédurale visible c'est le .dpr dans Delphi et le .cpp du nom de ton projet dans C++Builder.
Le Application.Run() correspond à la fonction qui fait la boucle de messages.  




 
  :)  ouai, et ça me plait bien comme ça  :)
ce ke je veux dire, c ke la programmation objet me parait bp plus abordable et intuitive.
et puis, on ne citera plus les nombreux avantages de la poo (prononcez pou):
modularité, extensibilité, réutilisabilité, etc...
 
et bien sûr ke l'objet encapsule du procédural mais au final, on obtient une approche complétement différente de la programmation (que je préfère pour ma part).

 

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


---------------
Boolay for ever...
n°143119
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 11:50:24  profilanswer
 

alors, aidez moi à parler le langage microsoft, svp... j'ai kelkes points flous à éclaircir :
 
déjà au niveau de hDC ou des hWnd :
 
hWnd : handle d'une fenêtre or comme tout est fenêtre ça peut être le handle de n'importe koi ?
 
hDC," Handle to the device context. "  ... clairement, c koi ?


---------------
Boolay for ever...
n°143152
bjone
Insert booze to continue
Posté le 23-05-2002 à 12:32:04  profilanswer
 

bin ça y est on arrivé à bout...
 
chaque "fenêtre" à un hWnd, un bouton c'est une fenêtre, tout est fenêtre :D car la fenêtre est la primitive de base pour les serveurs graphiques.
 
donc en passant un hWnd de bouton à une fonction de traçage, oui ça traçera dans un bouton.....
 
le device context est une structure qui maintient des infos sur un périphérique ou tu peux dessinner (fenêtre, imprimante...)
(là c'est un handle, donc un entier ou un pointeur qui pointe sur le device context dans une table, enfin ça tu l'as compris)

n°143153
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-05-2002 à 12:32:56  profilanswer
 

Citation :


hWnd : handle d'une fenêtre or comme tout est fenêtre ça peut être le handle de n'importe koi ?


vu que chaque controle est une fenêtre, tout controle possède un hWnd

Citation :


hDC," Handle to the device context. "  ... clairement, c koi ?  


le hDC te permet de récupérer le contexte d'un périphérique. dans ton cas, ce hDC te permet de récupérer la zone de l'écran ou tu pourras dessiner
pour faire une comparaison, ta fenêtre est une feuille de papier, et le hDC est un coté de cette feuille ou tu pourras dessiner (comparaison à la con, mais j'ai pas trouvé mieux :d)


---------------
J'ai un string dans l'array (Paris Hilton)
n°143158
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 12:47:18  profilanswer
 

Harkonnen a écrit a écrit :

[quote]
le hDC te permet de récupérer le contexte d'un périphérique. dans ton cas, ce hDC te permet de récupérer la zone de l'écran ou tu pourras dessiner
pour faire une comparaison, ta fenêtre est une feuille de papier, et le hDC est un coté de cette feuille ou tu pourras dessiner (comparaison à la con, mais j'ai pas trouvé mieux :d)  




 
ok..
delphi propose une méthode pour tous ces composants graphiques : Handle ki renvoie un handle... (exemple TPaintBox.Handle.. eu.. c pa un méthode statique par contre ;) )
 
est-ce que je peux utiliser cet handle comme hDC ?


---------------
Boolay for ever...
mood
Publicité
Posté le 23-05-2002 à 12:47:18  profilanswer
 

n°143161
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2002 à 12:49:53  profilanswer
 

Je dirais plutôt TPaintBox.Canvas.Handle :

Citation :

property Handle: HDC;


Citation :

TCanvas does not own the HDC. Applications must create an HDC and set the Handle property. Applications must release the HDC when the canvas no longer needs it


 
Sinon y a aussi TPaintBox.GetDeviceContext qui est peut-être plus adapté :

Citation :

GetDeviceContext calls the Windows API function GetDC

 

[jfdsdjhfuetppo]--Message édité par antp le 23-05-2002 à 12:51:48--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°143163
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 12:52:10  profilanswer
 

Moustaaki a écrit a écrit :

 
 
ok..
delphi propose une méthode pour tous ces composants graphiques : Handle ki renvoie un handle... (exemple TPaintBox.Handle.. eu.. c pa un méthode statique par contre ;) )
 
est-ce que je peux utiliser cet handle comme hDC ?  




 
 
bon, je répond à ma question, corrigez moi si je me trompe :
je ne peux pas utiliser cet handle comme hDC, en fait, ça n'a rien à voir...
 
en fait, ce kil faut que je fasse, c'est utiliser la méthode getDC(handleDuPaintBox) pour obtenir un hDC correspondant au paintBox...
ensuite à partir de ce hDC, je pourrais construire un bitMap 'compatible' createCompatibleBitmap... etc...
 
bon, j'ai bien compris ?


---------------
Boolay for ever...
n°143170
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 12:57:11  profilanswer
 

antp a écrit a écrit :

Je dirais plutôt TPaintBox.Canvas.Handle :

Citation :

property Handle: HDC;


Citation :

TCanvas does not own the HDC. Applications must create an HDC and set the Handle property. Applications must release the HDC when the canvas no longer needs it


 
Sinon y a aussi TPaintBox.GetDeviceContext qui est peut-être plus adapté :

Citation :

GetDeviceContext calls the Windows API function GetDC

 
 
 




 
 
ooo, génial !!! aaa, c puissant delphi :love:
merci antp ! :jap:


---------------
Boolay for ever...
n°143189
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 13:40:25  profilanswer
 

est-ce que l'un de vous peut m'expliquer ces 4 lignes de code ?
 

Code :
  1. g_hWinDC = GetDC(hWnd);
  2. g_hBitmap = CreateCompatibleBitmap(g_hWinDC, TRACE_WIDTH, TRACE_HEIGHT);
  3. g_hBMPDC = CreateCompatibleDC(g_hWinDC);
  4. SelectObject(g_hBMPDC, g_hBitmap);


 
 
 
de plus, il y a un truc que je ne comprend pas bien dans delphi avec les handles... déjà handle ne représente pas hWND mais HDC...
ensuite, getDeviceContext demande un handle HWND... mais comment associer un HDC à la propriété handle d'un paint box si on ne connait pas le handle de celui ci ?
dans l'exemple, il font :
 

Code :
  1. var
  2.   notUsed: HWND;
  3. begin
  4. ...
  5.   paintBox1.canvas.Handle := getDeviceContext(notUsed);
  6. ...


 
je ne comprend pas bien... j'ai l'impression kon affecte un DC complétement bidon... :??:
   
parceque dans le code C, on fait :  

Code :
  1. g_hWinDC = GetDC(hWnd)


aisni, on ne récupère pas le DC à partir de n'importe koi ! on le récupère à partir du handle identifiant la "fenêtre" (au sens api du terme)... alors.... :??:

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 23-05-2002 à 13:50:52--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°143222
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2002 à 14:31:40  profilanswer
 

TWinControl.Handle -> hWnd
TCanvas.Handle -> HDC
 
TPaintBox est un TWinControl.
TPaintBox.Canvas est un TCanvas.
 
Et tu devrais faire paintBox1.canvas.Handle := paintBox1.getDeviceContext(notUsed);
 
Sinon ton device context est pour la form (self) et non pas pour la paintbox...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°143249
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 14:46:59  profilanswer
 

antp a écrit a écrit :

TWinControl.Handle -> hWnd
TCanvas.Handle -> HDC
 
TPaintBox est un TWinControl.
TPaintBox.Canvas est un TCanvas.
 
Et tu devrais faire paintBox1.canvas.Handle := paintBox1.getDeviceContext(notUsed);
 
Sinon ton device context est pour la form (self) et non pas pour la paintbox...  




 
ok, je v tester tout ça alors ;)
encore merci :jap:
euh, non, une autre kestion pour ke ça soit encore plus klerr :
 
mais pourkoi on ne fait pas :
paintBox1.canvas.handle := getDeviceContext(paintBox1.handle);
=> heu, la propriété handle n'est pas accessible en fait :D
 
 
 
et puis, je viens de tester :
PaintBox1.Canvas.Handle := PaintBox1.getDeviceContext(notUsed);
 
et ça me retourne l'erreur à la compile :
[Erreur] main.pas(33): Identificateur non déclaré : 'getDeviceContext'

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 23-05-2002 à 14:52:07--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°143261
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 14:54:03  profilanswer
 

antp a écrit a écrit :

TWinControl.Handle -> hWnd
TCanvas.Handle -> HDC
 
TPaintBox est un TWinControl.
TPaintBox.Canvas est un TCanvas.
 
Et tu devrais faire paintBox1.canvas.Handle := paintBox1.getDeviceContext(notUsed);
 
Sinon ton device context est pour la form (self) et non pas pour la paintbox...  




 
 
en fait, TPaintBox n'est hélas pas un TWinControl... et il ne dispose ni de la propriété Handle ni de la méthode getDeviceContext(handle: HWND);
 
bon, j'v voir ce ke je peux faire :D
 
en faisant une classe descendante de TCustomControl ki elle même descend de TWinControl, ça doit être faisable... ?

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 23-05-2002 à 14:58:03--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°143270
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2002 à 14:58:13  profilanswer
 

arf... utilise un TPanel alors :/
Mais c'est moins prévu pour :(

 

[jfdsdjhfuetppo]--Message édité par antp le 23-05-2002 à 14:59:14--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°143277
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 15:08:01  profilanswer
 

antp a écrit a écrit :

arf... utilise un TPanel alors :/
Mais c'est moins prévu pour :(  
 
 




 
ouai, c vrai ke ça fait un peu crado :( ...
keske tu penses de l'utilisation de TCustomControl... apparement, il n'y que la méthode paint à redéfinir... et c ce ki correspond à la réponse WM_PAINT dans la windowProc...  
il faudrai donc ke je code l'ékivalent de cela :

Code :
  1. hdc = BeginPaint(hWnd, &ps);
  2.   PaintWindow(hdc);
  3.   EndPaint(hWnd, &ps);


 
keske t'en penses ?


---------------
Boolay for ever...
n°143290
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2002 à 15:15:34  profilanswer
 

Ouais c'est peut-être mieux...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°143315
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 15:27:51  profilanswer
 

:fou: o my god. (BoolayAttitude := true)
 
bon, encore un pb... mes neuronnes correspondants au lexique de la programmation se sont déconnectés et je ne sais plus ce ke veut dire cette erreur :ange: :
 
[Erreur] affichage.pas(22): Les types des paramètres VAR originaux et formels doivent être identiques
 
à l'appel de la function BeginPaint dans la méthode suivante :

Code :
  1. procedure TSpectrumControl.Paint;
  2. var
  3.    ps: PAINTSTRUCT;
  4. l_hdc: HDC;
  5. begin
  6.    l_hdc := BeginPaint(self.Handle, @ps);
  7.    PaintWindow(l_hdc);
  8.    EndPaint(hWnd, @ps);
  9. end;


 
 
 
prototype de la fonction paint :
function Windows.BeginPaint(hwnd: HWND; var lpPaint: tagPAINTSTRUCT): HDC;
 
si je remplace le type de ps par tagPAINTSTRUCT, on obtient la même erreur.

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 23-05-2002 à 15:31:21--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°143320
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2002 à 15:32:58  profilanswer
 

Houlà les messages d'erreur en français, ça fait tout bizarre :lol:
 
essaie de créer soit une variable LPPAINTSTRUCT (si ça existe) qui contient l'adresse de l'autre truc:
 
ptr: LPPAINTSTRUCT;
 
ptr := @ps
 
ou alors:
 
ptr: PPAINTSTRUCT;
 
Et si ça existe pas ajoute
 
type
  PPAINTSTRUCT = ^PAINTSTRUCT;

 

[jfdsdjhfuetppo]--Message édité par antp le 23-05-2002 à 15:36:06--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°143328
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 15:35:51  profilanswer
 

antp a écrit a écrit :

Houlà les messages d'erreur en français, ça fait tout bizarre :lol:




 
ouai ;), j'ai tout en français, même la doc et c'est kan même plus pratique :D


---------------
Boolay for ever...
n°143334
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 15:40:11  profilanswer
 

:D CRAQUAGE :D
 
bon, dans windows.pas, on a ça :

Code :
  1. PPaintStruct = ^TPaintStruct;
  2.   {$EXTERNALSYM tagPAINTSTRUCT}
  3.   tagPAINTSTRUCT = packed record
  4.     hdc: HDC;
  5.     fErase: BOOL;
  6.     rcPaint: TRect;
  7.     fRestore: BOOL;
  8.     fIncUpdate: BOOL;
  9.     rgbReserved: array[0..31] of Byte;
  10.   end;
  11.   TPaintStruct = tagPAINTSTRUCT;
  12.   {$EXTERNALSYM PAINTSTRUCT}
  13.   PAINTSTRUCT = tagPAINTSTRUCT;


 
 
et je fais ça :

Code :
  1. procedure TSpectrumControl.Paint;
  2. var
  3.    ptr_ps: PPaintStruct;
  4. l_hdc: HDC;
  5. begin
  6.    l_hdc := BeginPaint(self.Handle, ptr_ps);
  7.    PaintWindow(l_hdc);
  8.    EndPaint(self.Handle, ptr_ps);
  9. end;


 
 
toujours la même erreur de compil.


---------------
Boolay for ever...
n°143341
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2002 à 15:43:23  profilanswer
 

Essaie de mettre le handle dans un hwnd :/


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°143342
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 15:43:34  profilanswer
 

PTDR
 
procedure TSpectrumControl.Paint;
var
   ptr_ps: tagPAINTSTRUCT;
 l_hdc: HDC;
begin
   l_hdc := BeginPaint(self.Handle, tagPAINTSTRUCT(ptr_ps));
   PaintWindow(l_hdc);
   EndPaint(self.Handle, ptr_ps);
end;
 
 
 
ok ok... ça marche :D ... 'fin ça compile en tout cas ;)
 
j'm'attend à de belles erreurs d'executions mais bon, on verra bien ;)

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 23-05-2002 à 15:44:19--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°143345
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2002 à 15:44:35  profilanswer
 

Ouais faut voir si ça marche, parce que tu donnes pas de pointeur là il me semble...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°143351
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 15:50:59  profilanswer
 

antp a écrit a écrit :

Ouais faut voir si ça marche, parce que tu donnes pas de pointeur là il me semble...  




 
par dèf, tagPAINTSTRUCT n'est pas un pointeur en effet :D
mais il rale dès ke j'essaye de lui donner à manger un pointeur !!! keske je peux y faire ??? :D
 
 
et d'ailleurs :
function Windows.BeginPaint(hwnd: HWND; var lpPaint: tagPAINTSTRUCT): HDC;
 
il ne demande pas un pointeur en fait, non ? sinon, ça serait :
function Windows.BeginPaint(hwnd: HWND; var lpPaint: PPAINTSTRUCT): HDC; :??:
 
 
 
bon bin on va voir ce ke ça donne :(

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 23-05-2002 à 15:57:25--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°143357
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 15:59:03  profilanswer
 

est ce ke c'est le mot clé "var" ki va faire ke le passage de paramètre va se faire par référence et non par valeur par hazard ? ce ki expliquerais pouquoi on a pas besoin de passer un pointeur ??


---------------
Boolay for ever...
n°143367
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2002 à 16:05:27  profilanswer
 

Ha oui vu comme ça...  
Mais c'est parce que moi je n'ai pas trouvé autre chose que la définition "C" de la fonction, où il fallait un pointeur de PAINTSTRUCT.
Vu que la il veut un var tag machin c'est bon comme tu l'as mis.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°143371
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 16:12:27  profilanswer
 

oki :)


---------------
Boolay for ever...
n°143442
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 17:13:54  profilanswer
 

:pt1cable:   :lol:  
AHAHAHAH, je suis mort de rire !!!
 
bon, je me suis carrément planté dans la traduction C => pascal et le résultat est assez... comment dirais-je ... jugez par vous-même :
 
compilation -> Ok
 
lancement du programme -> rien ne se passe alors kun retangle tout noir devrai apparaitre...  
 
je passe une autre appli en premier plan puis je reviens à mon appli et là, c'est siouper :D : mon appli se mêt à afficher toutes les fenêtres des applis en train de tourner une à une, en boucle... impossible de l'arreter... Ctrl+Sup n'y fait rien :D
jai réinventé le Alt+Tab perpétuel :lol: ki se fini par un bô débordement de pile :D
bon, je crois ke je vais utiliser le prog k'HelloWorld m'a filé tel kil est en le convertissant en DLL ...alalalalalal... c'est terrible, la programmation bas niveau mais kan tu fais nimp', ça FAIT nimp' :D
 
 voulez ke je vous pose le code ou un lien vers l'exe pour rigoler un peu ?

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 23-05-2002 à 17:14:50--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°143460
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2002 à 17:26:27  profilanswer
 

ouais envoie toujours :)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°143476
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 17:36:28  profilanswer
 

antp a écrit a écrit :

ouais envoie toujours :)  




 
je mêt le code, hein, pas l'exe :)... mais t'arriveras facilement à le recréer avec delphi...
 
 
j'ai d'abord défini un objet TSpectrumControl de la façon suivante (comprenez de façon totalement freestyle) :
 
[booleyCode]

Code :
  1. interface
  2. uses
  3.    Controls, Windows, Classes;
  4. const
  5.    TRACE_HEIGHT = 500;
  6.    TRACE_WIDTH = 200;
  7.  
  8. type
  9. TSpectrumControl = class (TCustomControl)
  10.    procedure Paint; override;
  11.    private
  12.       g_hBitmap: HWnd;
  13.       g_hBMPDC, // Device context compatible pour le bitmap.
  14.          g_hWinDC: HDC;
  15.       g_Couleur: COLORREF;
  16.       g_Rect: TRect;
  17.    protected
  18.       procedure PaintWindow(p_hdc: HDC); override;
  19.    public
  20.       constructor create(AOwner: TComponent); override;
  21.       destructor destroy; override;
  22.       procedure blitColumn(col: integer);
  23.       procedure emptySepctrum;
  24.       procedure initSurface;
  25. end;
  26. implementation
  27. uses Types;
  28. constructor TSpectrumControl.create(AOwner: TComponent);
  29. begin
  30.    inherited create(AOwner);
  31.    with g_Rect do begin
  32.       Left := 0;
  33.       Right := 0;
  34.       Bottom := TRACE_HEIGHT;
  35.       Top := TRACE_WIDTH;
  36.    end;
  37. end;
  38. procedure TSpectrumControl.initSurface;
  39. var
  40.    HnotUsed: HWND;
  41. begin
  42.    HnotUsed := self.Handle;
  43.    g_hWinDC := self.GetDeviceContext(HnotUsed);
  44. g_hBitmap := CreateCompatibleBitmap(g_hWinDC, TRACE_WIDTH, TRACE_HEIGHT);
  45. g_hBMPDC := CreateCompatibleDC(g_hWinDC);
  46. SelectObject(g_hBMPDC, g_hBitmap);
  47. end;
  48. destructor TSpectrumControl.destroy;
  49. begin
  50.    DeleteObject(g_hBitmap);
  51. DeleteDC(g_hBMPDC);
  52. DeleteDC(g_hWinDC);
  53.    inherited;
  54. end;
  55. procedure TSpectrumControl.Paint;
  56. var
  57.    ptr_ps: tagPAINTSTRUCT;
  58. l_hdc: HDC;
  59. begin
  60.    l_hdc := BeginPaint(self.Handle, tagPAINTSTRUCT(ptr_ps));
  61.    PaintWindow(l_hdc);
  62.    EndPaint(self.Handle, ptr_ps);
  63. end;
  64. {
  65.    blit une colonne formée par des pixels de couleurs "aléatoires".
  66. }
  67. procedure TSpectrumControl.blitColumn(col: integer{; couleur});
  68. var
  69.    i: integer;
  70. begin
  71.    for i:= 0 to TRACE_HEIGHT do begin
  72.       setPixel(g_hBMPDC, Col, i, g_Couleur);
  73.       g_Couleur := COLORREF(g_Couleur + i*Col);
  74.    end;
  75.    BitBlt(g_hWinDC, Col, 0, 1, TRACE_HEIGHT, g_hBMPDC, Col, 0, SRCCOPY);
  76. end;
  77. procedure TSpectrumControl.PaintWindow(p_hdc: HDC);
  78. begin
  79.    inherited;
  80. BitBlt(p_hdc, 0, 0, TRACE_WIDTH, TRACE_HEIGHT, g_hBMPDC, 0, 0, SRCCOPY);
  81. end;
  82. {
  83.    remplit la zone de noir.
  84. }
  85. procedure TSpectrumControl.emptySepctrum;
  86. begin
  87.    FillRect(g_hWinDC, g_Rect, GetStockObject(BLACK_BRUSH));
  88.    FillRect(g_hBMPDC, g_Rect, GetStockObject(BLACK_BRUSH));
  89. end;
  90. end.


[/booleyCode]
 
 
 
 
ensuite j'ai créé une fenêtre pour utiliser/tester cet objet :
 

Code :
  1. type
  2.   TForm1 = class(TForm)
  3.     Button1: TButton;
  4.     procedure FormCreate(Sender: TObject);
  5.   private
  6.    spectrumCtrl: TSpectrumControl;
  7.     { Déclarations privées }
  8.   public
  9.     { Déclarations publiques }
  10.       constructor create(AOwner: TComponent); override;
  11.   end;
  12. var
  13.   Form1: TForm1;
  14. implementation
  15. {$R *.dfm}
  16. constructor TForm1.create(AOwner: TComponent);
  17. begin
  18.    inherited;
  19.    spectrumCtrl := TSpectrumControl.create(self);
  20.    with spectrumCtrl do begin
  21.       Left := 10;
  22.       Top := 10;
  23.       Height := 200;
  24.       Width := 500;
  25.    end;
  26.       self.InsertControl(spectrumCtrl);
  27. end;
  28. procedure TForm1.FormCreate(Sender: TObject);
  29. begin
  30.    spectrumCtrl.emptySepctrum;
  31. end;
  32. end.


 
 
 
 
donc, je l'ai relancé pour voir si ça refaisais la même chose et j'ai regardé de plus près ce kil faisait :
le lancement du programme provoque une énorme montée en charge du CPU ki passe à 100% d'utilisation et n'en redescend plus :D .
au bout d'une minute, en forçant un peu le passage d'une appli à l'autre, on finit par avoir le résultat décrit plus haut :D

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 23-05-2002 à 17:37:14--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°143479
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 17:38:08  profilanswer
 

merde, j'ai oublié d'appeller ma méthode initSurface :lol: !!!!


---------------
Boolay for ever...
n°143483
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 23-05-2002 à 17:40:51  profilanswer
 

Moustaaki a écrit a écrit :

merde, j'ai oublié d'appeller ma méthode initSurface :lol: !!!!  




 
 
oui, bon, ça fait pareil :D -> montée en charge du processeur, rien ne s'affiche (à part la fenêtre) et j'ai arrété avant ke tout plante grâce aux gestionnaires de tâches (merci win2000 :jap:)
 
 
 
 
 
je viens de supprimer la méthode init... à la place, j'ai rajouté à la fin du constructeur :
 
TForm(AOwner).insertControl(self);
puis le code ki est dans initSurface;
 
 
voilà... j'avais pas pensé à faire ça... 'fin, c'est p'têtre pas conseillé encore :D

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 23-05-2002 à 17:48:23--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°143653
HelloWorld
Salut tout le monde!
Posté le 23-05-2002 à 23:38:21  profilanswer
 

Au sujet des handle ...
Un handle c'est un peut comme un pointeur : ca permet de désigner un objet (géré par Windows) sauf que c?une sorte de numéro unique qui identifie un objet et pas son adresse. Ce n'est pas l'objet lui même (qui est ainsi protégé car uniquement modifié par Windows via des fonctions qui utilisent cet handle pouridentifier l'objet à modifier).
hWnd : c'est un handle (le h du debut ...) de fenetre (Wnd).
hDC : c'est un handle de device context (DC).
 
Ce sont des handle sur des objets fenetre et contexte de périphérique.
 
A quoi sert un device context ?
Prenons le cas de SetPixel : il doit savoir où se trouve la fenêtre, ses dimensions, si elle est en partie cachée par une autre afin de déterminer où afficher un point sur l'écran et si effectivement cela doit être fait.
De même une fonction dessin de texte, elle doit savoir tout ca mais en plus savoir quelle police utiliser pour dessiner le texte ...
Et il en est ainsi pour toutes les fonctions de dessin sur une fenêtre.
Alors 2 possibilité : soit une fenêtre contient en plus des nombreux champs qu'elle possède tous ces champs en plus, soit on créé une variable qui contient tout ça et on l?associe a la fenêtre.
La dexieme solution à savoir un type Device Context au lieu d'un mega type Fenetre qui contiendrait tout a pas mal d'avantage ... une fenetre peut ainsi partager son DC avec une autre, le type fenetre est moins volumineux : mine de rien, un DC ca fait ... 800 octets !!!. Car une fenetre est beaucoup plus d'un rectangle a l'ecran. Je dirait que c'est plutot le DC qui sert de primitive pour les serveurs graphiques.
 
Une fenetre Windows est un véritable objet, capable de polymorphisme, d'héritage et même de plus (super-classing = héritage multiple ?), qui peut servir a autre chose qu'a dessiner un rectangle à l'écran : dialoguer avec d'autres applications via des messages, encapsuler des données, ... on fait de la véritable programmation objet avec des données privées gérées en interne par la fenêtre et mises à disposition d'autres objets (autres fenetres) via des méthodes (implémentées sous forme de messages ...)
Ainsi WM_CREATE et WM_DESTROY sont ... des constructeurs et destructeurs ! ! !
C'est pour cela que l'architecture Win32 se prête si bien à la programmation objet. Et ce n'est pas parce qu'on programme en C que ce n'est pas de l'objet. Faire de l'objet en C est possible (exemple : gtk !) mais c'est plus fastidieux qu'en C++ car le langage ne met pas à ta disposition tout un tas d'artifices (constructeurs appelés automatiquement, mon_type.ma_fonction(), membres prives/public ...) qui facilitent et sécurisent le boulot.
 
Pour en revenir au DC, MS a donc préféré mettre à disposition des programmes une petite pile de DC que le programmeur est libre de se gérer.
Quand tu fait GetDC(), tu utilises un des DC disponibles sur la pile, tu l'utilises, et quand tu n'en n'a plus besoin, tu le libère via ReleaseDC(). Ainsi, un programme fonctionne avec très peu de DC (je crois qu'au lancement Windows te met 5 DC de dispo sur la pile). Même si ton programme possède 100 fenêtre, tu n'utilise que quelques DC (imagine le gain en mémoire : 100 DC de 800 octets, c'est pas négligeable ! Surtout du temps de Windows 3.1 ou un PC avait quelques mega de mémoire. Toute économie était bonne à prendre)
L'inconvénient avec ceci c'est qu'a chaque allocation de DC, celui-ci est vierge. Donc tu passes pas mal de temps a chaque fois a te le mettre comme il faut (choisir la police, la couleur, ...) et tu payes en temps d'exécution l?économie mémoire (ce qui est souvent le cas).
Aujourd'hui, 800 octets par fenêtre c'est négligeable. Car il n'y a pas tant de fenêtre que cela à l'écran (une fenêtre ToolBar (barre d'outils :)) est intelligente : elle ne fait pas un CreateWindow pour chaque bouton de sa barre d'outils, mais effectue un simple dessin de boutons ... et hop une dizaine de fenetres économisées ... et tous les composants de Windows sont ainsi bien optimisés).
Alors MS recommande de plutôt utiliser un DC pour chaque fenêtre qui ne sera jamais libéré. On perd 800 octets par fenêtre mais on gagne des dizaines d'appels aux fonctions GDI. Ceci est fait à l'aide du style CS_OWNDC et c'est pour cela que je récupère mon DC au démarrage et que je le libère (c'est obligatoire ca ?) a la fin. Avec CS_OWNDC, ma fenêtre se voit attribuer un DC indépendamment de la pile de DC de mon programme. Y'a pas à le libérer car de toutes façons il est réservé uniquement pour ma fenêtre.
 
Un mot sur ma notation :
g_hWinDC : le "g_" c'est pour "global" a savoir variable globale. T'as pas a garder ca ! :lol:
 
Au fait, un blit, c'est tout simplement une recopie ;)
 

Code :
  1. TSpectrumControl = class (TCustomControl)
  2. procedure Paint; override;
  3. private
  4.     _hBitmap: HANDLE;
  5.     _hBMPDC: HDC;// Device context compatible pour le bitmap.
  6. protected
  7. procedure PaintWindow(p_hdc: HDC); override;
  8. public
  9.     constructor create(AOwner: TComponent); override; // TWinControl::CreateWnd plutot non ?
  10.     destructor destroy; override; // TWinControl::DestroyWnd ...
  11.     procedure blitColumn(col: integer);
  12.     // procedure emptySepctrum; // c'est quoi ?
  13.     // procedure initSurface; // utile ?
  14. end;


Pas besoin de g_Rect: TRect;, tu as déjà TWinControl::ClientRect !!!
C'est le même ... remplace g_Rect par Clientrect.
De même _hWinDC: HDC;, c'est ... la propiété TWinControl::Handle !!!
_hBitmap est un handle tout court (HANDLE), pas un handle sur fenetre (HWND) ...
Du coup ca change :

Code :
  1. constructor TSpectrumControl.create(AOwner: TComponent);
  2. begin
  3. inherited create(AOwner);
  4.     _Bitmap = CreateCompatibleBitmap(Handle, Width, Height);
  5.     _hBMPDC = CreateCompatibleDC(Handle);
  6.     SelectObject(_hBMPDC, _hBitmap);
  7. end;


A moins que ca aille dans initSurface mais je crois pas (a quoi sert ce dernier ?) Je dirais même que ça doit aller dans TWinControl::CreateWnd ...
 

Code :
  1. destructor TSpectrumControl.destroy;
  2. begin
  3.     DeleteObject(g_hBitmap);
  4.     DeleteDC(g_hBMPDC);
  5. inherited;
  6. end;


idem, TWinControl::DestroyWnd me semble meilleur ...
Je pense que TWinControl::PaintWindow est parfaitement indiqué au lieu de paint qui ne sert à rien ;)  ... en plus pas besoin de BeginPaint ni de EndPaint ... ceci est déjà fait par Delphi qui te file gracieusement le DC en paramètre ... plus que pas besoin, c'est une erreur ...
Au passage, tu as oublié le blit ... c'est là qu'il faut afficher l'image ... p_hdc, c'est quoi ce p_ ?

Code :
  1. procedure TSpectrumControl.PaintWindow(p_hdc: HDC);
  2. begin
  3. inherited;
  4.     BitBlt(p_hdc, 0, 0, Width, Hight, _hBMPDC, 0, 0, SRCCOPY);
  5. end;
  6. end;
  7. {
  8. remplit la zone de noir.
  9. }
  10. procedure TSpectrumControl.emptySepctrum;
  11. begin
  12.     // FillRect(Handle, ClientRect, GetStockObject(BLACK_BRUSH)); : il doit y avoir un moyen en Delphi de faire la même chose ... le but est d'effacer le composant Delphi en noir !
  13.     FillRect(_hBMPDC, ClientRect, GetStockObject(BLACK_BRUSH));
  14. end;


 
Voila en gros le truc. Ton principal problème c'est que tu penses qu'il y a Delphi d'une cote et Win32 de l'autre ... Delphi est une surcouche de Win32 qui le simplifie ...
Aussi, certaines parties de code sont déjà faites et tu dois tout simplement les éliminer, car c'est Delphi qui s'en charge.
La fenêtre dans laquelle je dessinais est ici ton composant Spectrum. Toutes les proprietes Rect, Handle, DC de ce composant sont gérées par Delphi. Tu les utilises tout bêtement et directement.
Les seuls et uniques ajouts sont un bitmap en mémoire : h_Bitmap et un contexte de périph pour ce bitmap : _hBMPDC.
L'equivalent de WM_CREATE et WM_DESTROY en Delphi sont TWinControl::CreateWnd et TWinControl::DestroyWnd si je ne m'abuse (j'ai l'aide VCL de C++Builder sous les yeux ... quel con j'aurais du faire le prog avec ça, ça aurait été immédiat à traduire ! Mais bon ça faisait longtemps que je voulais faire un petit programme de test en Win32 pour manipuler les bitmap ...)
 
Dans ces 2 méthodes tu créés le bitmap et son DC puis tu les destruit. Ca oui, c'est win32. Ensuite, le seule autre ajout win32 est dans TWinControl::PaintWindow pour dessiner le bitmap quand il a été effacé (un simple blit complet) et dans CalculeColonne pour :
- afficher un point dans le bitmap avec setPixel(g_hBMPDC, Col, i, COLORREF(Couleur_voulue);
- afficher la colonne modifiée du bitmap dans ton controle : BitBlt(GetDeviceContext(), Colonne, 0, 1, Width, _hBMPDC, Colonne, 0, SRCCOPY);
Tout ce qui est HDC g_hWinDC, TRACE_WIDTH, et TRACE_HEIGHT devient TonComposant.Handle, TonComposant.Width, TonComposant.Height ...
 
Voila voila ... j?espère que ça va mieux ... on peut encore optimiser je pense via les DIB, puis via DirectX, puis avec l?assembleur, mais à chaque fois c?est de plus en plus complexe et apparemment ça c?est déjà pas simple !


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

HelloWorld a écrit a écrit :

 
Un mot sur ma notation :
g_hWinDC : le "g_" c'est pour "global" a savoir variable globale. T'as pas a garder ca ! :lol:




ouai, je sais bien ;) , c'est juste pour m'y retrouver entre le code pascal et le tiens :) !
 

Citation :


Code :
  1. // procedure emptySepctrum; // c'est quoi ?
  2.     // procedure initSurface; // utile ?
  3. end;




emptySepctrum est une fonction spécifique à mes besoins : la surface doit afficher un spectre. Mais il va devoir en afficher plusieurs puisque lorsqu'on examine quelqu'un, on lui examine plusieurs vaisseaux. donc, entre chaque examen, on remplit de noir la surface pour représenter un spectre vide -> d'où la méthode emptySpectrum qui je l'avoue a un nom de merde :D .
 

Citation :


Pas besoin de g_Rect: TRect;, tu as déjà TWinControl::ClientRect !!!


 
ah ouai, pas con ;)
 

Citation :


C'est le même ... remplace g_Rect par Clientrect.
De même _hWinDC: HDC;, c'est ... la propiété TWinControl::Handle !!!
_hBitmap est un handle tout court (HANDLE), pas un handle sur fenetre (HWND) ...
Du coup ca change :

Code :
  1. constructor TSpectrumControl.create(AOwner: TComponent);
  2. begin
  3. inherited create(AOwner);
  4.     _Bitmap = CreateCompatibleBitmap(Handle, Width, Height);
  5.     _hBMPDC = CreateCompatibleDC(Handle);
  6.     SelectObject(_hBMPDC, _hBitmap);
  7. end;


A moins que ca aille dans initSurface mais je crois pas (a quoi sert ce dernier ?) Je dirais même que ça doit aller dans TWinControl::CreateWnd ...


 
en fait, je crois qu'on ne peux pas utiliser le Handle dans le create parceque le composant n'a pas encore de fenêtre parente (renvoie l'erreur à l'execution : "le control '' n'a pas de fenêtre parente" )... d'où la méthode initTruc mais c'est en effet carrément mieux de le mettre dans CreateWnd, j'avoue que je n'avais pas remarqué son existence (sniff, excuses moi CreateWnd :) )
 
 

Citation :


Au passage, tu as oublié le blit ... c'est là qu'il faut afficher l'image ... p_hdc, c'est quoi ce p_ ?


en fait, en delphi, ou plutôt en pascal, la casse n'est pas respectée donc si tu déclare un truc dans ce style : hdc: HDC , il va pas comprendre :) ... alors, j'ai mis un p devant pour "paramètre" :)
 

Citation :


Voila en gros le truc. Ton principal problème c'est que tu penses qu'il y a Delphi d'une cote et Win32 de l'autre ... Delphi est une surcouche de Win32 qui le simplifie ...


ouai, delphi "encapsule" du win32 (hum, j'aime bien les langage de haut niveau ;) ) ... mais comme on peut utiliser toute l'api win32, j'y suis allé un peu comme un beu ;) ...
 
 

Citation :


Voila voila ... j?espère que ça va mieux ... on peut encore optimiser je pense via les DIB, puis via DirectX, puis avec l?assembleur, mais à chaque fois c?est de plus en plus complexe et apparemment ça c?est déjà pas simple !  


ouai mais là, j'ai bien mieux compris ;) t'expliques vachement bien ! merci beaucoup :love: !
et c'est vrai que directX, j'risque de nager complétement !
 
 
bon, en tout cas, j'vais maintenant faire ça proprement (pas de freestyle cette fois-ci:)) et je devrais y arriver:D.
encore MERCI, et puis merci et merci :D  :wahoo:  
 
aller, ciao et peut-être dans kekles heures pour de nouvelles aventures :lol:


---------------
Boolay for ever...
n°143888
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 24-05-2002 à 13:10:31  profilanswer
 

putain, je suis trop un boulet...même avec toutes ces explications, j'y arrive po .... :(:gun:

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 24-05-2002 à 13:10:51--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
n°144016
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 24-05-2002 à 15:12:46  profilanswer
 

[:wouaf] boolay time....
 
 
bon, voici mon code... le paintWnd ne fonctionne pas... ya ke ma fonction fillSurface ki marche puisqu'elle fait appel aux fonctions du VCL.
 
 

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


 
ou comment être un gros bouley :( DSL.
 
le truc, c'est que ça ne fait rien... ça plante pas, c'est déjà ça... mais ça fait queud.

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 24-05-2002 à 15:14:38--[/jfdsdjhfuetppo]


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

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   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