Exportar (0) Imprimir
Expandir todo

ApplicationContext (Clase)

Especifica información contextual sobre un subproceso de aplicación.

Espacio de nombres: System.Windows.Forms
Ensamblado: System.Windows.Forms (en system.windows.forms.dll)

public class ApplicationContext : IDisposable
public class ApplicationContext implements IDisposable
public class ApplicationContext implements IDisposable
No aplicable.

Es posible utilizar la clase ApplicationContext para volver a definir las circunstancias que hacen que exista un bucle de mensajes. De manera predeterminada, ApplicationContext escucha al evento Closed en la clase Form principal de la aplicación y después abandona el bucle de mensajes del subproceso.

En el ejemplo de código siguiente se muestran dos formularios, y se sale de la aplicación cuando se cierran los dos formularios. Cuando se inicia la aplicación y se sale de ésta, se recuerda la posición de cada formulario. En este ejemplo se muestra cómo se utiliza un control ApplicationContext junto con el método Application.Run(context) para mostrar varios formularios cuando se inicia la aplicación.

La clase MyApplicationContext se hereda de ApplicationContext, efectúa el seguimiento cuando se cierra cada formulario y sale del subproceso actual cuando se cierran los dos. La clase almacena las posiciones de cada formulario para el usuario. Los datos de la posición del formulario se almacenan en un archivo titulado Appdata.txt, que se crea en la ubicación determinada por la propiedad UserAppDataPath.

El método Main llama a Application.Run(context) para iniciar la aplicación, una vez que se proporciona el control ApplicationContext.

using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Text;
using System.IO;

namespace MyApplication
{
    // A simple form that represents a window in our application
    public class AppForm2 : System.Windows.Forms.Form {
        public AppForm2(){ 
            this.Size = new System.Drawing.Size(300,300);
            this.Text = "AppForm2";
        }
    }

    // A simple form that represents a window in our application
    public class AppForm1 : System.Windows.Forms.Form {
        public AppForm1(){ 
            this.Size = new System.Drawing.Size(300,300);
            this.Text = "AppForm1";
        }
    }

    // The class that handles the creation of the application windows
    class MyApplicationContext : ApplicationContext {
    
        private int formCount;
        private AppForm1 form1;
        private AppForm2 form2;

        private Rectangle form1Position;
        private Rectangle form2Position;

        private FileStream userData;

        private MyApplicationContext() {
            formCount = 0;

            // Handle the ApplicationExit event to know when the application is exiting.
            Application.ApplicationExit += new EventHandler(this.OnApplicationExit);

            try {
                // Create a file that the application will store user specific data in.
                userData = new FileStream(Application.UserAppDataPath + "\\appdata.txt", FileMode.OpenOrCreate);

            } catch(IOException e) {
                // Inform the user that an error occurred.
                MessageBox.Show("An error occurred while attempting to show the application." + 
                                "The error is:" + e.ToString());

                // Exit the current thread instead of showing the windows.
                ExitThread();
            }

            // Create both application forms and handle the Closed event
            // to know when both forms are closed.
            form1 = new AppForm1();
            form1.Closed += new EventHandler(OnFormClosed);            
            form1.Closing += new CancelEventHandler(OnFormClosing);            
            formCount++;

            form2 = new AppForm2();
            form2.Closed += new EventHandler(OnFormClosed);            
            form2.Closing += new CancelEventHandler(OnFormClosing);            
            formCount++;

            // Get the form positions based upon the user specific data.
            if (ReadFormDataFromFile()) {
                // If the data was read from the file, set the form
                // positions manually.
                form1.StartPosition = FormStartPosition.Manual;
                form2.StartPosition = FormStartPosition.Manual;
                
                form1.Bounds = form1Position;
                form2.Bounds = form2Position;
            }

            // Show both forms.
            form1.Show();
            form2.Show();
        }

        private void OnApplicationExit(object sender, EventArgs e) {
            // When the application is exiting, write the application data to the
            // user file and close it.
            WriteFormDataToFile();

            try {
                // Ignore any errors that might occur while closing the file handle.
                userData.Close();
            } catch {}
        }

        private void OnFormClosing(object sender, CancelEventArgs e) {
            // When a form is closing, remember the form position so it
            // can be saved in the user data file.
            if (sender is AppForm1) 
                form1Position = ((Form)sender).Bounds;
            else if (sender is AppForm2)
                form2Position = ((Form)sender).Bounds;
        }

        private void OnFormClosed(object sender, EventArgs e) {
            // When a form is closed, decrement the count of open forms.

            // When the count gets to 0, exit the app by calling
            // ExitThread().
            formCount--;
            if (formCount == 0) {
                ExitThread();
            }
        }

