Nachrichten zwischen Dialogen (SDI-Exploreransicht)

sTEk

Erfahrenes Mitglied
Nach vielen gescheiterten Versuchen und dem Gefühl, dass anscheinend noch niemand das Problem hatte, richte ich mich mal wieder an Euch.


Ich habe eine SDI-Anwendung im Projektformat "Windows Explorer" erstellt. Der linke Dialog ist dabei CTreeView und der rechte CFormView.

Nun habe ich das Problem, dass beim Klicken einen der implementierten Punkte im Tree eine Message zum rechten Dialog schicken möchte, damit ich in diesem wiederum die entsprechenden Dialoge öffnen kann (letzteres hab ich bereits rausbekommen).
Leider stürzt mir mein Programm jedesmal mit einem Debug_Assertion_Failed ab, wenn ich ein SendMessage in meinem linken View (vom Assistenten passen CLeftView genannt) nach folgendem Code versuche:

Code:
    COberfl2View Dlg;   //der rechte Dialog
    Dlg.SendMessage(WM_MYMESSAGE,0,0);

In COberfl2View klappt WM_MYMESSAGE richtig - habe das schon probiert.

Leider habe ich keine Ahnung, wie ich einen Handle auf den Dialog sonst herausbekommen kann, da mir nicht klar ist, wie ich dem rechten Dialog eine eigene WINDOWS-Klasse geben kann damit ich FindWindow() nutzen kann.

Der Zugriff über
Code:
dlg.m_VariableX
funktioniert leider auch nicht wirklich, das Programm stürzt zwar nicht ab, zeigt aber nicht den darin hinterlegten Variableninhalt an, nur ein 0xcccccccc, was mir zeigt, dass er auf einen "leeren" Bereich zugreift.

Wo liegt mein Denkfehler?
 
Damit
C++:
COberfl2View Dlg;   //der rechte Dialog
erzeugst du eine neue Instanz der betreffenden Klasse, in nichts mit dem existierenden rechten View zu tun hat und obendrein auch noch nicht richtig initialisiert ist. Daher die Abstürze.

Hole dir mit AfxGetMainWnd() (Achtung, die das zurückegegebene CWnd muss auf deine Frame-Klasse gecastet werden) das Frame-Window. Wenn du das Frame-Window hast, hast du Zugriff auf Splitter-Window, das deinen rechten und linken View trägt. Über das Splitter-Window schließlich kannst du mit GetPane() den jeweiligen View bekommen. Mit SendMessage brauchst nicht unbedingt arbeiten, ist aber möglich, wenn du das Fensterhandle des Views ermittelt hast.

Gruß
MCoder
 
Ich danke Dir! :)

Falls wieder mal jemand das Problem hat:

Code:
MainFrm.h
...
// Attribute
protected:
	
public:
	CMainFrame();
	CSplitterWnd m_wndSplitter;
...
________________________________________________________-

MainFrm.cpp
...
    CWnd* FrameDialog = AfxGetMainWnd();
    CMainFrame *View = (CMainFrame*)FrameDialog;
     
    m_DialogLeft=View->m_wndSplitter.GetPane(0,0);
    m_DialogRight=View->m_wndSplitter.GetPane(0,1);
...
 
Zuletzt bearbeitet:
Zurück