Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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....

Geschrieben
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.

Geschrieben
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?

Geschrieben
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....

Geschrieben

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?

Geschrieben
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 :rolleyes:

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?

Geschrieben

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);

Geschrieben

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.

Geschrieben
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.

Geschrieben
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?

Geschrieben
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.
Geschrieben

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);	

Geschrieben

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?

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...