8
votes

L'écran des éclaboussures ne revient pas au centre de la forme principale

moi tout le monde. J'ai actuellement un problème avec mon objectif lors de l'utilisation d'un écran de splash. J'utilise VS2008, avec .NET Framework 2.0. En outre, j'ai lié mon projet avec le VisualBasic.dll puisque j'utilise les applicationsVices pour gérer mon application d'instance unique et mon écran SPLASH.

Voici un extrait de code simplifié de ce que j'ai essayé de débogage. P>

namespace MyProject
{
    public class Bootstrap
    {
        /// <summary>
        /// Main entry point of the application. It creates a default 
        /// Configuration bean and then creates and show the MDI
        /// Container.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            // Creates a new App that manages the Single Instance background work
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            App myApp = new App();
            myApp.Run(args);
        }
    }

    public class App : WindowsFormsApplicationBase
    {
        public App()
            : base()
        {
            // Make this a single-instance application
            this.IsSingleInstance = true;
            this.EnableVisualStyles = true;

            // There are some other things available in the VB application model, for
            // instance the shutdown style:
            this.ShutdownStyle = Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses;

            // Add StartupNextInstance handler
            this.StartupNextInstance += new StartupNextInstanceEventHandler(this.SIApp_StartupNextInstance);
        }

        protected override void OnCreateSplashScreen()
        {
            this.SplashScreen = new MyMainForm();
            this.SplashScreen.StartPosition = FormStartPosition.CenterScreen;
        }
        protected override void OnCreateMainForm()
        {
            // Do your initialization here
            //...
            System.Threading.Thread.Sleep(5000);  // Test
            // Then create the main form, the splash screen will automatically close
            this.MainForm = new Form1();
        }
        /// <summary>
        /// This is called for additional instances. The application model will call this 
        /// function, and terminate the additional instance when this returns.
        /// </summary>
        /// <param name="eventArgs"></param>
        protected void SIApp_StartupNextInstance(object sender,
            StartupNextInstanceEventArgs eventArgs)
        {
            // Copy the arguments to a string array
            string[] args = new string[eventArgs.CommandLine.Count];
            eventArgs.CommandLine.CopyTo(args, 0);

            // Create an argument array for the Invoke method
            object[] parameters = new object[2];
            parameters[0] = this.MainForm;
            parameters[1] = args;

            // Need to use invoke to b/c this is being called from another thread.
            this.MainForm.Invoke(new MyMainForm.ProcessParametersDelegate(
                ((MyMainForm)this.MainForm).ProcessParameters),
                parameters);
        }
    }
}


2 commentaires

Ceci est mon code. Cela prend donc cela assez sérieusement, l'attribution est requise. Vous devez inclure un lien vers le code d'origine et le nom de l'auteur.


J'ai pris ce code il y a longtemps (dates mois, je pense) et ajouté uniquement pour la SplashScreen. Désolé si c'était à vous de commencer avec. Comment puis-je ajouter votre attribution et votre lien?


8 Réponses :


0
votes

Et si vous définissez explicitement le focus dans votre événement de chargement de form1?


1 commentaires

J'avais essayé de mettre le ceci.focus () à l'intérieur de l'événement montré, cela n'a pas corrigé le problème. Mais maintenant je suis confus. Parfois, le focus fonctionne bien, parfois ce n'est pas le cas.



4
votes

La question n'est pas en détail.

1) Quelle est la relation entre l'écran SplashScreen et la forme principale de l'application?

2) Comment SplashScreen se ferme automatiquement?

Je suis sûr que le problème ici est que la forme principale avait déjà commencé à charger en arrière-plan pendant que SplashScreen est encore à fermer. En raison de la mauvaise timing, la forme principale se charge dans l'arrière-plan et les décharges de SplashScreen ... d'où le flash dans la barre des tâches.

Faire apparaître de manière contrôlée en série. Il y a plusieurs façons. Je ne peux pas vous suggérer exactement comment, puisque presque un détail n'a été fourni. Comme ce qui est VB faisant dans le projet, combien de threads fonctionnent, quelles sont les formes personnalisées utilisées ici .. etc.

EDIT:

algorithme pour implémenter l'écran des éclaboussures (IMHO) :)

1) Créez un formulaire personnalisé - Écran Splash

2) exécutez-le sur un fil séparé. Mettre en œuvre son comportement comme vous le souhaitez.

3) Dans votre formulaire d'écran SPLASH, écrivez un gestionnaire pour capturer un gestionnaire d'événements de déchargement personnalisé qui ferme le formulaire d'écran de Splash.

4) maintenant, retour dans le fil principal, créez-vous le formulaire d'application principal. Définissez sa propriété visible sur false.

