[C++] Dialogleiste um Schaltfächen erweitern?

Endurion hat gesagt.:
Wie meinst du das?
Wenn du in MFC und mitm Assistenten ein Projekt erstellt hast, ist doch schon ne Nachrichten behandlungsroutine mit drin.

Ja, du hast recht. Ich möchte aber Systemnachrichten abfangen können. Zum Beispiel für das Minimieren, Maximieren oder auch Schließen eines Dialoges und dafür eigene Funktionen verwenden.

Habe mir ein Fenstergerüst aus Win-API angeschaut. Da wird WindowProc verwendet.
Endurion schrieb aber, dass es mit DefWindowProc gemacht werden kann.

Nun bin ich konfus und Frage nach dem Richtigen. :)
 
Zuletzt bearbeitet:
WindowProc ist die zentrale Callback-Funktion einer Windows-Applikation, in der alle Messages auflaufen, also auch WM_SYSCOMMAND. DefWindowProc() leitet Messages, die nicht von der Applikation verarbeitet werden, an die Windows-Standardroutine weiter.

Bei MFC-Anwendungen kommst du mit WindowProc aufgrund des Message-Maps-Konzepts gar nicht mehr direkt in Berührung. Du must stattdessen einen Message Handler für WM_SYSCOMMAND einfügen (z.B. mit dem Class Wizzard) und alle Messages, die du nicht selber verarbeiten willst, an die entsprechende Funktion der Basisklasse, also CDialog::OnSysCommand(), übergeben. Diese ruft dann letztendlich DefWindowProc() auf.

Die Antwort von Endurion ist vollkommen korrekt.
 
MCoder hat gesagt.:
Du must stattdessen einen Message Handler für WM_SYSCOMMAND einfügen (z.B. mit dem Class Wizzard) und alle Messages, die du nicht selber verarbeiten willst, an die entsprechende Funktion der Basisklasse, also CDialog::OnSysCommand(), übergeben. Diese ruft dann letztendlich DefWindowProc() auf.

Die Antwort von Endurion ist vollkommen korrekt.

Ich bezweifele die Richtigkeit seiner Antwort keinesfalls. ;-)
Ja, einen Handler für WM_SYSCOMMAND einfügen, das wäre ja auch schön.
Mit dem Class-Wizard ist das bei mir nicht möglich - nicht vorhanden.

Im Quelltext ruft CDialog::OnSysCommand(), DefWindowProc() gar nicht auf. :confused:
Außerdem ist die Nachrichtenbehandlung für WM_SYSCOMMAND bereits verhanden.

Code:
BEGIN_MESSAGE_MAP(CMINDlg, CDialog)
	//{{AFX_MSG_MAP(CMINDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

Etwas experimentieren schadet ja nicht. Dabei ist mir folgendes aufgefallen:
In DefWindowProc(), sowie in WindowProc() ist es möglich die Nachricht zu
erkennen und eine Funktion, oder was erwünscht ist, aufzurufen.

Dabei bleibt die Minimieren-Funktion unangetastet (Fenster wird dennoch minimiert).
Das bedeutet, dass die Funktion immer noch aufgerufen wird und wir gegebenenfalls
auf das Minimieren mittels eigener Funktionen reagieren können und mehr nicht.
 
Zuletzt bearbeitet:
Ah ja, wenn du eine dialogbasierte Anwendung hast, ist der Handler für WM_SYSCOMMAND natürlich schon beim Grundgerüst mit dabei. Ansonsten erreichst du den Class Wizzard über das "Ansicht"-Menü (heißt im deutschen Visual Studio "Klassen-Assistent").

WantToKnow hat gesagt.:
Im Quelltext ruft CDialog::OnSysCommand(), DefWindowProc() gar nicht auf.
Sicher tut er das, hast du schon mal debuggt?

Um die Minimieren-Funktion abzufangen könnte die Source etwas so aussehen:

Code:
void CMyDialog::OnSysCommand(UINT nID, LPARAM lParam)
{
    switch( nID )
    {
        case SC_MINIMIZE:
            // Eigene Minimize-Behandlung
            break;
        
        // weitere case-Zweige bei Bedarf
         
        default:
            CDialog::OnSysCommand(nID, lParam);
            break;
    }
}
 
Der Klassenaisstenten(STRG+W) ist schon vorhanden, nur WM_SYSCOMMAND war über ihn nicht einzufügen.

Wenn ich den Debugger mal verstehen würde, dann würde ich es auch machen. :-(

Ich weis nicht woran das liegt, aber vielleicht kann mir das auch mal einer sagen.
Warum bin ich nicht da drauf gekommen, dass das bereits die WM_SYSCOMMAND Nachricht ist? War doch logisch..

Code:
	switch(nID)
		{

		case WM_SYSCOMMAND:

			if((w)lParam == SC_MINIMIZE)
				AfxMessageBox("TEST!");
		break;
		default: CDialog::OnSysCommand(nID, lParam);
		}

Das hatte in WindowProc() und DefWindowProc() funktioniert.
Dein Beispielcode funktioniert. Die Funktionen werden sozusgen "überschrieben".

Was ich mich frage: "Woher soll man das alles wissen?"
"Bin ich nicht intelligent genug, um Probleme solcher Art selber zu lösen?"

Also sagt es, woher wisst ihr das? =)
 
Nun ja, ich beschäftige mich schon einige Jährchen mit Windows-Programmierung. Da sammelt sich die eine oder andere Erkenntnis an.
Übrigens ohne gescheites Debugging kannst du dich eigentlich gleich erschießen. Du solltest dich damit wirklich mal intensiver beschäftigen, ist doch beim Visual Studio ganz easy.
 
Hmm, habe das Debuggen noch nie richtig gebraucht. ;)
Mal auf die Fehlermeldungen des Compilers achten und dann tut das auch schon. :)

Das mit dem Debuggen lernen muss ich mir nochmal überlegen. =)
Mal schauen ob ich es schaffe die OnSysCommnad() beim Aufruf von DefWindowProc() zu erwischen. Ist doch eine Schweinerei, dass das nicht mal im Quelltext erwähnt wird. :eek:

Vielen Dank für deine Hilfe!
 

Neue Beiträge

Zurück