Como colocar una imagen de fondo en un Form de C#?

Iniciado por tonder, 28 Junio 2011, 01:37 AM

0 Miembros y 1 Visitante están viendo este tema.

tonder

Hola gente otra vez, como mencione en un post anterior hacia mucho que no posteaba nada por aca, y la ver tambien hacia mucho no programaba, pues ahora veo que estoy fura de ritmo,  :D veran, quiero pornerle una imagen de fondo a un form pero no quiero usar la propiedad BackgroundImage, porque la intencion es que el usuario despues tenga la posibilidad de cambiar la imagen de fondo. Yo use este codigo para cargar la imagen según yo deberia funcionar, pero no:
Código (csharp) [Seleccionar]

#endregion
private System.Drawing.Bitmap formbackground;
private System.Drawing.Graphics gr;

//
//Imagen de fondo del Formulario
//
this.formbackground = new System.Drawing.Bitmap(@"F:\Visual Studio Projects\pry\Images_pry\aqua-blue.JPG");// aqui se carga direccion donde esta la imagen
this.gr = this.CreateGraphics(); // aqui se crea
this.gr.DrawImage(formbackground, 1, 1, this.Width, this.Height);// y se supone que ya aqui por decerlo así, aqui la dibuja.


Pero como ya dije esto no me funcion.
Ustedes que opinan?, Que le estará haciendo falta a este codigo para que sirva?
bueno, gracias como siempre espero que resuelto el asunto esto le sirva a todos. has luego!

Por cierto este codigo lo cargue en el metodo InitializeComponent()

jacj0102

hola ante todo un cordial saludo.
Respondiendo a tu pregunta no te hagas tantas lunas puedes hacerlo con un Button y con un OpenFileDialog, al momento de hacerle click te habra el OpenFileDialog y selecciones la imagen q deseas poner de fondo a tu formulario, basta de palabras y ahi te mando el codigo espero te ayude en tu problema:

Código (csharp) [Seleccionar]
private void button1_Click(object sender, EventArgs e)
        {
            string opcion;
            openFileDialog1.Filter = "Bitmap files (*.bmp)|*.bmp|Gif files (*.gif)|*.gif|JGP files (*.jpg)|*.jpg|All (*.*)|*.* |PNG (*.png)|*.png ";
            openFileDialog1.FilterIndex = 3;
            openFileDialog1.FileName = "Seleccione una imagen";
            openFileDialog1.Title = "Escoja una imagen";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                opcion = openFileDialog1.FileName;
                BackgroundImage = Image.FromFile(opcion);
                BackgroundImageLayout = ImageLayout.Stretch;
            }
        }


Espero te ayude en algo, me avisas cualquier problema q tengas con el codigo.
"La Raiz del Estudio es Amargo, Pero el Fruto es Dulce"
"Corrige al sabio y se hara mas sabio, corrige al necio y te lo echara de enemigo"

tonder

Buenas tengas todos los amigos de foro y para el colega jacj0102 en especial esta vez, veran, la sugerencia de jacj0102 surtio el efecto que esperaba en un 90% degamosle así, lo unico que tube que agregar a ese codigo fue la instruccion this.refresh();, para que refrescara el form y se pudiera ver la imagen en el fondo, ahora bien porque en un 90%, bueno, la idea con este asunto de poner una imagen de fondo al form, era también, que fuera permanente, o por lo menos hasta que el usuario quisiera cambiarla, porque al cerrar el form(la aplicasion, o programita), la imagen seleccionada se pieder y hay que volverla a elegir, y esa no es la idea, que el usuario cada ves que habra el form reelija la imagen, pues si tiene que hacerlo cada vez que lo abra, poco tiempo despues se casará y no querra volver a usar esta propiedad.

Les vuelvo a dejar la inquietud, que ajuste piensan que se le podría hacer al codigo propuesto por el compañero jacj0102 para que la proxima vez que el usuario abra el programita el usuario siga viendo como imagen de fondo del form la imagen que habia elegido antes de cerrar la aplicación? Saludos a todo y mucha gracias a todos.

Espero nos podamos seguir veneficiado mutuamente entre todos.

tonder

Para todos aqui esta la solucion final, lo que hay que hacer seria que en un archivo uno guarde la variable string donde queda la direccion o ruta de la imagen osea en el codigo que expuso el compañero jacj0102 tienen que manda a escribir en un archivo el contenido de la variable string opcion,  y cuando uno habra el programa mandar a leer ese archivo.

