Startbild während des Programmstarts anzeigen
-
Hallo,
ich versuche, eine Startbild während des Programmstarts anzuzeigen. Die jetztige Main-Datei möchte ich weiter als Main-Datei behalten, aber das Form mit dem Startbild soll vor dem Main-Datei initialisiert werden.
Hat jemand eine gute Lösung für mich? DankeFu, Bin
-
Hallo,
Mit der Suche habe ich z.Bsp. das hier http://www.c-plusplus.net/forum/viewtopic.php?t=12168&highlight=splash gefunden.
oder das http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/snipp/sc06024.php
-
Danke!!!
-
Bitte.
Das sollte aber auch ein dezenter Hinweis darauf sein, dass man vor dem Fragen die Suche benutzt.
-
ich habe eigentlich zuerst mit Suchefuntion versucht, aber habe leider falsches Schlüsselwort benutzt

Nach deiner Anweisung hat es geklappt, ein Startbild während der Initialisierung des MainForm anzuzeigen. Aber, für mich wäre es noch besser, wenn das Startbild während der Initialisierung des ganzen Programmes dargestellt werden könnte.
Ich habe mit folgend Code in Project.cpp (die C++ Datei für das Projekt) Versucht,
Application->CreateForm(__classid(TF_Splash),&F_Splash); F_Splash->Show(); //Formular für Startbild F_Splash->L_Status->Caption = "initialising main form ..."; F_Splash->Update(); Application->CreateForm(__classid(TF_Main), &F_Main); //Main Formular Application->CreateForm(__classid(TF_Giata), &F_Giata); Application->CreateForm(__classid(TF_DepartAirport), &F_DepartAirport); Application->CreateForm(__classid(TF_Car), &F_Car); Application->CreateForm(__classid(TF_SearchList), &F_SearchList); Application->CreateForm(__classid(TAboutBox), &AboutBox); Application->CreateForm(__classid(TF_ErrorMsg), &F_ErrorMsg); Application->CreateForm(__classid(TF_Banking), &F_Banking); Application->CreateForm(__classid(TF_InfoMsg), &F_InfoMsg); Application->CreateForm(__classid(TF_Warning), &F_Warning); Application->CreateForm(__classid(TF_Operator), &F_Operator); Application->CreateForm(__classid(TF_ScreenShot), &F_ScreenShot); Application->CreateForm(__classid(TF_AgentInfo), &F_AgentInfo); Application->CreateForm(__classid(TF_Season), &F_Season); Application->CreateForm(__classid(TF_StarterUpdate), &F_StarterUpdate); Application->CreateForm(__classid(TF_Option), &F_Option); Application->CreateForm(__classid(TF_FlyerPrinter), &F_FlyerPrinter); Application->CreateForm(__classid(TF_FlyerPreview), &F_FlyerPreview); Application->CreateForm(__classid(TF_Password), &F_Password); Application->CreateForm(__classid(TF_OptionAccess), &F_OptionAccess); Application->CreateForm(__classid(TF_Directory), &F_Directory); delete F_Splash; //release the memory after initialisation of the whole program is finished Application->Run();Leider konnte das Programm nicht gestartet werden, wenn F_Splash am Ende der Initialisierung des Programms gelöscht wird. Es klappt nur, wenn F_Splash in Constructor vom Main-Form nach ihrer Initialisierung gelöscht wird.
Fogende ist ein Beispiel von BCB-Hilfe, komischweise läuft es so eigentlich nicht:
#include <vcl\vcl.h> #include "Unit5.h" #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("Unit1.cpp", Form1); USERES("Project1.res"); USEFORM("Unit2.cpp", Form2); USEFORM("Unit3.cpp", Form3); USEFORM("Unit4.cpp", Form4); USEFORM("Unit5.cpp", Form5); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm5), &Form5); Form5->ProgressBar1->Max = 100; Form5->Show(); // show a splash screen contain ProgressBar control Form5->Update(); // force display of Form5 Application->CreateForm(__classid(TForm1), &Form1); Form5->ProgressBar1->StepBy(25); Application->CreateForm(__classid(TForm2), &Form2); Form5->ProgressBar1->StepBy(25); Application->CreateForm(__classid(TForm3), &Form3); Form5->ProgressBar1->StepBy(25); Application->CreateForm(__classid(TForm4), &Form4); Form5->ProgressBar1->StepBy(25); delete Form5; Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0;hat jemand idee davon?
Nochmal danke!!
-
Ich mach das in etwa so:
Programm kann mit Parameter z.B.: /Splash gerufen werden ( oder ohne)
Bei Start ohne den Parameter:
- App initialisieren
- ShellExecute(Application->Exename ...);
// Parameter "/Splash" mitgeben!!!
- Alle Formulare initialisieren (Zuerst Hauptform!)
Ein Mutex erzeugen mit eindeutigem Namen
- App Run
- Am Ende Mutex löschen!
FERTIG!!!Bei Start MIT dem Parameter:
- App init
- Splashform erzeugen
- App RunFERTIG!!!
in Splashform hab' ich nen (langsamen) Timer
damit wird wiederholt versucht denselben Mutex (gleicher Name!!!)
zu ÖFFNEN.
Falls ÖFNEN klappt (Hauptprogramm hat den Mutex erzeugt!) genuegt
Form->Close()
Vorher Mutex freigeben.
-
DerAltenburger schrieb:
Bei Start MIT dem Parameter:
- App init
- Splashform erzeugen
- App RunFERTIG!!!
in Splashform hab' ich nen (langsamen) Timer
damit wird wiederholt versucht denselben Mutex (gleicher Name!!!)
zu ÖFFNEN.
Falls ÖFNEN klappt (Hauptprogramm hat den Mutex erzeugt!) genuegt
Form->Close()
Vorher Mutex freigeben.Mein Programm soll unter dem Platform XP-SP2 laufen können, deswegen ist ein Aufrufen von einem anderen Programm mit "ShellExecute" nicht erlaubt (weil es unter XP-SP2 nicht erlaubt ist).
Ich weiß nicht, ob ein Mutex mit deinem Vorschlag "Bei Start mit dem Parameter" erzeugt werden soll. Wenn ja, wie und wo definiert ich ein wiederholte Method, denselben Mutex öffen zu versuchen? Ich habe schon etwas gelesen, was Mutext ist, aber habe mit deinem Vorschlag nicht ganz verstanden. Ich weiß nicht, ob du mir ein Beispielcode zeigen könntest. Danke im Voraus!
-
Ich erzeuge meine Splashscreens in dem Haupformular...
als erste Zeile in der OnCreate wird der Splashscreen erzeugt, in der letzten Zeile der OnShow wird der Splashscreen auf gelöscht. Hiermit ist allerdings keine ProgressBar (mit vertretbarem Aufwand) möglich.
Wenn der Splashscrenn in der Project.cpp erzeugt werden soll, sollte das erst durchgeführt werden, nachdem das komplette Programm fertig ist. Ansonsten wird beim Hinzufügen eines weiteren Forms diese Datei neu erzeugt und die selbst eingegenben Zeilen werden gelöscht.
-
Hauptprogramm:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { HANDLE hMutex=NULL; AnsiString Param; try { Param=ParamStr(1); Param=Param.UpperCase(); Application->Initialize(); if (Param.AnsiPos("SPLASH")!=1) { ShellExecute(0,"open",Application->ExeName.c_str(), Param.c_str(),"",SW_SHOW); //Hauptform Application->CreateForm(__classid(TMMSearchForm), &MMSearchForm); //weitere Formulare Application->CreateForm(...); Application->CreateForm(...); Application->CreateForm(...); Application->CreateForm(...); hMutex=CreateMutex(0,0,"MultimediaCentre_Mutex"); Application->Run(); } else { Application->CreateForm(__classid(TSplashDlg), &SplashDlg); AboutDlg->Show(); Application->Run(); } } catch (Exception &exception) { Application->ShowException(&exception); } if (hMutex) ReleaseMutex(hMutex); return 0; }SplashForm:
void __fastcall TSplashDlg::SplashTimerTimer(TObject *Sender) { static HANDLE hMutex=NULL; if (FollowMouse) { Left=Mouse->CursorPos.x - Width / 2; Top=Mouse->CursorPos.y - Height / 2; } if (hMutex) { ReleaseMutex(hMutex); hMutex=NULL; Close(); } else { hMutex=OpenMutex(MUTEX_ALL_ACCESS,false,"MultimediaCentre_Mutex"); } }Timer steht auf 100..500 msec.
-
danke Joe_M. und DerAltenburger für die Beide Lösungen!