5) Écrivez un rendez-vous d'un événement de la forme principale. Dans ce gestionnaire, tirez un événement sur l'écran de déménagement pour décharger. Ensuite, rendez la forme principale visible.


5 commentaires

En réalité, le cadre Visualbasic travaille automatiquement au travail en ce qui concerne l'écran SplashScreen. Il l'affiche automatiquement et lorsque la forme principale est affichée, elle détruit l'écran des éclaboussures. Je n'ai que le fil principal en cours d'exécution. Mon processus de chargement est effectué dans l'ONCREATEMAINEFORT où le // est votre initialisation ici.


Que vb fw pourrait être le problème. Comme vous l'avez dit, il détruit l'écran des éclaboussures lorsque la forme principale se charge, puis la mise au point peut être commutée sur l'écran des éclaboussures pendant son action étroite. Je ne sais pas, mais vous devez vérifier vb fw u r en utilisant. Utilisez-vous seulement pour Splash? Cela peut être fait en C # aussi sans VB FW.


J'ai commencé à l'utiliser pour l'application SingleInstance. C'est un charme pour ça. Il passe mes arguments de ligne de commande à l'application ouverte et à tout. Je n'ai ajouté que le SplashScreen il y a quelques jours, car mon initialisation peut avoir des messages à afficher à l'utilisateur via Messagebox, alors j'avais donc besoin d'un élément d'interface graphique pour être présent.


Eh bien, vous en gagnez, vous en perdez. Je ne recommanderais pas d'utiliser des Libs à source fermée tiers, sauf si fortement recommandé. Vous pouvez passer à une libère plus fiable, ou écrire votre propre code.


Votre solution semble être bonne. Pour le moment, j'ai continué à utiliser le cadre VisualBasic, mais j'ai opté pour une solution hybride de ce que j'ai déjà eu. Lorsque je traite les arguments de ligne de commande, je fais un minimisant, puis rechageez de l'état pour normaliser sur le formulaire. Cette séquence capture le focus ok. Il a des comportements bizarqueurs dans certains cas, mais je devais travailler sur d'autres problèmes et fonctionnalités à mettre en œuvre.



0
votes

Pour une raison obscure, la mise au point semble fonctionner correctement. Je vais essayer d'intégrer davantage de mon exécution normale de mon programme principal dans MyMainform et essayer de trouver ce qui provoque vraiment le changement de mise au point. Je vais vous garder tous postés.


4 commentaires

Il semble que j'ai perdu une journée à cause de vs. J'ai simplement supprimé les dossiers bin et obj, tout recompilé avec ma solution originale tout fonctionne très bien. Désolé pour tout ce désordre.


Eh bien, je suis de retour avec la même question. Pour une raison inconnue, cela n'a fonctionné que temporairement. Et je n'ai changé aucun code. Ce qui est arrivé pour cela pour travailler pour cette brève période de temps, je n'ai aucune idée. Et je suis vraiment à l'abri des idées.


Peut-être qu'il est temps de chercher des alternatives? Vous éviteriez de perdre du temps sur de telles problèmes de synchronisation stupide en écrivant votre code.


Vérifiez ma réponse pour un algo pour implémenter l'écran des éclaboussures



3
votes

Vous devez appeler la méthode activate () sur votre formulaire principal afin de l'afficher correctement.


0 commentaires

2
votes

Dans certaines de mes implémentations de formes Splash sur un fil différent, j'ai également vu cette situation.

Habituellement si j'appelle cela.Activate (); comme ma première ligne de Code dans la charge de formulaire Il a tendance à fonctionner comme prévu. Mettre cela après avoir caché que les éclaboussures ne fonctionnent généralement pas correctement.

Autres méthodes pouvant aider. xxx


0 commentaires

0
votes

Essayez appeler form1.show () après this.mainform = nouveau formulaire1 (); Cela a fonctionné pour moi.


0 commentaires

0
votes

J'ai eu le même problème et je voulais une solution facile pour cela.

J'ai essayé ci-dessus mais pas de chance, mais des idées d'informations utiles ci-dessus.

J'ai essayé mon tour et ça marche pour moi. < / p>

Ceci est mon code.Cs code qui fonctionne bien: xxx

remarque le mainwindow.top plus = vrai;

OK qui travaillait assez, mais je ne voulais pas que le MainWindow reste sur le dessus.

donc dans montré événement J'ai ajouté this.topment le plus " xxx

MAINTURE fonctionne comme je le souhaite de fonctionner.

Remarque: vient de poster pour aider tout autre utilisateur qui affronte le même problème à quoi je suis confronté.

codage heureux :)


0 commentaires

0
votes

Dans You FORMULAIRE Evénement de charge de la forme principale Ajouter cela.Activate ();


0 commentaires