Scrollbars, fenetre fille

Signaler
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008
-
 cs_Bidou -
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

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
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..
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

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 ?
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

En lisant ta ligne, je pense que if (bmp.Height > ClientSize.Height) AutoScroll = true; serait plus judicieux.

A tester.

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

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
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

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 --
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Eh y'a une grosse erreur, SetStyle ne s'appele pas dans OnPaint mais dans le constructeur !
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

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 ???
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

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 --
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
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. )
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Bon bha c'est pas gagné : )
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

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
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

La zone cliente contient le PictureBox donc ClientSize = pic_Image.Size;

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

// 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 ?
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

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 --
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

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 --
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

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
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

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 ???
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

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 --
Messages postés
86
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
2 avril 2008

//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
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

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