        private bool WriteFormDataToFile(){
            // Write the form positions to the file.
            UTF8Encoding encoding = new UTF8Encoding();

            RectangleConverter rectConv = new RectangleConverter();
            String form1pos = rectConv.ConvertToString(form1Position);
            String form2pos = rectConv.ConvertToString(form2Position);

            byte[] dataToWrite = encoding.GetBytes("~" + form1pos + "~" + form2pos);

            try {
                // Set the write position to the start of the file and write
                userData.Seek(0,SeekOrigin.Begin);
                userData.Write(dataToWrite, 0, dataToWrite.Length);
                userData.Flush();

                userData.SetLength(dataToWrite.Length);
                return true;

            } catch {
                // An error occurred while attempting to write, return false.
                return false;
            }

        }

        private bool ReadFormDataFromFile(){
            // Read the form positions from the file.
            UTF8Encoding encoding = new UTF8Encoding();
            String data;

            if (userData.Length != 0) {
                byte[] dataToRead = new Byte[userData.Length];

                try {
                    // Set the read position to the start of the file and read.
                    userData.Seek(0, SeekOrigin.Begin);
                    userData.Read(dataToRead, 0, dataToRead.Length);

                } catch (IOException e) {
                    String errorInfo = e.ToString();
                    // An error occurred while attempt to read, return false.
                    return false;
                }

                // Parse out the data to get the window rectangles
                data = encoding.GetString(dataToRead);

                try {
                    // Convert the string data to rectangles
                    RectangleConverter rectConv = new RectangleConverter();
                    String form1pos = data.Substring(1,data.IndexOf("~",1)-1);

                    form1Position = (Rectangle)rectConv.ConvertFromString(form1pos);

                    String form2pos = data.Substring(data.IndexOf("~",1)+1);
                    form2Position = (Rectangle)rectConv.ConvertFromString(form2pos);

                    return true;

                } catch {
                    // Error occurred while attempting to convert the rectangle data.
                    // Return false to use default values.
                    return false;
                }

            } else {
                // No data in the file, return false to use default values.
                return false;
            }
        }        
        
        [STAThread]
        static void Main(string[] args) {
            
            // Create the MyApplicationContext, that derives from ApplicationContext,
            // that manages when the application should exit.

            MyApplicationContext context = new MyApplicationContext();

            // Run the application with the specific context. It will exit when
            // all forms are closed.
            Application.Run(context);

        }
    }
}


package MyApplication; 

import System.*;
import System.Drawing.*;
import System.Windows.Forms.*;
import System.ComponentModel.*;
import System.Text.*;
import System.IO.*;
   
// A simple form that represents a window in our application
public class AppForm2 extends System.Windows.Forms.Form
{
    public AppForm2()
    {
        this.set_Size(new System.Drawing.Size(300, 300));
        this.set_Text("AppForm2");
    } //AppForm2
} //AppForm2
   
// A simple form that represents a window in our application
public class AppForm1 extends System.Windows.Forms.Form
{
    public AppForm1()
    {
        this.set_Size(new System.Drawing.Size(300, 300));
        this.set_Text("AppForm1");
    } //AppForm1
} //AppForm1
   
// The class that handles the creation of the application windows
class MyApplicationContext extends ApplicationContext
{
    private int formCount;
    private AppForm1 form1;
    private AppForm2 form2;
    private Rectangle form1Position;
    private Rectangle form2Position;
    private FileStream userData;

    private MyApplicationContext()
    {
        formCount = 0;

        // Handle the ApplicationExit event to know 
        // when the application is exiting.
        Application.add_ApplicationExit(new EventHandler(
            this.OnApplicationExit));
        try {
            // Create a file that the application will store 
            // user specific data in.
            userData = new FileStream(Application.get_UserAppDataPath() 
                + "\\appdata.txt", FileMode.OpenOrCreate);
        }
        catch (IOException e) {
            // Inform the user that an error occurred.
            MessageBox.Show("An error occurred while attempting to show the "
                + " application. The error is:" + e.ToString());

            // Exit the current thread instead of showing the windows.
            ExitThread();
        }

        // Create both application forms and handle the Closed event
        // to know when both forms are closed.
        form1 = new AppForm1();
        form1.add_Closed(new EventHandler(OnFormClosed));
        form1.add_Closing(new CancelEventHandler(OnFormClosing));
        formCount++;
        form2 = new AppForm2();
        form2.add_Closed(new EventHandler(OnFormClosed));
        form2.add_Closing(new CancelEventHandler(OnFormClosing));
        formCount++;

        // Get the form positions based upon the user specific data.
        if (ReadFormDataFromFile()) {
            // If the data was read from the file, set the form
            // positions manually.
            form1.set_StartPosition(FormStartPosition.Manual);
            form2.set_StartPosition(FormStartPosition.Manual);
            form1.set_Bounds(form1Position);
            form2.set_Bounds(form2Position);
        }

        // Show both forms.
        form1.Show();
        form2.Show();
    } //MyApplicationContext

