cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 2007
-
13 mars 2006 à 14:34
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 2007
-
20 mars 2006 à 08:51
Bonjour,
j'ai une application faite sous SharpDevelop 2.0 compilée en .NET 1.1.
Mon application n'a pas de bord (this .FormBorderStyle
= System
.Windows
.Forms
.FormBorderStyle
.None
;)
Donc, directement, je ne peux la déplacer. Alors je me sert de mouseDown, mouseMove et mouseUp pour faire ça.
private Point mouse_pos
;
bool mouse_is_down = false;
static int minDistBorder = 5; //distance pour coller le bord
private void mouseMove(object sender
, MouseEventArgs e
)
{
if (mouse_is_down && !this .WindowState.Equals(FormWindowState.Maximized)) //j'ai cliqué et je ne suis pas en plein ecran
{
if (e.Button.Equals(MouseButtons.Left))//j'ai cliqué gauche
{
Point current_pos = this
.Location;
if ((current_pos.X + (Control.MousePosition.X - mouse_pos.X)) < minDistBorder) //je serais trop pret du bord gauche
{
current_pos.X = 0;) //je me colle
}
else
{
current_pos.X = current_pos.X + (Control.MousePosition.X - mouse_pos.X);) //sinon je m'approche
}
if ((current_pos.Y + (Control.MousePosition.Y - mouse_pos.Y)) < minDistBorder)) //je serais trop pret du haut
{
current_pos.Y = 0;//je me colle
}
else
{
current_pos.Y = current_pos.Y + (Control.MousePosition.Y - mouse_pos.Y);//sinon je m'approche
}
if (Screen.GetWorkingArea(this ).Width - (current_pos.X + (Control.MousePosition.X - mouse_pos.X)) - this .Width < minDistBorder) //je serais trop pret du bord droit
{
current_pos.X = Screen.GetWorkingArea(this ).Width - this .Width; //je me colle
}
if (Screen.GetWorkingArea(this ).Height - (current_pos.Y + Control.MousePosition.Y - mouse_pos.Y) - this .Height < minDistBorder)//je serais trop pret du bas
{
current_pos.Y = Screen. GetWorkingArea (this ).Height - this .Height;//je me colle
}
this .Location = current_pos; //j'effectue le deplacement
mouse_pos = Control.MousePosition; //j'enregistre la position de la souris
}
}
}
Sur ma machine de dévellopement, j'ai installé le compact FrameWork 2.0 et 1.1.
Mon application fonctionne très bien, je peux la déplacer facilement.
Je précise que je compile bien en 1.1.
Lorsque je fais dans le programme:
MessageBox. Show (Environment
.Version
.ToString());
j'ai bien "1.1.4322.2032" qui s'affiche sur toutes les machines d'execution (ma machine de developement et les machines cibles).
Sur les machines cibles (qui n'ont que le 1.1 et je ne veux pas les passer en 2.0) ca ne se déplace que de quelques pixel puis ca n'avance plus. Donc ce n'est pas pratique ...
Sur une des machines cibles, j'ai installer le framework 2.0 et là miracle, ca fonctionne bien sur cette machine. Pkoi, aucune idée.
J'ai continué ma recherche de la solution en faisant un deplacement plus direct, sans chercher à coller les bord.
Ca donne dans le mouseMove du clic gauche:
Point current_pos = movePictureBox.Location
;
current_pos.X += Control.MousePosition.X - mouse_pos.X;
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 13 mars 2006 à 17:08
Y'a une astuce qui peut marcher mais ça ne va peut être pas te convenir en passant la propriété Enabled de tes PictureBox à false tu devrais pouvoir intercepter le message WM_NCHITTEST dans la méthode WndProc de ta forme ( comme l'exemple au-dessus ), mais tes PictureBox ne vont plus répondre au clique droit :/
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 13 mars 2006 à 14:58
J'avais déja vu ce lien mais je n'ai pas sus l'exploiter.
------------------------
Posté par : Lutinore: Salut, voilà comment on peut déplacer une forme sans bordure, il s'agit de mentir à Windows et lui dire que le curseur est sur la barre de titre alors qu'il est dans l'air client:
private
const
int WM_NCHITTEST = 0x0084;
private
const
int HTCLIENT = 1;
private
const
int HTCAPTION = 2;
protected
override
void WndProc(
ref
Message m )
{
------------------------
J'ai copier la fonction et les variables pour les coller dans mon application.
J'ai modifier mon initilizeComponent pour ne plus appeler mouseUp, mouseDown et mouseMove.
Ca compile mais ca ne se déplace pas du tout cette fois.
Je pense donc ne pas savoir me servir de WndProc() ...
Serais tu m'expliquer?
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 13 mars 2006 à 15:33
OK, ca fonctionne sur une form normale mais pas avec mon programme.
En fait je vais expliquer un peu plus mon programme :)
Pour ceux qui suivent un peu mes questions sur ce forum (on sait jamais que j'ai un fan club ici :D), vous savez que je réalise une application pour visualiser des caméras IP de type Axis.
La visualisation en elle meme est assez simple, récupération de l'image en cours, insertion dans une pictureBox et on boucle.
Maintenant, autour de ca, je souhaite faire un truc jolie.
Mon application consiste à visualiser les 3 caméras de mon entreprise (je suis stagiaire au fait).
Le visuel de ma application est une form sans bord, dans laquelle 3 pictureBox sont collées les unes a cotés des autres de même hauteur. Ma form colle les pictureBox.
Ca ressemble donc à un large rectangle.
Je souhaite pouvoir faire tout bouger (les pictureBox restents collées entre elles) toutes l'application avec un drag&drop clic gauche.
Puis change l'ordre des pictureBox avec un drag&drop clic droit. Durant ce drag&and drop je crée une nouvelle pictureBox contenant l'image courante de la pictureBox à déplacer. Ca fonctionne bien.
Je travaillais au debut avec VS2005 sous .NET 2.0. Les PCs sur lesquels tournent l'application ont le .NET 1.1, donc à chaque fois install du 2.0, assez lourd ...
Donc j'ai voulu passer en 1.1 pour que ce soit plus facile au deploiment.
Donc me voilà avec SharpDevelop et compilation en 1.1.
Galère de mise à niveau du programme mais c'est bon, j'y suis arrivé.
Je me retrouve maintenant avec le problème cité en premier message.
L'utilisation de WndProc ne semble pas etre appelé car je clique sur une pictureBox (vu que je peux pas cliquer sur ma form qui colle les pictureBox).
EN faisant un this.refresh(), ca va mieux mais comme il repaint tous les éléments j'ai du retard sur ma souris et c'est assez génant.
Voila où j'en suis, si vous avec des questions ou des solutions :)
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 13 mars 2006 à 16:32
Je patoge dans la semoule là :S dsl !
Donc j'ai essayé de comprendre le post de coq sur son blog.
J'ai pas tout suivis, son code à télécharger n'utilise pas le source fourni, je pense qu'il est là pour nous montrer le probleme des controle enfant ...
Quand à sa classe, ca semble bien, mais je ne comprends pas, dsl.
Pour tester, j'ai betement copier sa classe dans mon source.
Dans mon initializeComponent, j'ai rajouté a la fin:
ContainerLevelMouseEventsMessageFilter clmemf
= new ContainerLevelMouseEventsMessageFilter (this );
pour espèrer que ça fasse tout seul :) mais non :(
je me suis dis, peut etre ajouter à la main l'evenement de déplacement comme ca:
clmemf
.MouseMove
+ = new System
.Windows
.Forms
.MouseEventHandler(this .mouseMove
);
mais ca ne fait rien de plus.
Honnetement, je comprends rien à vos override de message windows, je ne sais pas comment vous faite pour trouver tout ca.
Je vais laisser tomber, ca deveint trop compliqué pour mon petit cerveau, il va falloir que je me documente avant de me lancer dans se genre de truc.
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 13 mars 2006 à 21:28
Je testerai demain de retour au boulot, mais c'est une bonne solution.
Après je dois avoir quelque part dans un bout de code une fonction qui me dis si la souris est au dessus d'un coposant ou non, dans mon code je faisait déjà le parcours de toutes les pictureBox (je pouvais rajouter et enlever des pictureBox durant l'execution).
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 14 mars 2006 à 09:26
Je confirme, en passant la propriété enable de chaque pictureBox à false, je peux déplacer ma form en l'override de WndProc en dupant windows sur la position du curseur.
Me reste plus qu'à remagner mon code pour les menus sur les picture box :)
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 14 mars 2006 à 13:07
Cette derniere reponse marche super !
Bon, je comprend pas pkoi mais ca fonctionne lol.
Donc, si le pictureBox recois un clic down gauche, il envoie à son parent ( pour moi la form) un message (une commande) OxF012 (alors là je ne sais pas ce que c'est comme commande).
Par contre, le releaseCapture() je ne vois pas ce que c'est ... ca veut peut etre dire qu'il ne tient plus compte du clic.
En tout cas ca fonctionne super. (winXp et win2000)
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 14 mars 2006 à 13:30
Avec la nouvelle class j'ai plus l'evenement de double clic qui remonte, ni au niveau de la form ni des pictureBox, je pense à case du fameux releaseCapture();
Dans tout ca, j'ai moi même oublié le but principal de ma question :s, surtout que je ne l'avais pas posé, j'étais directement allé au problème.
Ce que je veux faire, c'est de ne pouvoir déplacer ma forme qu'a l'intérieur de l'ecran.
C'est pour celà que, durant le déplacement, je me servais de Screen.GetWorkingArea (this)
pour délimiter la zone de travail. C'etait cet appel qui merdé.
En faisant directement:
if (e.Button.Equals(MouseButtons.Left))
{
Point current_pos = this .Location;
current_pos.X = current_pos.X + (Control.MousePosition.X - mouse_pos.X);
current_pos.Y = current_pos.Y + (Control.MousePosition.Y - mouse_pos.Y);
this .Location = current_pos;
mouse_pos = Control.MousePosition;
this.Refresh();
}
dans le mouseMove ca fait pareil qu'avec toutes les solutions que vous m'avez donné.
C'est sur, ca m'a permis de mettre un pas dans l'override et ça je vous en remercie encore.
Désolé que vous vous soyez autant pris la tete pour m'aider et en arrivé là ...
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 14 mars 2006 à 17:01
Franchement, je reste bleuffé par vos capacités ...
Ton code marche nikel, je ne sais pas comment vous faites pour trouver tout ca.
Par contre, sur les machines où coabitent le .NET 1.1 et 2.0, ca fonctionne super bien.
Mais sur les machines où il n'y a que le .NET 1.1, à chaque fois qu'on touche le bord, on revient à l'endroit initial, pas pratique.
Ca semble être vraiment galère de réaliser ça, je pense que je vais abandonner l'idée de bloquer sur les bord.
En tout cas, heureusement que vous etes là car sinon on n'avancerai pas.
Merci encore, et à bientot pour encore une question sogreunu :)
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 20 mars 2006 à 08:51
Merci pour ce dernier code,
j'ai modifier un peu pour le passer en .NET1.1 et ca fonctionne également.
J'ai commenté quelques ligne qui ne sont pas prises en .NET 1.1 et rajouté des choses.
Je vais donc pouvoir me repencher dessus pour faire un truc bien pour mon application, merci encore.
f.colo
using System.Collections;
//Application.SetCompatibleTextRenderingDefault(false);
/*protected override void Dispose(bool disposing)
{
if (disposing) {
if (components != null) {
components.Dispose();
}
}
base.Dispose(disposing);
}*/