views:

134

answers:

1

In C# I am having a problem with the splash screen. When it is time to close and the main Form1 appears, it moves over to the upper right corner of Form1. It then disappears. I have never had this occur before and have just about run out of ideas to fix it. I want the splash screen to disappear in the center screen and not move over to the upper corner of the opening Form1. Here is the code:

    public Form1()
    {
        Splash mySplash = new Splash();
        mySplash.TotalValue = 7; //or however many steps you must complete
        mySplash.Show();
        mySplash.Update();

        InitializeComponent();

        //--<begin>--------------
        this.Hide();
        this.WindowState = FormWindowState.Normal;

        mySplash.Progress++;

        printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
        printBOM.PrintPage += new PrintPageEventHandler(printBOM_PrintPage);
        printList.PrintPage += new PrintPageEventHandler(printList_PrintPage);

        mySplash.Progress++;

        // using old Kodak Imaging OCX !
        axImgEdit1.Image = "\\\\Netstore\\eng_share\\EView\\BOB-eView9.tif";
        axImgEdit1.DisplayScaleAlgorithm = ImgeditLibCtl.DisplayScaleConstants.wiScaleOptimize;
        axImgEdit1.FitTo(0);
        axImgEdit1.Display();

        mySplash.Progress++;

        //~~~~~~~~~~~~~~~~~~~~Getting printer info~~~~~~~~~~~~~~~~~~~~~~~~~
        List<Win32_Printer> printerList = Win32_Printer.GetList();

        int i = 0;
        foreach (Win32_Printer printer in printerList)
        {
            prnName = printer.Name;
            prnPort = printer.PortName;
            prnDriver = printer.DriverName;

            if (i == 0)
            {
                prnNameString = prnName;
                prnDriverString = prnDriver;
                prnPortString = prnPort;
            }
            else
            {
                prnNameString += "," + prnName;
                prnDriverString += "," + prnDriver;
                prnPortString += "," + prnPort;
            }
            i++;
        }

        mySplash.Progress++;


        EViewMethods.defaultPrn[0] = Settings.Default.DefaultPrinter; //defaultPrn[] is string array holding the default printer name, driver and port
        EViewMethods.defaultPrn[1] = Settings.Default.DefaultPrinterDriver;
        EViewMethods.defaultPrn[2] = Settings.Default.DefaultPrinterPort;

        //making this printer the system default printer
        object printerName = Settings.Default.DefaultPrinter;
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer");
        ManagementObjectCollection collection = searcher.Get();

        foreach (ManagementObject currentObject in collection)
        {
            if (currentObject["name"].ToString() == printerName.ToString())
            {
                currentObject.InvokeMethod("SetDefaultPrinter", new object[] { printerName });
            }
        }

        mySplash.Progress++;

        EViewMethods.reCenterEVafterDwgClose = Settings.Default.ReCenterEVafterDwgClose;
        if (Settings.Default.ReCenterEVafterDwgClose == true)
            recenterEViewAfterDrawingViewerClosesToolStripMenuItem.Checked = true;
        else
            recenterEViewAfterDrawingViewerClosesToolStripMenuItem.Checked = false;

        //-------------------------------------------------------
        EViewMethods.screenBehavior = Settings.Default.ViewStyle;

        normalToolStripMenuItem.Checked = false;
        clearViewToolStripMenuItem.Checked = false;
        clearviewDULevLRToolStripMenuItem.Checked = false;
        clearviewdULevLLToolStripMenuItem.Checked = false;
        clearviewdURevULToolStripMenuItem.Checked = false;
        clearviewdURevLLToolStripMenuItem.Checked = false;
        clearviewdURevLRToolStripMenuItem.Checked = false;
        smallScreenToolStripMenuItem.Checked = false;


        switch (EViewMethods.screenBehavior)
        {
            case "Normal":
                normalToolStripMenuItem.Checked = true;
                Settings.Default.FormViewDwgLocation = new Point(0, 0);
                //Settings.Default.FormEviewLocation = new Point(EViewMethods.form1CenterLeft, EViewMethods.form1CenterTop);
                Settings.Default.FormEviewLocation = new Point(588, 312);
                Settings.Default.FormECNLocation = new Point(EViewMethods.formECNLeft, EViewMethods.formECNTop);
                //EViewMethods.reCenterEVafterDwgClose = false;
                Form1.ActiveForm.SetDesktopLocation(588, 312);
                break;
            case "Clearview-dULevUR":
                clearViewToolStripMenuItem.Checked = true;
                Settings.Default.FormViewDwgLocation = new Point(0, 0);
                Settings.Default.FormEviewLocation = new Point(1180, 0);
                Settings.Default.FormECNLocation = new Point(EViewMethods.formECNLeft, EViewMethods.formECNTop);
                //EViewMethods.reCenterEVafterDwgClose = true;
                Form1.ActiveForm.SetDesktopLocation(588, 312);
                break;
            case "Clearview-dULevLR":
                clearviewDULevLRToolStripMenuItem.Checked = true;
                Settings.Default.FormViewDwgLocation = new Point(0, 0);
                Settings.Default.FormEviewLocation = new Point(1180, 622);
                Settings.Default.FormECNLocation = new Point(EViewMethods.formECNLeft, EViewMethods.formECNTop);
                //EViewMethods.reCenterEVafterDwgClose = true;
                Form1.ActiveForm.SetDesktopLocation(588, 312);
                break;
            case "Clearview-dULevLL":
                clearviewdULevLLToolStripMenuItem.Checked = true;
                Settings.Default.FormViewDwgLocation = new Point(0, 0);
                Settings.Default.FormEviewLocation = new Point(0, 622);
                Settings.Default.FormECNLocation = new Point(EViewMethods.formECNLeft, EViewMethods.formECNTop);
                //EViewMethods.reCenterEVafterDwgClose = true;
                Form1.ActiveForm.SetDesktopLocation(588, 312);
                break;
            case "Clearview-dURevUL":
                clearviewdURevULToolStripMenuItem.Checked = true;
                Settings.Default.FormViewDwgLocation = new Point(825, 0);
                Settings.Default.FormEviewLocation = new Point(0, 0);
                Settings.Default.FormECNLocation = new Point(EViewMethods.formECNLeft, EViewMethods.formECNTop);
                //EViewMethods.reCenterEVafterDwgClose = true;
                Form1.ActiveForm.SetDesktopLocation(588, 312);
                break;
            case "Clearview-dURevLL":
                clearviewdURevLLToolStripMenuItem.Checked = true;
                Settings.Default.FormViewDwgLocation = new Point(825, 0);
                Settings.Default.FormEviewLocation = new Point(0, 622);
                Settings.Default.FormECNLocation = new Point(EViewMethods.formECNLeft, EViewMethods.formECNTop);
                //EViewMethods.reCenterEVafterDwgClose = true;
                Form1.ActiveForm.SetDesktopLocation(588, 312);
                break;
            case "Clearview-dURevLR":
                clearviewdURevLRToolStripMenuItem.Checked = true;
                Settings.Default.FormViewDwgLocation = new Point(825, 0);
                Settings.Default.FormEviewLocation = new Point(1180, 622);
                Settings.Default.FormECNLocation = new Point(EViewMethods.formECNLeft, EViewMethods.formECNTop);
                //EViewMethods.reCenterEVafterDwgClose = true;
                Form1.ActiveForm.SetDesktopLocation(588, 312);
                break;
            case "Small-screen":
                //clearviewdURevLRToolStripMenuItem.Checked = true;
                smallScreenToolStripMenuItem.Checked = true;
                Settings.Default.FormViewDwgLocation = new Point(0, 0);
                Settings.Default.FormEviewLocation = new Point(0, 0);
                Settings.Default.FormECNLocation = new Point(0, 0);
                //EViewMethods.reCenterEVafterDwgClose = true;
                Form1.ActiveForm.SetDesktopLocation(588, 312);
                break;
        }



        //Form1.ActiveForm.SetDesktopLocation(588, 312); //all screen behavior mode will begin centered on the screen
        EViewMethods.eviewUserPrefLocation = Settings.Default.FormEviewLocation;
        //-------------------------------------------------------

        EViewMethods.syncListToDwgNum = Settings.Default.SyncListDwgNum;
        if (EViewMethods.syncListToDwgNum == true)
            synchronizeListToActiveDwgToolStripMenuItem.Checked = true;
        else
            synchronizeListToActiveDwgToolStripMenuItem.Checked = false;
        toolStripStatusLabel1.Text = "";
        toolStripStatusLabel2.Text = Settings.Default.ViewStyle;
        toolStripStatusLabel3.Text = Settings.Default.DefaultPrinter;
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        Assembly asm = Assembly.GetExecutingAssembly();
        AssemblyName asmName = asm.GetName();
        EViewMethods.eviewVersion = asmName.Version.ToString();

        radioPartInfo.Checked = true;
        disableAllSearch();
        EViewMethods.userName = Environment.UserName;

        EViewMethods.openConnection();

        mySplash.Progress++;

        EViewMethods.loadFavorites(listFavorites);

        mySplash.Close();
        mySplash.Dispose();

        this.Show();
        this.ActiveControl = comboEntry;

    }

