[C++] Frage zu MFC-Anwendungen

WhiteGandalf

Mitglied
Hi!

Vorweg: Benutze Visual Studio 6 unter WinXP

Da ich bisher immer nur Win32 Anwendungen programmiert habe, mangelt es mir etwas an Wissen über MFC-Anwendungen. Folgende Frage habe ich nun:
Wenn ich die Funktino "GetDlgItem" in der (automatisch angelegten) .cpp Datei benutze, kann ich dort einfach die ID als Parameter übergeben und er ist zufrieden. Nun habe ich aber eine Headerdatei erstellt und #included und möchte dort auch gerne "GetDlgItem" benutzen. Nur verlangt er hier auf einmal 2 Paramter, nämlich als ersten noch ein Fensterhandle (also die Win32 GetDlgItem-Funktion)... Wie kann das sein und wie komme ich an das Handle meines Dialoges (GetActiveWindow() geht nicht weil ich die betreffende Funktion schon vor der Initialisierung des Fensters aufrufe)

Wäre für Hilfe sehr dankbar :)
WhiteGandalf
 
Hi Gandalf,

also wenn das Fenster noch gar nicht initialisiert ist, wird es dir nichts bringen, diese Funktion aufzurufen, da du dafür ein gültiges Fensterhandle brauchst!

Wenn du ein initialisiertes Fenster hast, kannst du mit der Methode GetSafeHwnd() ein HWND bekommen, welches du dann in die Win32 Funktion GetDlgItem() reinpacken kannst.

Beschreib mal näher, was das für eine Header Datei ist, in der du GetDlgItem() verwenden möchtest und in was für einen Zusammenhang diese mit deiner Fensterklasse steht.

Bis dahin schöne grüße,

Peter
 
Hallo Peter!

Ich weiß wie ich ein Fensterhandle bekomme, auch die Zusammenhänge sind mir klar. Mein Problem dabei ist folgendes:
Ich habe ein neues MFC-Projekt erstellt mit einer .cpp und einer .h Datei. Wenn ich nun Code in die .cpp Datei schreibe und GetDlgItem aufrufe, brauche ich nur einen Paramter übergeben, nämlich die ID des Steuerelementes. Möchte ich nun aber GetDlgItem in meiner Headerdatei verwenden (völlig unabhängig vom restlichen Code), muss ich auf einmal zusätzlich zur ID noch ein Fensterhandle angeben. Nun verstehe ich nicht, warum ich für ein und dieselbe Funktion in der .h Datei zwei Parameter und in der .cpp nur einen übergeben muss! :confused:

Ich hoffe ich konnte mich klar genug ausdrücken
mfg WhiteGandalf
 
Hi Mithrandir ;-),

jetzt versteh ich was du meinst :-)

Also die Methode GetDlgItem() mit nur einem Parameter ist eine Methode der Klasse CWnd.

Wenn du diese Methode innerhalb einer von CWnd abgeleiteten Klasse (CDialog, CView...)verwendest(egal ob .cpp oder .h), brauch er nur den einen Parameter, weil das Fensterhandle implizit innerhalb der Funktion von der Klasse bereitgestellt wird.

Deine .h datei, von der du redest, ist keine Headerdatei von einer von CWnd abgeleiteten Klasse, stimmts?

Poste doch mal deinen Code, dann kann ich dir bestimmt mehr darüber sagen.

Schönen Gruß,
Peter
 
Deine Annahme ist absolut richtig, die in meiner .h Datei deklarierten Funktionen sind nicht von CWnd abgeleitet ;) (deshalb poste ich meinen code jetzt auch nicht ^^)
Vielen Dank!

Vlt kannst du mir noch bei einem anderen Problem helfen, bin in MFC wie gesagt totaler Anfänger und hab über google auch nichts brauchbares gefunden...

Neben dem standadmäßig eingefügten Dialog habe ich nun einen weiteren erstellt. Nun soll dieser nach einem Klick auf einen Button angezeigt werden. Ich dachte da an DoModal(), nur kann ich nicht auf die Klasse des neuen Dialoges zugreifen, der Compiler sagt immer "Nichtdeklarierter Bezeichner" (also zwei .cpp Dateien die sich gegenseitig nicht kennen sozusagen :-) )

Wie bekomme ich nun Zugriff auf den zweiten Dialog um ihn anzuzeigen?

Danke für die bisherige Hilfe
mfg WhiteGandalf / Mithrandir (wie auch immer ;))
 
Hallo grauer Zauberer,

also, du hast 2 Dialoge. CMyDlg1 und CMyDlg2.

in dem OnClick-Eventhandler auf deinen Button in deinem CMyDlg1 rufst du folgenden code auf:

Code:
    CMyDlg2 dlg;
    if( dlg.DoModal() == IDOK ) {
        // OK button in CMyDlg2 wurde geklickt
    }

Dazu musst du nun diese Klasse auch dieser .cpp Datei bekannt machen.
Dazu fügst du in der .cpp datei der Klasse CMyDlg1 die Anweisung

#include "MyDlg2.h"

hinzu.

Damit ist die Klasse CMyDlg2 im .cpp Bereich der Klasse CMyDlg1 bekannt und du kannst sie verwenden.

Hoffe, es hilft,

Peter
 
Was soll ich dazu sagen? Einfach perfekt ^^

Damit wäre erst einmal alles geklärt. Sollten noch weitere Probleme auftauchen (wovon ich ausgehe^^) werde ich sie hier hinein posten.

Vielen Dank für die schnelle und freundliche Hilfe Peter!
mfg, der WEIßE Gandalf ;)
 
Gern geschehen.

Und vergiss bitte nicht, den beitrag zu bewerten und zu schließen, wenn er dir geholfen hat ;-)

Bis zu deinem nächsten posting ...


Peter
 
Zuletzt bearbeitet:
Und da haben wir schon die nächste Frage...^^

Angenommen ich habe in meinem Projekt zwei .cpp und eine .h Datei. Nun ist in der .h Datei eine Klasseninstanz deklariert auf die beide .cpp Dateien Zugriff haben sollen. #include ich die .h Datei jeweils in die beiden .cpp Dateien meckert der Compiler, das Objekt sei bereits in der .obj Datei der anderen .cpp Datei definiert. :confused:
Wie kann ich das umgehen?

mfg WhiteGandalf
 
Hallo Gandalf,

trage doch mal in deiner .h Datei als erste Direktive folgendes ein

Code:
#pragma once

Dies sollte verhindern, das der Compiler diese Header Datei mehrfach inkludiert.


Gruß,

Peter
 
Zurück