Créer un contrôle dans une Form depuis un objet ?

Créer un contrôle dans une Form depuis un objet ? - C#/.NET managed - Programmation

Marsh Posté le 19-11-2005 à 21:10:32    

J'ai un objet, et je veux qu'il crée un objet dans ma Form.
 
J'ai écrit le constructeur de la sorte :

Code :
  1. public monObj(System.Windows.Forms.Form win)
  2. {
  3. this.picture = new System.Windows.Forms.PictureBox();
  4. this.picture.Image = System.Drawing.Image.FromFile("rond.gif" );
  5. this.picture.Width = 100;
  6. this.picture.Height = 100;
  7. this.picture.Location = new System.Drawing.Point(10, 10);
  8. win.Controls.Add(picture);
  9. }


 
Et je l'appelle depuis le Form1_Load de ma Form :

Code :
  1. monObj test = new monObj(this);
  2. this.Refresh();


 
Mais ça n'affiche rien :/
 
J'ai oublié quoi ?

Reply

Marsh Posté le 19-11-2005 à 21:10:32   

Reply

Marsh Posté le 19-11-2005 à 21:17:09    

Idem si je met dans le Main sans lien vers la Form après le "application.Run()"

Reply

Marsh Posté le 19-11-2005 à 21:20:49    

marche très bien chez moi :spamafote:
 
edit: sous C# Express 2005


Message édité par Harkonnen le 19-11-2005 à 21:21:18

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-11-2005 à 21:33:21    

:heink:
 
Je viens de trouver ce qui déconne, en fait ce code marche :D
 
Par contre, je vois pas ce qui déconne là...
 
Je veux trouver le rayon d'une sphère en fonction de sa masse et de la densité de son matériau...
 
La formule est à priori :

Code :
  1. public double radius    // m
  2.  {
  3.   get
  4.   {
  5.    return Math.Pow((weight / density) / ((4 / 3) * Math.PI), 1 / 3);
  6.   }
  7.  }


 
Ce qui donne au final, dans mon cas, 159^.333 ce qui doit faire 5
Seulement... ben... pourquoi ce barge de C# me retourne 1.0 ???
 
Forcément, une image de 1x1 dont les 4 coins sont transparents, je la vois pas... :/

Reply

Marsh Posté le 19-11-2005 à 21:42:02    

je vais tester, donne moi tes valeurs pour weight et density


Message édité par Harkonnen le 19-11-2005 à 21:42:17

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-11-2005 à 21:43:30    

1000 et 2

Reply

Marsh Posté le 19-11-2005 à 21:45:29    

Sinon (pour revenir au problème original), on ne peux pas redimensionner l'élément "Image" dans un "PictureBox" :/
 
Je fais comment moi pour redimensionner ma boule ?
(je pensais faire comme avec le Web, charger une image de taille assez grosse, et la redimensionner pour avoir une image plus ou moins grande - d'où le calcul du rayon de la sphère -)

Reply

Marsh Posté le 19-11-2005 à 21:46:55    

En fait, c'est le "Pow" qui sait pas faire 159^.3333 :/
 
-- Edit --
 
J'y crois pas :o
 
Pow(x, 1 / 3)
 
Ca fait :
 
(int)1 / (int)3 = 0
 
et du coup ben... quelque soit x, ça retourne forcément 1...
 
corrigé en mettant des () autour de 1 / 3 et là il comprend que je fais un calcul sur des double :o
 
 
Et dire que j'ai l'impression de trop caster mes variables et mettre des () pour rien... Ben je crois que même en en mettant partout même quand c'est pas nécessaire, il en faut plus :D
 
 
Ceci dit, ça ne résoud pas mon problème de boules... :/ (les boules :D)


Message édité par Arjuna le 19-11-2005 à 21:50:58
Reply

Marsh Posté le 19-11-2005 à 22:19:59    

ben non, c'est logique :spamafote:
http://msdn2.microsoft.com/en-us/library/5kzh1b5w.aspx

Citation :


int i = 123;
 
When an integer literal has no suffix, its type is the first of these types in which its value can be represented: int, uint, long, ulong. In this example, it is of the type int.


 
Donc nul besoin de mettre des parenthèses, il te suffit de déclarer les littéraux "1" et "3" comme étant des flottants ;)
 

Code :
  1. return Math.Pow((1000 / 2) / ((4 / 3) * Math.PI), 1.0 / 3.0);


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-11-2005 à 22:22:51    

sinon, pour ton problème de boule, tu peux resizer un picturebox comme ceci :
 

Code :
  1. picture.SizeMode = PictureBoxSizeMode.StretchImage;


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-11-2005 à 22:22:51   

Reply

Marsh Posté le 19-11-2005 à 23:23:43    

En fait, je suis en train de me lancer dans DirectDraw.
 
Je suis bloqué, je n'arrive qu'à afficher des cercles par dessus une image, parceque si je vire l'image ça plante :D
 
Je viens de tilter qu'il y a de la doc et des exemples dans le SDK que j'ai téléchargé... Avec un peu de chance... :sweat:

Reply

Marsh Posté le 19-11-2005 à 23:25:55    