More condensed listing showing only more pertinent code:

    public Form1()
    {
        Splash mySplash = new Splash();
        mySplash.TotalValue = 7; //or however many steps you must complete
        mySplash.Show();
        mySplash.Update();

        InitializeComponent();

        //--<begin>--------------
        this.Hide();
        this.WindowState = FormWindowState.Normal;

        mySplash.Progress++;

        ...

        mySplash.Progress++;

        ...

        mySplash.Progress++;

        //~~~~~~~~~~~~~~~~~~~~Getting printer info~~~~~~~~~~~~~~~~~~~~~~~~~
        List<Win32_Printer> printerList = Win32_Printer.GetList();

        ...

        mySplash.Progress++;

        ...

        mySplash.Progress++;

        EViewMethods.reCenterEVafterDwgClose = Settings.Default.ReCenterEVafterDwgClose;
        if (Settings.Default.ReCenterEVafterDwgClose == true)
            recenterEViewAfterDrawingViewerClosesToolStripMenuItem.Checked = true;
        else
            recenterEViewAfterDrawingViewerClosesToolStripMenuItem.Checked = false;

        //-------------------------------------------------------
        EViewMethods.screenBehavior = Settings.Default.ViewStyle;

        ...

        //Form1.ActiveForm.SetDesktopLocation(588, 312); //all screen behavior mode will begin centered on the screen
        EViewMethods.eviewUserPrefLocation = Settings.Default.FormEviewLocation;
        //-------------------------------------------------------

        EViewMethods.openConnection();

        mySplash.Progress++;

        ...

        mySplash.Close();
        mySplash.Dispose();

        this.Show();
        this.ActiveControl = comboEntry;

    }

