Filou Geschrieben 3. Mai 2005 Geschrieben 3. Mai 2005 Kann mir jemand bei der Funktion CreateWindow helfen? Mit den letzten beiden Parametern kann ich nix anfangen: HINSTANCE hInstance, LPVOID lpParam Aber ich bin mir bei dem ganzen nicht so sicher... ich habs jetzt so gemacht: CNachricht wnd; CreateWindow(RegisterClassEx(wnd), IDD_DIALOG1, WS_POPUPWINDOW, 100,100,100,100, this,NULL,,*this); AnimateWindow(wnd,2000,AW_BLEND); Worauf ich rauswill ist die Funktion Animate Window. Ich hoffe, die funktioniert so.... Zitieren
Guybrush Threepwood Geschrieben 3. Mai 2005 Geschrieben 3. Mai 2005 Nein das kannst du so nicht machen. Was ist denn CNachricht und worauf zeigt this? Wenn du einen DIalog aus dem Resourceneditor darstellen willst (IDD_DIALOG1) dann musst du CreateDialog nehmen. Zitieren
Filou Geschrieben 3. Mai 2005 Autor Geschrieben 3. Mai 2005 Nein das kannst du so nicht machen. Was ist denn CNachricht und worauf zeigt this? Wenn du einen DIalog aus dem Resourceneditor darstellen willst (IDD_DIALOG1) dann musst du CreateDialog nehmen. CNachricht ist eine Klasse von CDialog. Und this ist die klasse des aktuellen Dialogs von dem aus der andere aufgerufen werden soll.... Kannst Du mir das hier auch ein bissel näher erklären? hInstance [in] Handle to the module whose executable file contains the dialog box template. lpTemplate [in]Specifies the dialog box template. This parameter is either the pointer to a null-terminated character string that specifies the name of the dialog box template or an integer value that specifies the resource identifier of the dialog box template. If the parameter specifies a resource identifier, its high-order word must be zero and its low-order word must contain the identifier. You can use the MAKEINTRESOURCE macro to create this value. hWndParent [in] Handle to the window that owns the dialog box. lpDialogFunc [in] Pointer to the dialog box procedure. For more information about the dialog box procedure, see DialogProc. Zitieren
Guybrush Threepwood Geschrieben 3. Mai 2005 Geschrieben 3. Mai 2005 CNachricht ist eine Klasse von CDialog. Und this ist die klasse des aktuellen Dialogs von dem aus der andere aufgerufen werden soll.... Hab ich mir gedacht. Heißt das das du die MFC benutzt? Wenn ja ist das eh der komplett falsche Weg. Warum benutzt du nicht den Assistenten um einen neuen Dialog anzulegen? Zitieren
Filou Geschrieben 3. Mai 2005 Autor Geschrieben 3. Mai 2005 Hab ich mir gedacht. Heißt das das du die MFC benutzt? Wenn ja ist das eh der komplett falsche Weg. Warum benutzt du nicht den Assistenten um einen neuen Dialog anzulegen? Ich habe einen neuen Dialog mit dem Assistenten angelegt. Und normalerweise würde ich ihn einfach mit DoModal aufrufen. Aber ich möchte ein Benachrichtigungsfenster mit diesem AnimateWindow einblenden lassen. Und ich weiß nicht genau wie ich das mache. Der Compiler zeigt mir zwar keine Fehlermeldung bei diesem Aufruf: CNachricht wnd; AnimateWindow(wnd,2000,AW_BLEND); Aber funktioniern tut es auch nicht. Also dachte ich, ich muss erst die Klasse des Fensters "öffnen" um sie dann einblenden zu lassen.... Zitieren
Guybrush Threepwood Geschrieben 3. Mai 2005 Geschrieben 3. Mai 2005 Hast du den in CNachricht einen Operator der in diesem Fall das Handle des Fensters zurückliefert? und warum benutzt du nicht einfach die Memberfunktion AnimateWindow von CWnd anstatt direkt über die Windows API zu gehen? Zitieren
bigpoint Geschrieben 3. Mai 2005 Geschrieben 3. Mai 2005 und was liefert die Funktion AnimateWindow zurück ? Zitieren
Filou Geschrieben 3. Mai 2005 Autor Geschrieben 3. Mai 2005 Die Klasse CNachricht hat keine Memberfunktion AnimateWindow. Und der Rückabewert ist bool: Return Value:Nonzero if the function succeeds; otherwise 0. Aber das ist ja auch wurscht, oder? Ich weiß selber nicht genau wie ich das Animieren soll. Ich denke nur, ich muss den Dialog doch erst erstellen, bevor ich ihn animieren und einblenden kann. Also muss ich doch irgendwie den Dialog starten. Und das halt nicht mit DoModal. Habt ihr denn eine Idee, wie ich das machen könnte? Wie öffne ich denn ein Dialogfeld, dass nicht modal ist? Zitieren
Guybrush Threepwood Geschrieben 3. Mai 2005 Geschrieben 3. Mai 2005 Wenn CNachricht wirklich von Cdialog abgeleitet ist dann hat es auch diese Memberfunktion. Außerdem wollte bigpoint nicht wissen was in der doku zu AnimateWindow steht sondern was es in deinem Fall zurückliefert Zitieren
Filou Geschrieben 4. Mai 2005 Autor Geschrieben 4. Mai 2005 Wenn CNachricht wirklich von Cdialog abgeleitet ist dann hat es auch diese Memberfunktion. Außerdem wollte bigpoint nicht wissen was in der doku zu AnimateWindow steht sondern was es in deinem Fall zurückliefert Sorry, hab ich wohl falsch verstanden. Ich habe es jetzt so gemacht: CNachricht wnd; HINSTANCE hInst; CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), wnd, NULL); bool test = AnimateWindow(wnd,2000,AW_BLEND); und AnimateWibndow gibt eine 0 zurück. Das heißt dann ja dass es geklappt haben sollte. aber ich sehe den Dialog trozdem nicht :-( PS: CNachricht ist die Klase zu meinem Dialog IDD_DIALOG1 und das Obejkt wnd hat die Funktion AnimateWindow wirklich nicht. Compiler sagt: 'AnimateWindow' : Ist kein Element von 'CNachricht' Aber es muss doch auch so gehen, wie ich es oben gemacht habe, oder? Zitieren
Filou Geschrieben 4. Mai 2005 Autor Geschrieben 4. Mai 2005 Ich erhalte aber noch die Warnung: Lokale Variable 'hInst' wurde ohne Initialisierung verwendet Was muss da denn rein? UND wenn ich wnd.ShowWindow(SW_SHOW); aufrufe, dann stürzt das programm ab und zwar hier, in der Datei WINOCC.CPP: BOOL CWnd::ShowWindow(int nCmdShow) { ASSERT(::IsWindow(m_hWnd)); if (m_pCtrlSite == NULL) return ::ShowWindow(m_hWnd, nCmdShow); else return m_pCtrlSite->ShowWindow(nCmdShow); Zitieren
Klotzkopp Geschrieben 4. Mai 2005 Geschrieben 4. Mai 2005 Das Problem ist, dass man eigentlich den Aufruf von ShowWindow durch AnimateWindow ersetzen muss. Der Aufruf von ShowWindow steckt aber tief in den Eingeweiden der MFC, da kommt man nicht ran. Außerdem darf das Fenster nicht sichtbar sein, wenn man es mit Animation einblenden will. MFC-Dialoge sind aber immer zu Beginn sichtbar, daran kann man nur mit einem Trick etwas ändern. Man fügt der Dialogklasse einen bool-Member hinzu, den man im Konstruktor auf false setzt. Dann erstellt man eine Nachrichtenbehandlungsfunktion für WM_WINDOWPOSCHANGING, die hießt dann CEgalDlg::OnWindowPosChanging. Da drin entfernt man das Flag SWP_SHOWWINDOW aus lpwndpos->flags, falls der bool-Member nicht true ist, und ruft dann erst CDialog::OnWindowPosChanging auf. In OnInitDialog erzeugt man dann einen möglichst kurzen Timer, und fügt dem Dialog eine Nachrichtenbehandlungsfunktion für WM_TIMER hinzu. In OnTimer stoppt man den Timer, setzt den bool-Member auf true und ruft AnimateWindow auf. Zitieren
Filou Geschrieben 4. Mai 2005 Autor Geschrieben 4. Mai 2005 Oh mein Gott.... :confused: Ich werds versuchen! Danke Dir!!! Zitieren
Guybrush Threepwood Geschrieben 4. Mai 2005 Geschrieben 4. Mai 2005 Wenn das mit der MFC aber nur über so einen Umweg geht wofür hat dann CWnd die Memberfunktion AnimateWindow? Zitieren
Klotzkopp Geschrieben 4. Mai 2005 Geschrieben 4. Mai 2005 Wenn das mit der MFC aber nur über so einen Umweg geht wofür hat dann CWnd die Memberfunktion AnimateWindow? Den Umweg hast du nur bei modalen Dialogen. Wenn du deine Fenster mit CWnd::Create dynamisch erzeugst, musst du dich selbst ums Sichtbarmachen kümmern. Aber dafür hast du dann auch die Möglichkeit, das ganz einfach zu animieren. Zitieren
Filou Geschrieben 4. Mai 2005 Autor Geschrieben 4. Mai 2005 Den Umweg hast du nur bei modalen Dialogen. Wenn du deine Fenster mit CWnd::Create dynamisch erzeugst, musst du dich selbst ums Sichtbarmachen kümmern. Aber dafür hast du dann auch die Möglichkeit, das ganz einfach zu animieren. Wie ist es einfacher? Wie würdest Du es machen? Zitieren
Klotzkopp Geschrieben 4. Mai 2005 Geschrieben 4. Mai 2005 Wie ist es einfacher? Wie würdest Du es machen?Das Fenster wäre einfacher zu animieren, wenn es kein modaler Dialog wäre. Allerdings wäre es erheblich aufwändiger, dein Programm auf etwas anderes als einen modalen Dialog umzustellen, als die Änderungen zu machen, die ich oben beschrieben habe. Zitieren
Filou Geschrieben 4. Mai 2005 Autor Geschrieben 4. Mai 2005 Also ich habe es jetzt hinbekommen, dass es das Fenster Anzeigt, aber es wird nicht eingeblendet, es erscheint einfach: CNachricht wnd; HINSTANCE hInst; HWND hWnd; hInst = GetModuleHandle(NULL); hWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), *this, NULL); AnimateWindow(hWnd,100000, AW_HOR_NEGATIVE || AW_SLIDE); Zitieren
Klotzkopp Geschrieben 4. Mai 2005 Geschrieben 4. Mai 2005 Hast du denn alles gemacht, was ich geschrieben habe? Zitieren
Klotzkopp Geschrieben 4. Mai 2005 Geschrieben 4. Mai 2005 Zu deiner Frage: Es ist richtig, dass der Dialog einfach erscheint. CreateDialog ruft ShowWindow auf. Damit ist der Dialog sichtbar. Danach kannst du den Dialog nur noch animiert ausblenden. Willst du jetzt eigentlich einen modalen oder einen nichtmodalen Dialog? Zitieren
Filou Geschrieben 9. Mai 2005 Autor Geschrieben 9. Mai 2005 Habs hinbekommen. Habe das Häkchen "Sichtbar" bei den Dialogeigenschaften rausgemacht. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.