Ouahou ! Super la doc...
 

Citation :


DirectDraw  
 
--------------------------------------------------------------------------------
 
Warning: Microsoft DirectDraw has been deprecated. Deprecated components of Microsoft DirectX 9.0 for Managed Code are considered obsolete. While these components are still supported in this release of DirectX 9.0 for Managed Code, they may be removed in the future. When writing new applications, you should avoid using these deprecated components. When modifying existing applications, you are strongly encouraged to remove any dependency on these components.
The DirectDraw application programming interface (API) is the component of DirectX that enables you to directly manipulate display memory, the hardware blitter, hardware overlay support, and flipping surface support. For more information, see the Microsoft.DirectX.DirectDraw managed code reference documentation.
 
 
--------------------------------------------------------------------------------
 
Send comments about this topic to Microsoft. © Microsoft Corporation. All rights reserved.
 
Feedback? Please provide us with your comments on this topic.  
For more help, visit the DirectX Developer Center  


 
Et y'a que ça... Microsoft à décidé qu'il ne fallait plus dessiner en 2D :sweat:

Message cité 1 fois
Message édité par Arjuna le 19-11-2005 à 23:26:26
Reply

Marsh Posté le 19-11-2005 à 23:29:31    

Bon ben... je retourne à "picture.SizeMode = PictureBoxSizeMode.StretchImage;" :D

Reply

Marsh Posté le 20-11-2005 à 00:35:23    

Y'a pas à dire, ça me gave :o
 
Maintenant, le prog est terminé sauf que...
 
Ce tocard veut pas mettre à jour l'affichage :fou:
 
C'est tellement minable à ce niveau que passé 3 images à afficher, il n'en affiche que les 3 premières, et ne met plus jamais à jour l'affichage (pourtant, mes balles bougent bien, mode debug inside...)
 
Pourtant j'ai des refresh dans tous les sens, sur la form comme sur les images, mais que pouic :o
 
Doit bien y avoir un moyen de bouger une image à l'écran quand même :o


Message édité par Arjuna le 20-11-2005 à 00:36:19
Reply

Marsh Posté le 20-11-2005 à 11:22:58    

Bon... Allez, j'ai du courage aujourd'hui, je vais me lancer dans du Direct3D, c'est ce qui remplace DirectDraw maintenant à priori.
 
Après tout, c'est vrai qu'on peut faire de la 2D avec de la 3D... Tout comme on peut presser une orange au mixeur puis utiliser un filtre à café pour récupérer le jus. (qu'est-ce qu'il faut pas inventer...)

Reply

Marsh Posté le 20-11-2005 à 12:00:45    

Tiens, j'ai ENFIN trouvé un tuto clair pour apprendre le D3D.
 
A vrai dire, ça a l'air d'être des cours de fac ou autre, donc forcément, c'est détaillé et ça avance point par point (on n'as pas d'un tuto à l'autre 20 nouveaux objets dont seuls 3 sont expliqués :))
 
http://home.myuw.net/jpursell/css4 [...] s/main.htm

Reply

Marsh Posté le 20-11-2005 à 12:03:06    

y'a juste ça :

Citation :


Note To CSS Students:
If you are currently enrolled in class, please concentrate on the versions using native DirectX (with C++). In my opinion, it is very important to learn the native DirectX first. I'm putting this work here only to show you an alternative, but I don't want this stuff to interfere with your school work.


 
Mais on va dire que je suis pas étudiant en CSS et que ce truc me suffit amplement :D

Reply

Marsh Posté le 20-11-2005 à 13:04:31    

Arjuna a écrit :

Et y'a que ça... Microsoft à décidé qu'il ne fallait plus dessiner en 2D :sweat:


Pour le dessin en 2D, ça se fait avec GDI+, non ?

Reply

Marsh Posté le 20-11-2005 à 14:12:00    

Chais pas ce que c'est :D
 
Mais c'est pas grave, avec D3D ça marche.
 
Niveau perfs, c'est pas terrible, mais à priori, c'est surtout mon code qui n'est pas optimisé.
 
Par contre, là j'ai un souci d'algo !
Comprends pas. Dans mon JS que j'ai fait l'autre jour, je détecte les collisions entre les balles.
Ca se traduit par une fusion des deux dans celle du plus petit index dans mon tableau, et la destruction de l'autre.
 
En théorie, ça marche, et en JS ça fait ce que je demande.
 
Sauf que là, je sais pas si ça vient de DX qui n'aime pas que je modifie des propriétés de Vertices et j'ai oublié de mettre un truc ou quoi mais... Si la seconde boule disparait bien, ben... la première aussi !
 
Et là, je sèche, je sais pas si c'est DX qui déconne ou mon algo, je trouve pas en tout cas :/
 
Et j'ai pas trouvé d'exemple DX qui permette d'ajouter/modifier/supprimer des éléments à la volée, donc je ne sais pas si c'est ce de côté qu'il manque un truc...
 
En tout cas, elles bougent, c'est déjà ça :D

Reply

Marsh Posté le 20-11-2005 à 15:02:01    

Pfff...
 