Code for Splash:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Reflection; using System.Threading;

namespace EView2 { public partial class Splash : Form { static int total = 100; static int currPos = 0;

    static string text;

    // Threading
    static Splash ms_frmSplash = null;
    static Thread ms_oThread = null;

    public Splash()
    {
        InitializeComponent();

        this.labelVersion.Text = Assembly.GetExecutingAssembly().GetName().Version.ToString();
    }

    public int TotalValue
    {
        get
        {
            return total;
        }
        set
        {
            total = value;
            progressBar1.Maximum = total;
        }
    }

    public int Progress
    {
        get
        {
            return currPos;
        }
        set
        {
            currPos = value;
            try
            {
                progressBar1.Value = currPos;
            }
            catch { }
        }
    }

    static public void ShowSplashScreen()
    {
        // Make sure it's only launched once.
        if (ms_frmSplash != null)
            return;
        ms_oThread = new Thread(new ThreadStart(Splash.ShowForm));
        ms_oThread.IsBackground = true;
        ms_oThread.Start();
    }

    // A property returning the splash screen instance
    static public Splash SplashForm
    {
        get
        {
            return ms_frmSplash;
        }
    }
    // A private entry point for the thread.
    static private void ShowForm()
    {
        ms_frmSplash = new Splash();
        Application.Run(ms_frmSplash);
    }
A: 

I see from the multithreading stuff in splash that it looks like you tried to make the splash screen operate more smoothly and probably ran into the error about updating form properties from a different thread than the one that created it.
Ways around that:
- Invoke (looks like complicated code but really not that bad)
- 250ms timer in the splash thread that takes commands from instance variables / properties (hackish)

So it must be that the progress bar manages to update itself anyway. You could alway put in a me.refresh in the progress setter if you're having trouble with that. Or doevents after updating the pb, which really should only be used when there is any visible form with no controls that can raise events (e.g., click) which you might be handling on it, as that will cause reentrancy.

But that's not what you asked. Sorry. To fix that w/o re-writing, add this code before the close/dispose of the splash

MySplash.Visible = False
System.Windows.Forms.Application.DoEvents

Forgive me if I can't test it to prove it, I'm lacking a simplest - reduced-case screnario which manifests the problem to load up and test with (tip - always do that when posting code, 50% of the time you find the bug doing it, the other 50% you'll actually get people giving you answers as many won't read past 2 screens of code). I am also not promising that won't cause problems with the app appearing under another window on the screen, but you didn't ask about that either ;-)

FastAl
I was glad to see your reply and enjoyed your discussion. I was hoping your suggestion would put this problem to rest, but it didn't. The splash relentlessly moves over to Form1's upper right corner before it closes and Form1 appears. I've just about given up on it and the users may or may not complain about it. But I anxiously hope to solve it eventually. Any other ideas would be greatly appreciated.
Bob T.
A few other hacks you could try:-move the hide up a progress bar step or 2-instead of hiding, set width/height to 1-set windowstate property to minimized-To figure out what's causing the move:Add an event handler to OnMove event of form. Add the keyword 'stop'. This is like a breakpoint in code. When it's hit see if the top/left are different. View the call stack (debug/windows). You can see the functions calling you and double click them to go there and see what's up. This technique has saved my arse many a time!
FastAl
Thanks for the great suggestions. I think the OnMove event might be a good one to check. Can't try right now, but will jump on it after lunch. Stuck on a different problem right now.
Bob T.
FastAI - Thanks for your suggestion! I set Splash to run minimized and that caused an error to occur at "Form1.ActiveForm.SetDesktopLocation(588, 312);" That code was intended for the Form1, but Splash was receiving it and couldn't position to the Form1 location 588,312 (it shouldn't but it was).Thanks for the suggestion. Problem is solved.
Bob T.