    private void OnApplicationExit(Object sender, EventArgs e)
    {
        // When the application is exiting, write the application data to the
        // user file and close it.
        WriteFormDataToFile();
        try {
            // Ignore any errors that might occur while closing the file handle.
            userData.Close();
        }
        catch (System.Exception exp) {
        }
    } //OnApplicationExit

    private void OnFormClosing(Object sender, CancelEventArgs e)
    {
        // When a form is closing, remember the form position so it
        // can be saved in the user data file.
        if (sender instanceof AppForm1) {
            form1Position = ((Form)sender).get_Bounds();
        }
        else {
            if (sender instanceof AppForm2) {
                form2Position = ((Form)sender).get_Bounds();
            }
        }
    } //OnFormClosing

    private void OnFormClosed(Object sender, EventArgs e)
    {
        // When a form is closed, decrement the count of open forms.
        // When the count gets to 0, exit the app by calling
        // ExitThread().
        formCount--;
        if (formCount == 0) {
            ExitThread();
        }
    } //OnFormClosed

    private boolean WriteFormDataToFile()
    {
        // Write the form positions to the file.
        UTF8Encoding encoding = new UTF8Encoding();
        RectangleConverter rectConv = new RectangleConverter();
        String form1Pos = rectConv.ConvertToString(form1Position);
        String form2Pos = rectConv.ConvertToString(form2Position);
        ubyte dataToWrite[] = encoding.GetBytes("~" + form1Pos + "~" 
            + form2Pos);

        try {
            // Set the write position to the start of the file and write
            userData.Seek(0, SeekOrigin.Begin);
            userData.Write(dataToWrite, 0, dataToWrite.length);
            userData.Flush();
            userData.SetLength(dataToWrite.length);
            return true;
        }
        catch (System.Exception exp) {
            // An error occurred while attempting to write, return false.
            return false;
        }
    } //WriteFormDataToFile

    private boolean ReadFormDataFromFile()
    {
        // Read the form positions from the file.
        UTF8Encoding encoding = new UTF8Encoding();
        String data;

        if (userData.get_Length() != 0) {
            ubyte dataToRead[] = new ubyte[(int)userData.get_Length()];

            try {
                // Set the read position to the start of the file and read.
                userData.Seek(0, SeekOrigin.Begin);
                userData.Read(dataToRead, 0, dataToRead.length);
            }
            catch (IOException e) {
                String errorInfo = e.ToString();

                // An error occurred while attempt to read, return false.
                return false;
            }

            // Parse out the data to get the window rectangles
            data = encoding.GetString(dataToRead);
            try {
                // Convert the string data to rectangles
                RectangleConverter rectConv = new RectangleConverter();
                String form1Pos = data.Substring(1, data.IndexOf("~", 1) - 1);
                form1Position = 
                    (Rectangle)(rectConv.ConvertFromString(form1Pos));

                String form2Pos = data.Substring(data.IndexOf("~", 1) + 1);
                form2Position = 
                    (Rectangle)(rectConv.ConvertFromString(form2Pos));
                return true;
            }
            catch (System.Exception exp) {
                // Error occurred while attempting to convert the rectangle data.
                // Return false to use default values.
                return false;
            }
        }
        else {
            // No data in the file, return false to use default values.
            return false;
        }
    } //ReadFormDataFromFile

    /** @attribute STAThread()
     */
    public static void main(String[] args)
    {
        // Create the MyApplicationContext, that derives from
        // ApplicationContext, that manages when the application should exit.
        MyApplicationContext context = new MyApplicationContext();

        // Run the application with the specific context. It will exit when
        // all forms are closed.
        Application.Run(context);
    } //main 
} //MyApplicationContext

System.Object
  System.Windows.Forms.ApplicationContext

Los miembros estáticos públicos (Shared en Visual Basic) de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Windows 98, Windows 2000 Service Pack 4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter

Microsoft .NET Framework 3.0 es compatible con Windows Vista, Microsoft Windows XP SP2 y Windows Server 2003 SP1.

.NET Framework

Compatible con: 3.0, 2.0, 1.1, 1.0
Mostrar:
© 2014 Microsoft