Thread soll Mainframe Methoden aufrufen

Hallo zusammen,

Ich habe eine kleine MFC Applikation in der ein Thread gestartet wird, der wiederum im ursprünglichen gestarteten Fenster (CMainFrame) eine Methode aufrufen soll. Irgendwie schaffe ich es nicht exakt dieses Objekt wieder zu bekommen.
Wie schaffe ich es eine Änderung genau an diesem CMainFrame vorzunehmen der nach dem initialisieren der Anwendung aufgerufen wurde?

Grüße
 
Der Gag ist, dass bei MFC vom MainFrame zwar ein Pointer auf das CWnd* (m_pMainWnd) in der App aufbewahrt wird, aber eben nicht auf deine davon abgeleitete Klasse.
Also baue einfach selbst in der App eine neue Membervariable von deinem MainFrame-Typ und an der Stelle in CWinApp::InitInstance, wo der MainFrame erzeugt wird, setze den Pointer da drauf. Dann kannst du immer mit theApp.m_pMeinMainFrame auf die Funktionen zugreifen.

In der xxxapp.h also:

class CMeineApp
{

...

CMeinMainFrame* m_pMainFrame;

...

}

in der InitInstance:

// vorher:
m_pMainWnd = new CMainFrame

// jetzt neu:
m_pMeinMainFrame = new CMainFrame
m_pMainWnd = m_pMeinMainFrame;
 
(Achtung Dummiealarm)

Danke erstmal für deine schnelle Antwort. Aber leider konnte ich in keiner der Klassen etwas wie
Code:
new CMainFrame
finden.

Meine Vermutung ist das sich die Sache irgendwo hier:

Code:
pDocTemplate = new BsDocTemplate(

IDR_MAINFRAME,

RUNTIME_CLASS(CMFCStartUpDoc),

RUNTIME_CLASS(CMainFrame), // main SDI frame window

RUNTIME_CLASS(CMFCStartUpView));

AddDocTemplate(pDocTemplate);

aber dort kann ich nur Klassennamen angeben und keine Objekte hineintun.


Grüße

-------------------------------------------------------------------------------------------------------------
Solche Fragen kommen zustande wenn man nur Java lernt.
 
Das sollte eigentlich direkt unter dem Template-Erzeugen und den AddDocTemplate-Aufrufen stehen. Post mal einfach die komplette InitInstance aus deiner CxxxApp (mit Source-Tags bitte). Muss da drin sein, wenn du SDI oder MDI gewählt hast.
 
Code:
BOOL CMFCStartUpApp::InitInstance()

{

AfxEnableControlContainer();

// Standard initialization

// If you are not using these features and wish to reduce the size

// of your final executable, you should remove from the following

// the specific initialization routines you do not need.

#ifdef _AFXDLL

//Enable3dControls(); // Call this when using MFC in a shared DLL

#else

//Enable3dControlsStatic(); // Call this when linking to MFC statically

#endif

// Change the registry key under which our settings are stored.

// TODO: You should modify this string to be something appropriate

// such as the name of your company or organization.

SetRegistryKey(_T("Local AppWizard-Generated Applications"));

LoadStdProfileSettings(); // Load standard INI file options (including MRU)

// Register the application's document templates. Document templates

// serve as the connection between documents, frame windows and views.

// CSingleDocTemplate* pDocTemplate;

BsDocTemplate* pDocTemplate;

// The standard MFC DocTemplate has an error.

// As result there is impossible to start hiding program

// without flipping.

// pDocTemplate = new CSingleDocTemplate(

pDocTemplate = new BsDocTemplate(

IDR_MAINFRAME,

RUNTIME_CLASS(CMFCStartUpDoc),

RUNTIME_CLASS(CMainFrame), // main SDI frame window

RUNTIME_CLASS(CMFCStartUpView));

AddDocTemplate(pDocTemplate);

// Parse command line for standard shell commands, DDE, file open

CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

// Dispatch commands specified on the command line

if (!ProcessShellCommand(cmdInfo))

return FALSE;

// The one and only window has been initialized, so show and update it.

// m_pMainWnd->ShowWindow(SW_SHOW);

// m_pMainWnd->UpdateWindow();



m_pMainWnd->ShowWindow(SW_HIDE);

return TRUE;

}
Ich hoffe, dass das ist was sie gemeint haben. Grüße
 
Oh, da hat aber einer fleissig umgebaut. Dieses m_pMainWnd ganz unten, das dürfte der Pointer auf dein Mainframe sein. Allerdings wird der in der Methode hier tatsächlich nicht erzeugt.

Such mal danach, irgendwo muss der ja zugewiesen werden, an der Stelle solltest du auch dann deinen Pointer darauf setzen können.

Alternativ kannst du guten Glaubens einfach davon ausgehen, dass das dein MainFrame ist, und den wieder hoch-casten:

m_pMeinMainFrame = (CMainFrame*)m_pMainWnd;
 
*frust**frust**frust**frust**frust**frust**frust**frust**frust**frust**frust**frust*

Wie kann ich denn dann wieder von dem Thread auf den
m_pMeinMainFrame
zugreifen.

Gruß
 
Zurück