CDialog Funktion aus externer Klasse aufrufen

gyrosundmaronen

Grünschnabel
Tach zusammen..

Ich hab eine Dialogklasse die bestimmte Filme abspielen soll. Welche Filme der Dialog abspielen soll, wird ihm über TCP/IP mitgeteilt.
Dazu wird ein Protokoll ausgewertet, die Kommandos extrahiert und an eine Klasse "CActionControl" geschickt die dann die Kommandos auswertet und an den Dialog "CVisualDlg" weiterleitet.
Wenn ich jetzt versuche in der Klasse CActionControl ein Object von CVisualDlg anzulegen, springt er sofort in den Konstruktor von CVisualDlg
Objekt bilden in CActionControl:
Code:
#include "VisualDlg.h"

void CActionControl::givingCommand(int c_id,int LF,int OL,char VF[128])
{

     CVisualDlg m_visual;

    m_visual.DoCommand(c_id);
}
In DoCommand werden diverse Timer aufgerufen die verschiedene Videos starten.
Konstruktor der Klasse CVisualDlg:
Code:
CVisualDlg::CVisualDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CVisualDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CVisualDlg)
    // HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein
    //}}AFX_DATA_INIT
    // Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf  //benötigt

    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}
Dort wird irgendwie ein neuer Wert(0x00000000) für CWnd gebildet {CVisualDlg hWnd = ?}. Das Problem ist jetzt das der Eventloop für meinen Timer nicht mehr funktioniert. Jedes mal wenn ein Timer gestartet oder zerstört wird kommt eine Fehlermeldung: Debug Assertion Failed
File:afxwin2.inl Line:171

Ich glaube mal das er die Timer events nicht mehr an das richtige Window schickt oder nicht mehr auf die Klasse CVisualDlg zugreifen kann. Der Dialog wurde schon erzeugt. Ich möchte jetzt über die Funktion DoCommand einen neuen Film starten. Diese Filme werden über ein ActiveX-Steuerelement gestartet. Also ich möchte den Dialog nicht noch einmal starten. Die Funktionialität ist die gleiche, als wenn ich ein Label über eine Externe Klasse mit Text füllen möchte. Der Dialog existiert schon ich möchte nur auf das Steuerelement zugreifen.

Kann mir jemand sagen woran das liegt oder gibt es noch eine andere Möglichkeit
im Dialog Funktionen aufzurufen.
Danke schon mal im voraus!

Beste Grüsse

gyros
 
Hallo,

mit der Zeile
C++:
CVisualDlg m_visual;
wird immer wieder eine neue Instanz der Klasse "CVisualDlg" angelegt, was vermutlich nicht deine Absicht ist. Da an der Stelle auch ein "DoModal()" oder "ShowWindow()" zum Anzeigen des Fensters fehlt, ist natürlich der CWnd-Member immer Null und alle Kommandos, die auf das Fenstrer zugreifen, führen zu einem Absturz.

Du solltest "CVisualDlg" daher nur einmal in einer zentralen Klasse (z.B. in der Applikationsklasse, hängt aber von der Struktur deiner Anwendung ab) instanzieren und dann über diese Klasse auf den CVisualDlg-Member zugreifen.

Gruß
MCoder
 
Zurück