Dialog-Controls

Ich arbeite mit Visual C++ 6.0
Zum Auswählen einer Datei gibt es in Visual C++ die fix und fertige Dialogbox CFileDialog. Diese Dialogbox ist für meine Zwecke so weit ganz gut, nur den einen Button möchte ich umbenennen. Ich leite von CFileDialog eine eigene Klasse ab. In der OnInitDialog()-Methode versuche ich dann mit dem folgenden Aufruf an die Einzelnen Elemente zu kommen.
CWnd *wnd;
wnd = GetWindow(GW_CHILD);
Aber die GetWindow-Methode liefert nur einen Nullzeiger zurück. Ich habe auch die Methode GetDlgItem ausprobiert um an die einzelnen Elemente zu kommen. Auch hier ohne Erfolg.
Kann mir jemand sagen, wie man bei den fix und fertigen Dialogen an die einzelnen Controls kommt?

Danke

Hallo!

Also ich hab das bisher nur mit dem CColorDialog versucht, sollte allerdings mit dem CFileDialog genauso bzw. ähnlich gehen.

In einem Unterverzeichnis des Visual Studio Ordners solltest Du die Datei FILEOPEN.DLG finden, kopier deren Inhalt in die .RC-Datei Deines Projekts und Du solltest eine (bzw. meherere) neue Dialog-Resourcen in Deinem Projekt finden.
Beim CColorDialog gab es jetzt noch eine passende .H-Datei zur .DLG-Datei, aber die kann ich beim CFileDialog nirgens finden, egal, sollte auch so funktionieren.
Jetzt solltest Du aus Deiner abgeleiteten Klasse über GetDlgItem und die entsprechende ID bzw. Nummer Zugriff auf das Control erhalten können.
Außerdem könntest Du jetzt natürlich auch zusätzliche Controls auf dem Dialog anbringen, bzw. die vorhandenen nach Deinen Wünschen bearbeiten.

Gruß Tobias

Danke erst mal für deine Hilfe. Ich habe die Resource jetzt eingefügt. Aber irgendwie komme ich damit nicht wirklich weiter.

Wenn ich meine Dialogbox von CDialog ableite dann habe ich eine Dialogbox mit dieser Resource aber völlig ohne Funktionalität. Wenn ich meine Dialogbox dagegen von CFileDialog ableite dann werden die Resourcen aus dieser Resourcendatei verworfen und meine Dialogbox nimmt die Resourcen aus CFileDialog. Damit habe ich wieder das alte Problem dass ich auf die Dialogelemente nicht zugreifen kann.

Stefan

Hallo!

Sorry ich hab da wohl in der Eile noch was wichtiges übersehen.
Also wie gesagt ich hab’s nur mit CColorDialog versucht aber ich denke bei CFileDialog sollte es ähnlich funktionieren:

Angenommen deine Klasse heißt CMyFileDialog und deine Resource heißt IDD_MY_FILE_DIALOG, müßtest Du das Ganze wie folgt anwenden:

CMyFileDialog MyFileDlg;
MyFileDlg.m\_ofn.lpTemplateName = MAKEINTRESOURCE(IDD\_MY\_FILE\_DIALOG);
MyFileDlg.DoModal();

So, ich hoffe ich hab nicht schon wieder die Hälfte vergessen.

Gruß Tobias

Es klappt immer noch nicht.
Zu MyFileDlg.m_ofn.lpTemplateName hab ich mal ein bisschen nachgelesen. Muss da nicht das Flag OFN_ENABLETEMPLATE gesetzt werden? Wenn ich dieses Flag setze bekomme ich eine Fehlermeldung.

Mit dem Debugger habe ich mal die Zeile
MyDlalogg.m_ofn.lpTemplateName = MAKEINTRESOURCE(1536);
untersucht. Ich habe festgestellt, dass MAKEINTRESOURCE einen Leerstring zurückliefert. Daraufhin bin ich mir nicht mehr sicher ob ich hier das richtige Argument übergeben habe. Die 1536 habe ich aus dem Dialogeditor / Eigenschaften / Reiterseite: Allgemein / Feld: ID.

Stefan

Hallo, wußt ich’s doch, daß ich wahrscheinlich wieder was vergessen hab.

Hab jetzt auch mal mit CFileDialog etwas rumprobiert krieg aber auch nur komische Ergebnisse, irgendwie wird meine Reource zusätzlich an die urprüngliche angefügt, aber besser hab ich’s bisher noch nicht hingekriegt.

Du hast natürlich recht, Du mußt noch OFN_ENABLETEMPLATE als Flag angeben, außerdem OFN_ENABLEHOOK, evtl. noch OFN_EXPLORER, außerdem mußt Du noch im Dialog Template (anders als bei CColorDialog) WS_CHILD, WS_CLIPSIBLINGS, WS_3DLOOK und DS_CONTROL (siehe MSDN: Explorer-Style Custom Templates). Dann kriegst Du zumindest mal das gleiche Ergebnis wie ich, aber ab hier weiß ich jetzt auch erst mal nicht weiter.

Gruß Tobias

Mal noch was anderes, hast Du eigentlich schon mal nach deinem Problem gegoogelt? Jetzt hat’s mich nämlich auch interessiert und ich finde bei Google sofort einen Hinweis auf die Funktion SetControlText, mit der ich bei mir in OnInitDialog Zugriff auf die Buttons des Dialogs bekomme. Und zwar ohne den ganze Resourcen und Template Schnick-Schnack. Müßte eigentlich für Deine Zwecke genügen. Gruß Tobias

ja,
ich habe nach dem Thema gegoogelt, bevor ich das Thema hier ins Forum setzte.

Die Funktion SetControlText wie auch alle anderen Funktionen, die auf die einzelnen Controls zugreifen funktionieren nicht. Es scheint mir so als wenn CFileDialog seine EIGENEN Controls hat. Aber währe dann ja komplett im Widerspruch zur Objektorientierung, Wiederverwendbarkeit, nicht das Rad neu erfinden usw.

Stefan

super
Es hat geklppt!

Danke für deine Hilfe.