Sebastian Ulmer wrote:
> Hey,
> kurz mein Problemchen. Beim Start meiner MDI Applikation werde ich durch
> einen Dialog am Anfang aufgefordert ein neues Document zu erstellen.
Das liegt daran, dass du mehrere Dokument Typen registriert hast.
Wie ich schon mal sagte: Ist keine so gute Idee.
> Ist
> es möglich, das beim Start der Applikation nicht ein neues Dokument
> erzeugt werden kann sondern ein altes geöffnet?
Sicher
>
> Soweit ich bisher gesehn hab ist dafür die Klasse
>
> CCommandLineInfo::CCommandLineInfo()
>
> verantwortlich, von der in der InitInstance eine neue Instanz erzeugt
> wird.
> Der Konstruktor sieht folgendermaßen aus:
Der ist herzlich uninteressant.
Schau ins InitInstance. Gleich nachdem das Objekt erzeugt wurde,
wird ProcessCommandLine aufgerufen. Was denkst du macht dieser
Aufruf?
> Nun wird nach ein paar Funktionsaufrufen die Variable m_nShellCommand
> ausgewertet und aufgrund des "FileNew" wird der Dialog erzeugt.
> Dachte ganz leicht, änder ich doch einfach "FileNew" in "FileOpen".
> Komischerweise weißt er mir immernoch "FileNew" zu.
Klar. Weil ProcessCommandLine den FileNew hineinschreibt, weil auf der
Command Line keine Datei angegeben ist.
> Hat jmd einen Ansatz um beim Start nicht den FileNew-Dialog sondern den
> FileOpen Dialog aufzurufen?
Ist doch einfach.
In der InitInstance:
1 | CCommandLineInfo cmdInfo;
|
2 | // ParseCommandLine(cmdInfo);
|
3 |
|
4 | cmdInfo.m_nShellCommand = CCommandLineInfo::FileOpen;
|
5 | cmdInfo.m_strFileName = "C:\\test.dat";
|
6 |
|
7 | // Dispatch commands specified on the command line
|
8 | if (!ProcessShellCommand(cmdInfo))
|
9 | return FALSE;
|
Wenn du aber sowieso immer eine Datei öffnen willst und daher
auf die Übergabe eines Dateinamens verzichten willst (was besonders
praktisch ist, wenn die Dateiendung deiner Dateien mit deinem
Programm verknüpft sind, dann reicht ein Doppelklick auf die
Datendatei und dein Programm startet und lädt diese Datei)
dann brauchst du im Grunde überhaupt keine Command Line Auswertung
mehr, und kannst daher den Open direkt machen:
1 | /*
|
2 | CCommandLineInfo cmdInfo;
|
3 | ParseCommandLine(cmdInfo);
|
4 |
|
5 | cmdInfo.m_nShellCommand = CCommandLineInfo::FileOpen;
|
6 | cmdInfo.m_strFileName = "C:\\test.dat";
|
7 |
|
8 | // Dispatch commands specified on the command line
|
9 | if (!ProcessShellCommand(cmdInfo))
|
10 | return FALSE;
|
11 | */
|
12 | OpenDocumentFile( "C:\\test.dat" );
|
Anstelle des fixen Dateinamens hindert dich nun nichts und niemand
daran, vorher mit einem FileOpenDialog einen Filenamen abzufragen.
Andere Möglichkeit.
Anstelle von FileOpen weist du der CommandLineInfo den Befehl
FileNothing zu, damit fährt dein Programm hoch, das Hauptfenster
zeigt sich und ansonsten passiert nichts. Wenn man das dann noch
damit kombiniert, dass ProcessCommandLine ein FileNew hinterlässt,
wenn es auf der CommandLine keinen Befehl entdeckt hat, hat man
das beste aus 2 Welten: Auf der einen Seite ist die App beim
Hochfahren ruhig. Auf der anderen Seite funktioniert DDE immer
noch.
1 | CCommandLineInfo cmdInfo;
|
2 | ParseCommandLine(cmdInfo);
|
3 |
|
4 | if( cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew )
|
5 | cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
|
6 |
|
7 | // Dispatch commands specified on the command line
|
8 | if (!ProcessShellCommand(cmdInfo))
|
9 | return FALSE;
|