J'en ai profité pour changer le système de collision, maintenant les balles restent collées, mais j'ai un souci :D
 
Mettons un point A et un point B défini par :
 
A(xa, ya, poida, rayona)
B(xb, yb, poidb, rayonb)
 
Dist(A, B) < rayona + rayonb
 
=> Le but du jeu, c'est trouver (xa, ya) et (xb, yb) de façon à ce que Dist((xa, xb), (ya, yb)) = rayona + rayonb, en prenant le point de tangeante des deux cerles = centre de grativé de (A, B).
 
La galère, chais plus compter moi :sweat:
 
-- Edit --
 
Merde, pis c'est pas ça... Il faut que Grav(A', B') = Grav(A, B) plutôt... Avec A' et B' déplacés sur l'axe (A, B) de façon à ce que Dist(A', B') = rayona + rayonb :sweat:
(sâchant aussi qu'il faut que A' et B' restent du bon côté du centre de gravité évidement...)


Message édité par Arjuna le 20-11-2005 à 15:08:44
Reply

Marsh Posté le 20-11-2005 à 15:28:41    

T'ain, j'ai la tête dans le cul, j'arrive rien à trouver comme formule :/

Reply

Marsh Posté le 20-11-2005 à 16:51:05    

J'ai mon D3D qui se dessine dans un contrôle de la fenêtre... Je fais comment pour le redimensionner ? Parceque ça plante méchamment si je redimensionne le contrôle :D

Reply

Marsh Posté le 20-11-2005 à 16:54:49    

Trouvaid ! Faut juste réinitialiser la 3D :)

Reply

Marsh Posté le 20-11-2005 à 21:20:13    

pour des modifications d'image dans GDI+, pour qu'il en tienne compte
appele la méthode "invalidate()"
 
sinon aucune modification serait faite... désolé du retard... je suis kazi certain qu'avec ça ça fais ce que tu veux... enfin bon... voila bonne chance dans directx


Message édité par moi23372 le 20-11-2005 à 21:22:26
Reply

Marsh Posté le 20-11-2005 à 21:34:18    

Là il me reste plus qu'à trouver comment on se sert de la molette de la souris en C# et vais pouvoir vous montrer mon super chef d'oeuvre :love: :D

Reply

Marsh Posté le 30-11-2005 à 15:48:03    

Arjuna a écrit :

Là il me reste plus qu'à trouver comment on se sert de la molette de la souris en C# et vais pouvoir vous montrer mon super chef d'oeuvre :love: :D

T'as une méthode OnMouseWheel sur tous les contrôles Winform. Mais je sais pas si tu en utilise :)
Sinon c'est résolu ton pb avec les int et les doubles ? Pask'en fait, en C# pour déclarer un flottant, faut l'écrire avec un 'f' après.
Ex : 4f / 3f.
L'opérateur '/' verra que les deux paramètres sont des flottants, il fera une division flottante (beaucoup plus lourde que la division entière).

Reply

Marsh Posté le 30-11-2005 à 16:02:22    

En effet, tous les problèmes de ce topic sont résolus à ce jour (mise à par la molette qui déconne).
 
En effet, il faut tourner une demi-heure la molette pour que ça fasse quelquechose... et ça bouge d'autant que la molette a été bougée !
 
Pas bien compris d'où ça venait, mais à priori, c'est plus mon programme qui déconne qu'autrechose (y'a notamment une belle fuite mémoire, au bout de 5 minutes d'utilisation, le prog utilise 3 Go de RAM :D)

Reply

Marsh Posté le 30-11-2005 à 17:18:46    

Oulala !!  Pas mal :)
C'est ptet pour ça qu'elle déconne la molette : ça doit swapper à mort...

Reply

Marsh Posté le 01-12-2005 à 00:01:40    

D'est le souci de D3D... La lib pour .NET est censée être managed, mais visiblement ils ont chié un truc dans le nettoyage de la mémoire :D
 
Et à un moment, je crée une chiée d'objets à chaque passage dans une boucle de render, et je me demande si à la sortie il sait bien les détruire comme un grand :D

Reply

Marsh Posté le 01-12-2005 à 00:07:38    

Arjuna a écrit :


Et à un moment, je crée une chiée d'objets à chaque passage dans une boucle de render, et je me demande si à la sortie il sait bien les détruire comme un grand :D


Ben alors, tu voles plus ? Ca fait un bail que je t'ai pas croisé à FL350 :D
Sinon j'ai réinstallé mon FS2004, ça va bcp mieux, adieu plantages :)
</HS>
Pour tes objets, si tu veux être sur qu'ils soient détruits, tu fais un petit coup de Dispose() quand t'en as plus besoin (sans oublier le GC.SuppressFinalize() qui va avec, pour dire au GC de ne pas virer les références à ces objets, vu qu'ils n'existent plus)


Message édité par Harkonnen le 01-12-2005 à 00:08:07

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 01-12-2005 à 01:08:12    

En effet, je vais regarder ça :)
 
<hs> En effet, j'ai pas volé depuis un moment, pas mal de trucs à faire au taff en ce moment et des soucis familiaux... Et même plus le temps de rien faire en ce moment... </hs>

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed