Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Aktive View in MFC-DLL bestimmen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
13.08.2004, 10:26 Uhr
~Dirk
Gast


Hi,

ich habe eine MFC-DLL. Diese wird von einer MFC MDI-Anwendung eingebunden. Innerhalb meiner MFC-DLL möchte ich die aktive View der Anwendung bestimmen.


Code:
CMDIFrameWnd* pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
CMDIChildWnd* pChild = (CMDIChildWnd*)pFrame->GetActiveFrame();
//hier kracht es
CView* pView = pChild->GetActiveView();



Allerdings klappt es nicht. Was mache ich falsch?

Für Hilfe wäre ich sehr dankbar. Vielen Dank schonmal im Voraus.

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.08.2004, 12:33 Uhr
~mike
Gast


Hi!
Was kommt bei

C++:
CMDIFrameWnd* pFrame = (CMDIFrameWnd*)AfxGetMainWnd();
CMDIChildWnd* pChild = (CMDIChildWnd*)pFrame->MDIGetActive();
CView* pView = pChild->GetActiveView();



mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.08.2004, 20:15 Uhr
~Dirk
Gast


Hi Mike,

vielen Dank für deine Antwort. Leider klappt es auch nicht. Allerdings ist es schon etwas besser. Für pFrame kommt laut Debugger ein vernünftiger Wert raus. pChild hat allerdings den Wert 0x0000000. Deshalb stürzt es erst eine Zeile später ab, da dann versucht wird mit einem ungültigen pChild die aktive View zu bestimmen.

Hoffentlich gibt es eine Lösung.

Gruß

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.08.2004, 22:48 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Hmm. Du kannst versuchen den this zeiger des CMDIChildWnd an eine DLL Funktion zu übergeben. Ansonsten fällt mir leider nichts mehr ein. Ich habe immer die ganze View Klasse in eine DLL gegeben und hatte damit eigentlich nie Probleme

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.08.2004, 23:16 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das problem gabs schonmal, da muss man sich das Child über ein HWND und "FromHandle" holen, dann sollte es gehen. Diese *GetActive usw Funktionen funktionieren meist nicht korrekt wenn man auf Variablen von "außerhalb" zugreift
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.08.2004, 16:44 Uhr
~Dirk
Gast


Hi,

bei FromHandle benötige ich allerdings schon das Handle des Childs. Und woher bekomme ich es?

mfg

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.08.2004, 12:00 Uhr
~mike
Gast


Hi!
Ich hab folgendes in ner DLL

C++:
    if(!::GetAsyncKeyState(VK_RETURN)){
        CWnd* pWnd = GetParent();
        UpdateData(TRUE);

        CMDIFrameWnd* pMainWnd = (CMDIFrameWnd*)AfxGetMainWnd();    
        CMDIChildWnd* pChild = (CMDIChildWnd*)pMainWnd->MDIGetActive();
        ((CWordChildFrame*)pChild)->m_bSelect = false;
        ((CPartView*)m_pChildView)->AddArtikel(...);
            
        CDialog::OnOK();
    }


Das funktioniert bei mir Problemlos. pChildView wird aus der exe übergeben

Das Child kann man sich imho wie folgt holen

C++:
CMDIFrameWnd* pMainWnd = (CMDIFrameWnd*)AfxGetMainWnd();    
CMDIChildWnd* pChild = (CMDIChildWnd*)pMainWnd->MDIGetActive();

CWnd* pWnd = pChild->GetWindow(GW_CHILD)


Aber da ist man wieder beim gleichen Problem.

mfg
PS: pChild ist bei mir in beiden Fällen nicht NULL

Dieser Post wurde am 15.08.2004 um 12:07 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.08.2004, 08:59 Uhr
~Dirk
Gast


Hi Mike,

vielen Dank für deine Antwort. Leider verstehe ich es nicht ganz. Warum ist man wieder beim gleichen Problem? Klappt das Holen des Childs nicht?
Ich wüsste inzwischen eine Möglichkeit, dass meine DLL immer das HWND der gerade aktiven View enthält.
Weisst du dann eine Lösung?

Vielen Dank für deinen Einsatz. Find ich echt super, dass du dir so viel Zeit nimmst, um mir weiterzuhelfen.

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.08.2004, 10:41 Uhr
~mike
Gast


Hi Dirk!
Ich helfe doch gerne
Ich bekomme bei mir einen gültigen Child Pointer. Mit nem HWND bekommst du ein CWnd
CWnd *pWnd = CWnd::FromHandle(hWnd);
Wenn du das wnd hast könntets du versuchen mit GetActiveView den View Pointer zu holen.
Ich habs bei mir einwenig anders gemacht: ich hab in der exe eine Funktion angelegt die mir den aktuellen View zurückliefert. Diese habe ich (wie oben im Src gezeigt) in der DLL aufgerufen. Klappt wunderbar.

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.08.2004, 11:08 Uhr
~Dirk
Gast


Hi,

noch ein paar Fragen dazu.
Wie kann ich mit einem pWnd die GetActiveView Funktion aufrufen? Diese gibt es doch in der CWnd-Klasse gar nicht.
Mit der Funktion, die dir die aktuelle View zurückliefert. Meinst du damit diesen Code?


Code:
CMDIFrameWnd* pMainWnd = (CMDIFrameWnd*)AfxGetMainWnd();    
CMDIChildWnd* pChild = (CMDIChildWnd*)pMainWnd->MDIGetActive();

CWnd* pWnd = pChild->GetWindow(GW_CHILD);



Denn im oberen Codeblock sehe ich nirgends einen Aufruf einer Funktion aus der exe. Denn dort scheint dies bereits vorher geschehen zu sein, da m_pChildView bereits gesetzt ist.

Danke schonmal

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: