Scrollbars, fenetre fille

MickParadiseLost
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008
- 7 juil. 2005 à 11:46
 cs_Bidou - 8 juil. 2005 à 18:17
Bonjour.

Je n'arrive toujours pas a mettre des scrollbars lorsque l'image qui
s'affiche dans la fenetre est plus grande que cette fenetre.

J'ai écrit ceci pour résoudre le probleme mais l'erreur qui apparait me dit que je ne peux pas utiliser ça: >



Voila mon code:

if(bmp.Size > this.ClientSize) this.AutoScroll = true;



Comment dois je faire svp ?

25 réponses

Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
7 juil. 2005 à 12:28
Non tu ne peux pas parce que la structure Size ne redéfinie pas l'opérateur ">" mais ca marche avec les proprietés Width et Height de Size, ou utiliser l'opérateur de soustaction qui lui est défini pour tester une valeur positive ou négative..
0
MickParadiseLost
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

7 juil. 2005 à 12:46
Lorsque j'ecrit ceci, les scrollbars devraient apparaitrent quand le
Height du bmp est plus grand que celui du clientsize non ? Parsque moi,
rien ne se passe.

if(bmp.Height - ClientSize.Height <gras>0) this.AutoScroll true;</gras>

Pourquoi ?
0
aogie
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

7 juil. 2005 à 13:50
En lisant ta ligne, je pense que if (bmp.Height > ClientSize.Height) AutoScroll = true; serait plus judicieux.

A tester.

-- AOGie --
0
MickParadiseLost
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

7 juil. 2005 à 14:12
Non ça marche toujours pas. Je pense que le probleme viens donc dailleurs.

Le code qui suit est celui de Form2. (formulaire qui s'ouvre dans le formulaire principal en MDI).

Il doit y'avoir un truc qui empeche dans ce code l'autoscrollbar.

Si vous trouvez dites le moi svp.



//form2

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.IO;



namespace Blasphemy_v2._0

{

/// <summary>

/// Description résumée de Form2.

/// </summary>

public class Form2 : System.Windows.Forms.Form



{

/// <summary>

/// Variable nécessaire au concepteur.

/// </summary>

private System.ComponentModel.Container components = null;

private Bitmap bmp;

public Form2(string FileName)



{

// Requis pour la prise en charge du Concepteur Windows Forms

{


bmp = new Bitmap(FileName);

WindowState =
FormWindowState.Normal;



ClientSize =
bmp.Size;




}

}



/// <summary>

/// Nettoyage des ressources utilisées.

/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}



private void InitializeComponent()

{

//

// Form2

//

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

this.AutoScroll = true;

this.BackColor = System.Drawing.SystemColors.ActiveCaptionText;

this.ClientSize = new System.Drawing.Size(290, 264);

this.ForeColor = System.Drawing.SystemColors.AppWorkspace;

this.MinimumSize = new System.Drawing.Size(20, 20);

this.Name = "Form2";



}



float coef=1;



protected override void OnPaint(PaintEventArgs e)

{

// Récuperation de l'objet Graphic du control

Graphics g = e.Graphics;



// Dessin de
l'image bmp via l'objet Graphics aux coord 0;0 et
redimensionnement




float w = bmp.Width * coef;

float h = bmp.Height * coef;

float x = ( this.ClientSize.Width - w ) / 2;

float y = ( this.ClientSize.Height - h ) / 2;



g.DrawImage( bmp,x, y, w, h );



this.SetStyle(
ControlStyles.ResizeRedraw | ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true );

if (bmp.Height > ClientSize.Height) AutoScroll = true;



}



#region Code généré par le Concepteur Windows Form

/// <summary>

/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas

/// le contenu de cette méthode avec l'éditeur de code.

/// </summary>



#endregion



}

}



Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
aogie
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

7 juil. 2005 à 14:30
OK. AutoScroll n'est utilisé que pour un contrôle enfant ne pouvant
être affiché entièrement dans son container. Comme tu peins toi-même
l'image...

Pour l'utiliser, tu dois placer un PictureBox de la taille de l'image
qu'il contient. Celui-ci étant enfant de la Form : S'il ne rentre pas,
la VScrollBar apparaîtra.

-- AOGie --
0
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
7 juil. 2005 à 14:35
Eh y'a une grosse erreur, SetStyle ne s'appele pas dans OnPaint mais dans le constructeur !
0
MickParadiseLost
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

7 juil. 2005 à 14:53
Je fais comment pour mettre l'image dans une picture box ?

Eh euh question que j'ai un peu honte de poser: il est ou le constructeur ???
0
aogie
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

7 juil. 2005 à 15:00
Dans public Form2(...) : ajoute SetStyle avant bmp = new Bitmap(FileName);

De plus l'appel InitializeComponent () a disparu de ton constructeur (sous // Requis pour la prise en charge du Concepteur Windows Forms) !

Dans ton constructeur, tu as également un bloc d'accolades qui ne sert à rien.



Concernant ton PictureBox nommé pic_Image par exemple : pic_Image.Image = <ton image>.

-- AOGie --
0
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
7 juil. 2005 à 15:03
Bon, on va faire comme si on avait rien entendu ; ) Le constructeur c'est la méthode qui porte le même nom que ta classe, c'est la méthode qui initialise ton objet. ( PS : Un coef de 1 ca ne sert à rien. )
0
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
7 juil. 2005 à 15:05
Bon bha c'est pas gagné : )
0
MickParadiseLost
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

7 juil. 2005 à 16:25
J'ai essayé ça: pic_Image.Image = <ton image>



Mais avec le ClientSize=bmp.Size;

ça marche pas.

Car l'image prend la forme du ClientSize mais rentre donc pas dans la pictureBox.

Les deux lignes sont donc incompatible.

Comment faire svp
0
aogie
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

7 juil. 2005 à 16:51
La zone cliente contient le PictureBox donc ClientSize = pic_Image.Size;

-- AOGie --
0
MickParadiseLost
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

7 juil. 2005 à 17:16
// Requis pour la prise en charge du Concepteur Windows Forms

{

this.SetStyle(
ControlStyles.ResizeRedraw | ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true
);

bmp = new Bitmap(FileName);

WindowState =
FormWindowState.Normal;



ClientSize = bmp.Size;

ClientSize = pic_Image.Size;



}



J'ai modifié mon code en ajoutant le truc en rose mais ça marche toujours pas.

Il y'aurait pas des trucs a modifier dans les propriétés de la pictureBox ?
0
aogie
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

7 juil. 2005 à 17:36
Avant d'aller plus loin. Quel est le but exact de ta Form car tu veux
qu'elle ait une scrollBar automatique mais en même temps tu fais tout
pour que la zone cliente ait la même taille que l'image ?

Il faut choisir : Soit tu taille la Form à la taille de l'image, soit
tu décides de ne pas retailler la Form et tu joues sur l'AutoScroll
pour que l'utilisateur puisse visionner toute l'image...

-- AOGie --
0
aogie
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

7 juil. 2005 à 17:47
Je viens de faire ton projet pour le deuxième cas :

Tu crées une Form dans laquelle tu places un PictureBox (calé en haut à gauche et en AutoSize).

Ensuite dans ton constructeur :

pic_Image.Image = Image.FromFile(FileName);

//ton PictureBox prend la taille de l'image mais pas la Form

AutoScroll = true;

AutoScrollMinSize = pic_Image.Size; //ou pic_Image.Image.Size c'est pareil car AutoSize



et c'est tout -> pas de surcharge de l'événement OnPaint() !!

-- AOGie --
0
MickParadiseLost
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

8 juil. 2005 à 00:06
Ok merci beaucoup.



Je voudrais en fait que l'image s'ouvre dans une form. Cette form prend
la forme de l'image sauf si l'image est plus grande que la moitier de
ce qu'on peut visualiser sur un écran. (je sais pas comment faire ceci
mais je poserai la question plus tard car une chose a la fois c'est
deja pas mal ). Bon, dans le cas ou
l'image est plus grande, le clientsize se redimentionne et se retrouve
donc plus petit que l'image. Et la interviennent les scrollbars.

Voila l'idée en gros
0
MickParadiseLost
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

8 juil. 2005 à 00:30
public Form2(string FileName)



{

// Requis pour la prise en charge du Concepteur Windows Forms

{


/this.SetStyle( ControlStyles.ResizeRedraw | ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true
);



pic_Image.Image = Image.FromFile(FileName);

AutoScroll = true;


AutoScrollMinSize = pic_Image.Size;


}

}



L'erreur ci dessous apparait et il me souligne en jaune la ligne écrite en bleu ci dessus :

Une exception non gérée du type 'System.NullReferenceException' s'est produite dans Blasphemy v2.0.exe



Informations supplémentaires : La référence d'objet n'est pas définie à une instance d'un objet.



Pourquoiiiiiiiiiiiiiiii ???
0
aogie
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

8 juil. 2005 à 09:03
Pour savoir si l'image est plus grande que la moitié de l'écran, tu vas
devoir effectuer une comparaison avec Screen.PrimaryScreen.WorkingArea.

Concernant l'erreur, je ne vois pas l'appel à InitializeComponent() dans ton constructeur !

C'est lui qui se charge d'instancier ton contrôle pic_Image, il est donc égal à null...

Et tu n'as toujours pas enlever ce bloc d'accolades qui ne sert à rien.

-- AOGie --
0
MickParadiseLost
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

8 juil. 2005 à 10:14
//form2

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.IO;



namespace Blasphemy_v2._0

{

/// <summary>

/// Description résumée de Form2.

/// </summary>

public class Form2 : System.Windows.Forms.Form



{

/// <summary>

/// Variable nécessaire au concepteur.

/// </summary>

private System.ComponentModel.Container components = null;

private System.Windows.Forms.PictureBox pic_Image;

private Bitmap bmp;

public Form2(string FileName)



{

// Requis pour la prise en charge du Concepteur Windows Forms

{

this.SetStyle(
ControlStyles.ResizeRedraw | ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true
);




pic_Image.Image = Image.FromFile(FileName);


AutoScroll = true;


AutoScrollMinSize = pic_Image.Size;


}

}



/// <summary>

/// Nettoyage des ressources utilisées.

/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}



private void InitializeComponent()

{

this.pic_Image = new System.Windows.Forms.PictureBox();

this.SuspendLayout();

//

// pic_Image

//

this.pic_Image.Location = new System.Drawing.Point(0, 0);

this.pic_Image.Name = "pic_Image";


this.pic_Image.SizeMode =
System.Windows.Forms.PictureBoxSizeMode.AutoSize;

this.pic_Image.TabIndex = 2;

this.pic_Image.TabStop = false;

//

// Form2

//

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

this.AutoScroll = true;

this.BackColor = System.Drawing.SystemColors.ActiveCaptionText;

this.ClientSize = new System.Drawing.Size(376, 302);

this.Controls.Add(this.pic_Image);

this.ForeColor = System.Drawing.SystemColors.AppWorkspace;

this.MinimumSize = new System.Drawing.Size(20, 20);

this.Name = "Form2";

this.ResumeLayout(false);



}





float coef=1;





protected override void OnPaint(PaintEventArgs e)

{

// Récuperation de l'objet Graphic du control

Graphics g = e.Graphics;



// Dessin de l'image bmp via l'objet Graphics aux coord 0;0 et redimensionnement



float w = bmp.Width * coef; //largeur

float h = bmp.Height * coef;

float x = ( this.ClientSize.Width - w ) / 2;

float y = ( this.ClientSize.Height - h ) / 2;



g.DrawImage( bmp,x, y, w, h );





}



#region Code généré par le Concepteur Windows Form

/// <summary>

/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas

/// le contenu de cette méthode avec l'éditeur de code.

/// </summary>



#endregion



}

}





-----------------------------------------------------------------------

Désolé, j'ai trop de mal .

Il est ou le bloc d'acolade qui sert a rien?

Pourquoi je n'ai pas d'initialise components (le truc ecrit en rose, ce n'est pas ça?) ?

Help me please
0
aogie
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

8 juil. 2005 à 10:56
L'implémentation d'InitializeComponent est présente mais tu ne l'appelles pas !!!

Remplace :

public Form2(string FileName)

{
// Requis pour la prise en charge du Concepteur Windows Forms
{

this.SetStyle( ControlStyles.ResizeRedraw |
ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffer, true );



pic_Image.Image = Image.FromFile(FileName);

AutoScroll = true;


AutoScrollMinSize = pic_Image.Size;

}
}



par



public Form2(string FileName)
{
// Requis pour la prise en charge du Concepteur Windows Forms
InitializeComponent();



this.SetStyle( ControlStyles.ResizeRedraw |
ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffer, true );



pic_Image.Image = Image.FromFile(FileName);

AutoScroll = true;


AutoScrollMinSize = pic_Image.Size;

}


-- AOGie --
0