Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Neues Window in einer Funktion öffen (2. Teil)

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 <
000
06.07.2004, 12:09 Uhr
~Bokon Taylay
Gast


Hallo!

Hab' vor ein paar Tagen eine Message gepostet in der ich ein Problem mit der Erstellung eines Windows in einer Funktion beschrieben habe. Ich habe dabei leider ein paar Fehler beim Pasten (ja, traurig aber wahr!!) gemacht, was das Ganze natürlich schwer verständlich genacht hat. Außerdem habe ich inzwischen ein paar schlechte Programmteile verbessert.


OK, nochmal zum (neuen/alten) Problem:

In einer DLL, die von einer Applikation, auf deren Source Code ich keinen Zugriff habe, geladen wird, muss ich innerhalb einer Funktion ein neues Fenster generieren, dass Daten anzeigt.



C++:
void ShowData(BYTE sDataBuffer[], int iLength, UINT sStaAd)

{
    CDataWnd dataWnd;
    if (dataWnd.CreateNewWnd(sDataBuffer, iLength) )
     {
         // Print Message, do stuff        
     }
    
}  




Die Klassen sind wie folgt definiert;


C++:

CDataWnd::CDataWnd()
{
   itsLength = 0;
   itsBuffer = NULL;
}


/* Destructor */

CDataWnd::~CDataWnd()
{
    
}


/* Window Creation */

int CDataWnd::CreateNewWnd(BYTE * buffer, int length)
{
     int quit;
      
     itsLength = length;
     itsBuffer = buffer;
    
     quit = Create(NULL, "Data", WS_VISIBLE|WS_OVERLAPPEDWINDOW, CRect(0,0,500,500));
    
     if (!quit)
    {
        return (1);
    }

    UpdateWindow();
    return(0);
}


/* OnCreate Function */

int CDataWnd::OnCreate(LPCREATESTRUCT lpcs)
{
    if (CWnd::OnCreate(lpcs) == -1)
        return (-1);
    return (0);
}


/* OnPaint Function */

void CDataWnd::OnPaint()
{
     ...
     CString sDataline;
     CRect rect;
     GetClientRect(&rect);
    // Fill the String with data
    
    dc.DrawText(sDataline, &rect ,DT_LEFT );
   ...
}  



Ok, so weit so gut. Wenn ich dann das Programm starte, wird das Fenster kurz angezeigt und verschwindet wieder. na ja, das ist ja, weil die Funktion ShowData() wieder zurückkehrt und das (lokale) Fenster die Gültigkeit verliert. Wenn ich das ganze mit new mache, bleibt das Fenster stehen, aber nach der Rückkehr hab' ich eine Access Violation (wenn ich wie beschrieben z.B. mit dem Cursor drauffahre)

Was ich nun gerne machen würde ist, dass das Fenster gezeigt wird, bis es vom User geschlossen wird oder dass es auch noch nach der Rückkehr der Funktion ShowData() gültig bleibt und keine Violations verursacht.

Bei Dialogen gibt's dafür ja eine DoModal() Funktion, kann man die auch für durch Create erzeugte Fenster verwenden bzw. gibt's was Ähnliches.

Danke für eure Hilfe schon mal im voraus!


BT
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.07.2004, 13:38 Uhr
~Bokon Taylay
Gast


Bin inzwischen draufgekommen, dass ich unbedingt eine Lösung brauche, die dafür sorgt, dass das Window geschlossen werden muss (vom User), bevor die Funktion zurückkehrt.

BT
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.07.2004, 13:43 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


dataWnd darf keine Variable aus dem block ShowData sein... sonst wird die ja wieder vom stack gekickt wenn die methode durch ist...
also z.b. ein pointer nehmen und mit new allokieren und dann mit delete wieder killen wenn der user das fenster schliessen will...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.07.2004, 14:10 Uhr
~Bokon Taylay
Gast


Ich MUSS das Fenster erst durch den User schließen lassen, bevor ShowData() zurückkehrt, denn wenn die Funktion zurückkehrt, dann kehrt schließlich die ganze DLL zurück (in die Applikation, auf die ich keinen Zugriff habe) und keine der Daten ist mehr gültig. D.H. ich muss irgendwie das Fenster 'Modal machen' und nach dem Schließen darf erst ShowData() und schließlich die DLL zurückkehren. Aber wie mach ich das mit dem 'Modal machen'???????
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.07.2004, 17:15 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


mit DoModal() würd ich spontan sagen
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.07.2004, 17:17 Uhr
~Bokon Taylay
Gast


Hab' ich schon probiert. DoModal() wird nicht von CFrameWnd unterstützt:-(
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.07.2004, 17:22 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


du könntest ein bit setzen das der andere dialog geöffnet ist und immer wenn du auf den alten klicken/zugreifen willst wird automatisch der ander in den vordergrund geschmissen wenn der Pseudo-Modale geöffnet ist
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.07.2004, 17:27 Uhr
~Bokon Taylay
Gast


Hab' da gerade ein Funktionspaar BeginModalState/EndModalState in der CFrameWnd Klasse gefunden, werd' das mal ausprobieren......
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.07.2004, 17:41 Uhr
~Bokon Taylay
Gast


Irgendwie hat das nicht den gewünschten Effekt..vielleicht verwende ich es ja falsch...mhhhmmm
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: