Ordner im CFileDialog anders voreinstellen?

Olaf Lehmann

Mitglied
Hier gleich noch ne Anfrage zu ner nervigen Umständlichkeit meines Programms.

Ich wähle über CFileDialog eine Datei zum Öffnen aus:

void CDateiDlg::OnButton1()
{
CFileDialog m_dlgFile( TRUE ); // TRUE = Datei öffnen,
// FALSE = Datei speichern
if( m_dlgFile.DoModal() == IDOK )
{
m_pathname = m_dlgFile.GetPathName(); // CString m_pathname deklarieren
}
...usw.

Kein Problem soweit. Nur ich muss jedesmal in Datein im Pfad D:\\Programme\\Telemetry und muss deshalb jedesmal vom voreingestellet Pfad C:\\Eigene Dateien dorthin wechseln. Das ist auf die Dauer ziemlich nervig.

Kann man nicht auf eine dem Anfänger ohne größeres Hirnsausen mögliche Art den gewünschten Pfad irgendwie voreinstellen?

Olaf
 
Danke! Leider aber 2 Fehler

Ui, Herr Gates perönlich nimmt sicher meiner an...Fühle mich geehrt...:)

Ich nehme mal an Deine Zeile muss an dieser Stelle stehen:

CFileDialog m_dlgFile( TRUE ); // TRUE = Datei öffnen,
// FALSE = Datei speichern
m_dlgFile.m_pOFN->lpstrInitialDir = "D:\\Programme\\Telemetry";
if( m_dlgFile.DoModal() == IDOK )
{
m_pathname = m_dlgFile.GetPathName(); // CString m_pathname deklarieren
}

Leider kommt dann 2 Fehler:
error C2039: 'm_pOFN' : Ist kein Element von 'CFileDialog'
und:
error C2227: Der linke Teil von '->lpstrInitialDir' muss auf Klasse/Struktur/Union zeigen.

Wenn ich statt m_pOFN m_ofn nehme kommt statt des 1.Fehlers:
error C2819: Der Typ 'tagOFNA' hat keinen ueberladenen Elementoperator '->'

:confused:

P.S.: Mein Compiler ist Visual C++ 6.0 nicht Visual Studio. Hoffentlich liegts nicht daran.
 
Zuletzt bearbeitet:
Soso, VC++6 :eek:

Code:
	CFileDialog m_dlgFile(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, ".txt", NULL );
	m_dlgFile.m_ofn.lpstrInitialDir = "D:\\Programme\\Telemetry";
	if (m_dlgFile.DoModal() == IDOK)
	{
...


grüssle :)
 
:)Wunderbar!:) Ist sehr gut für meine Nerven die Neuerung. Danke!

Weils so schön war noch ein andres Problem:
Mein Programm ist ein Telemetry-Programm zu einem Rennspiel. Es liest aus einer Wiederholungsdatei Daten in ein Array. Diese Daten (Geschwindigkeit, Beschleunigung, Gas...usw.) werden dann als Linien-Diagramme dargestellt. Das klappt alles schon gut.

Damit man von manchen Werten etwas hat muss man den Zoomfaktor ändern. Nach dem Ändern des Zoomfaktors müssen die vorherigen Linien verschwinden und danach gedehnt neu gezeichnet werden. Auch das geht so weit. Aber nicht am Stück.

Ich arbeiten mit zwei Buttons als Zoom-Tasten. Zoo ist der Zoomfaktor.


void CDateiDlg::OnButton7()
{
// ZOOM +
Scroll1=Scroll1*Zoo/(Zoo+1)/(((float)Zoo-1)/(float)Zoo); //Bildlaufleisteschalter anpassen
Zoo++;
Invalidate();
}

Nach Invalidate() wollte ich eigentlich die Zeichenfunktionen für die Diagramme aufrufen:

OnButton1();
OnButton2();
usw...

Die Funktion bricht aber leider in jedem Fall nach Invalidate() ab. So dass ich extra einen Klick auf die rechte Maustaste zum Neuzeichnen programmieren musste, was das Programm umständlich macht. Das gleiche Problem ist bei der Bildlaufleiste.

In einem anderen Teil des Programms wird eine senkrechte Positionsliste gezeichnet und die Werte, die auf der Linie liegen rechts zusätzlich als float-Werte angezeigt. Dabei muss ebenfalls der Bildschirm neu gezeichnet werden, da die alte Positionslinie verschwinden muss. Dabei konnte ich das Problem lösen, indem ich beim Drücken der Maustaste Invalidate() auslöse und beim Loslassen die Funktionen zum Neuzeichnen ausführen lasse.

Mit den Buttons und der Bildlaufleiste lies sich das Problem nicht lösen, da es nur Funktionen für Klick und Doppelklick gibt und die ließen sich nicht kombinieren.

Gibts noch ein anderes Wort als Invalidate(), nachdem eine Funktion nicht beendet wird?

Olaf
Wie gesagt: Visual C++6.0
 
:)Wunderbar!:) Ist sehr gut für meine Nerven die Neuerung. Danke!

Weils so schön war noch ein andres Problem:
...
Da reicht man mal den kleinen Finger ... ;)

...
Gibts noch ein anderes Wort als Invalidate(), nachdem eine Funktion nicht beendet wird?

Olaf
Wie gesagt: Visual C++6.0
Invalidate() bewirkt nur das Löschen des Fensters!

Ruf danach UpdateWindow() auf, dann wird auch neu gezeichnet.

Kannst ja mal probieren, ob du das Invalidate() wirklich brauchst.


grüssle :)
 
Mensch, Invalidate() hab ich probiert und UpdateWindow() auch, aber nie beides hintereinander.
Es funktioniert perfekt. Zwei Nervereien an einem Tag losgeworden!
DANKE!

Ich kann mich wahrscheinlich als Anfänger schwerlich revancieren...Meine Tipps kennst Du alle schon.
So musst Du wohl Grand Prix Legends spielen. Dann kannst Du wenigstens das Programm nutzen, an dem Du mitarbeitest...
 
Hallo,

noch ein Hinweis dazu:
Invalidate() sagt dem Framework, dass das Fenster neu gezeichnet werden muß. Diese Nachricht hat aber eine sehr niedrige Priorität und wenn du sehr viel Nachrichten mit höherer Priorität verarbeiten mußt (bei Telemetrie könnte ich mir das vorstellen), kann es sein, dass es ewig dauert, bis Invalidate() tatsächlich ausgeführt wird. Mit UpdateWindow() zwingst du das Framework, das Fenster sofort zu aktualisieren.

Mfg

langer
 
QuickInfo?

Danke auch an langer1801. Jetzt verstehe ich besser...

Bin inzwischen gut voran gekommen mit meinem Programm. Nun wird es immer umfangreicher...und unübersichtlicher. Ich habe nun viele Schalter mit denen ich die einzelnen Kurven aus und einschalte und viele Eingabefelder zum anzeigen der Werte als Zahlen. Es wäre alles viel anwenderfreundlicher, wenn es mir gelänge QuickInfos zu verwenden. Wenn ich mit dem Mauszeiger über den Button oder über das Eingabefeld gehe, klappt ein kleines Fenster auf, in dem z.B. steht Geschwindigkeit in km/h usw.
Lässt sich das auf die Schnelle in VisualC++6.0 machen?
 
Zurück