Bueno gracias a todos, y espero les sirva a otros tambien, que la pasen bien.

Beakman

#4
Buenas, te dejo otra solución.
Si te entendí bien, esta me parece una solución un poco más rápida.

Primero: click derecho en el proyecto -> propiedades -> recursos -> agregar recurso -> nueva imagen -> formato.
Segundo: en el evento que quieras, por ejemplo el click de un botón ponés esto:

this.BackgroundImage = WindowsFormsApplication1.Properties.Resources.nombre_imagen;

Y listo. Entonces, cargas las imágenes que necesites como recursos y las agregas cuando quieras.

EDITO:
Se me pasó de largo la solución de jacj0102.
Ahora te entendí bien, el usuario decide la imagen que se carga.
Disculpa entonces, lo entendí mal.
Saludos.

43H4FH44H45H4CH49H56H45H

Otra forma de hacerlo seria guardar las imagenes en un BD y recuperarlas con una vista previa para que el usuario escoja la que mas le guste, asi no seria necesario validar la ruta del archivo en caso de que se perdiera alguna imagen relacionada.

Ejemplo:

Descarga proyecto http://www.4shared.com/file/OgxIrh9P/ImagenFondo.html

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;

namespace ImagenFondo
{
    public partial class Form1 : Form
    {
        static string sPath = System.Windows.Forms.Application.StartupPath;
        string sConect = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + sPath + "\\fondos.accdb;Persist Security Info=False";
       
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Image Files|*.jpg";
            openFileDialog1.Title = "Select image";
            openFileDialog1.FileName = "Archivo imagen";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                bSave(openFileDialog1.FileName);               
            }           
        }
        private void button2_Click(object sender, EventArgs e)
        {
            bSet(comboBox1.SelectedItem.ToString());           
        }
        private void bSave(string sFilename)
        {           
            FileInfo fInfo = new FileInfo(sFilename);
            FileStream fs = new FileStream(sFilename, FileMode.Open);
            Byte[] data = new byte[fs.Length];
            fs.Read(data, 0, Convert.ToInt32(fs.Length));
            fs.Close();
            using (OleDbConnection connection = new OleDbConnection(sConect))
            {
                connection.Open();
                OleDbCommand cmd = new OleDbCommand("INSERT INTO fondo (Nombre,Imagen) VALUES ('" + fInfo.Name + "', @Imagen)", connection);
                cmd.Parameters.AddWithValue("@Imagen", data);
                cmd.ExecuteNonQuery();
                connection.Close();
                bCount();
                MessageBox.Show("El archivo " + fInfo.Name + " se guardo correctamente", "Fondos guardados", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void bCount()
        {
           
            using (OleDbConnection connection = new OleDbConnection(sConect))
            {
                comboBox1.Items.Clear();
                connection.Open();
                OleDbCommand cmd = new OleDbCommand("SELECT COUNT (*) FROM fondo" , connection);
                int count = (int)cmd.ExecuteScalar();
                for (int i = 1; i <= count; i++)
                {
                    comboBox1.Items.Add(i.ToString());
                }
                comboBox1.Text = "Previsualizar un fondo";
                connection.Close();
            }
        }
        private void bPreview(string Id)
        {
            using (OleDbConnection connection = new OleDbConnection(sConect))
            {
                connection.Open();
                OleDbCommand cmd = new OleDbCommand("SELECT Imagen FROM fondo WHERE Id = " + Id, connection);
                byte[] imgData = (byte[])cmd.ExecuteScalar();
                MemoryStream mem = new MemoryStream(imgData);
                pictureBox1.Image = Image.FromStream(mem);
                connection.Close();
            }
        } 
        private void bSet(string Id)
        {
            using (OleDbConnection connection = new OleDbConnection(sConect))
            {
                connection.Open();
                OleDbCommand cmd = new OleDbCommand("SELECT Imagen FROM fondo WHERE Id = "+ Id, connection);
                byte[] imgData = (byte[])cmd.ExecuteScalar();
                MemoryStream mem = new MemoryStream(imgData);
                this.BackgroundImage = Image.FromStream(mem);
                connection.Close();
                pictureBox1.Visible = false;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            bCount();
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            bPreview(comboBox1.SelectedItem.ToString());
            button2.Enabled = true;
            pictureBox1.Visible = true;
        }       
    }
}


Es solo un ejemplo, faltan validar y mejorar varias cosas, pero funciona para mostrar lo que menciono.
Saluos.

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W