Eigene Fensterklasse (like BUTTON) für CreateWindow
-
Hi all.
Ich habe mir gedacht, ich würde gerne eine Fensterklasse INFO haben, und wie bei Buttons mit CreateWindow gleich ein Fenster, mit eingetragenem Text kreirt werden.
So dass ich dann bei so welchen sachenn kein Problem habe...(viel arbeit ist als "Problem" gemeint)Vorgehen:
Fensterklasse "INFO" registrieren mit einer WNDPROC.
WNDPROC mit WM_CREATE und WM_LBUTTONUP versehen.
Beide sollen erst mal eine MessageBox anzeigen.
CreateWindow(..., "INFO",...);Nun das Problem. Die messageboxen werden nicht angezeigt.
http://nopaste.info/a708de7a4b_nl.html
Da ist so der ZUSAMMENGESCHNITTENE code.wenn ich was übersehen habe, einfach melden.
DANKE
-
Wird nur die MessageBox nicht angezeigt, oder auch das Fenster danach nicht?
Soweit ich den Code verstehe, hast Du gar keine neue Fensterklasse registriert. Wenn doch (und den Codeteil nur rausgeschnitten), überprüf mal, welchen Wert RegisterClassEx() für das neue Fenster zurückgibt.
-
bool regInfoWnd( HINSTANCE hInst ) { return regStandardWnd( hInst, "INFO", (WNDPROC)InfoProc ); }
und regStandardWnd registriert dann alles standardmäßig...
Warum ich eine einzeilerfunktion schreibe? Damit es immer INFO heißt und immmer InfoProc hat.und -erstaunlicherweise- gibt dieser abschnitt immer TRUE zurück, sonst würder er ja nie diese Zeile
printf( "No failure while creating Window, program works.\n" );
ausführen. Da ja dies regInfoWnd in der bedingung mit einem && steht, muss also true zurückkommen.
nur CreateWindow
wndInfo = CreateWindow( "INFO", "Freak", WS_VISIBLE, 0, 0, 100, 100, targetWnd, NULL, myHandleInst, NULL ); if( !wndInfo ) MessageBox( NULL, "NIO", "Fehler", MB_OK );
die Messagebox kommt lieder
also die NIO Fehler box...Nur verstehe ich das nicht, da ich ja mein MainWnd genau so erzeuge (parametervon CreateWindow)
-
GetLastError() aufrufen und schauen was der Fehlercode bedeutet.
-
Warum ich darauf nciht selber komme
1407... Cannot find window class.
Ich mein dass ist ja nicht möglich wenn ich TRUE zurückbekomme oder?
-
Du hast RegStandardWindow RegStandardWindow vorsichtshalber nicht gepostet (hab mit Deinen Codeschnippseln immer Probleme), aber das Fenster wird offenbar nicht registriert. Da scheint ein Fehler in regStandardWindow zu sein. RegisterClassEx sollte immer unmittelbar hinter der Structur der Fensterklasse stehen. Ich weiß ja nicht, wozu Du dafür noch eigene Funktion brauchst.
-
Ich erzeuge 2 Fensterklassen (verschiedene) und wollte nicht 2 mal den selben code verwenden.
RegisterClassEx steht unmittelbar nach der Struktur.
[...] wndMain.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); //smal Icon( eventually the tray-icon ) return RegisterClassEx( &wndMain ); //register the class, return the }
Ist dass nicht dicht genug... Es klappt ja auch beide male, es wird immer TRUE gemeldet.
Liegt es vielleicht daran, das ich die Selbe Instanz nutze? Inner die Instanz von der WinMain.
Weiß nicht wie ich eine neue Instanz bekomme.
-
Möglicherweise liegt es daran, daß in Unterfunktionen nur Kopieen der Variablen angelegt werden, die nach Ende der Funktion wieder ungültig sind. Wenn Du eine Fensterklasse in einer Funktion anlegst und registrierst, ist die natürlich nach Rückkehr der Funktion nicht mehr auffindbar. Darum "cannot find Window Class"...
-
Aber die "Main" klasse wird auch dort registriert, und die Läuft.?
-
Mal so gefragt: Gehört das hier:
bool regStandardWnd( HINSTANCE hInst, char *name, WNDPROC procedure ) /* This function registers a standard Window */ { WNDCLASSEX wndMain; wndMain.cbSize = sizeof(WNDCLASSEX); wndMain.style = CS_HREDRAW | CS_VREDRAW; . . .
wirklich zusammen? (sieht nämlich auf den ersten Blick nicht so aus.) Ist
bool regStandardWnd( HINSTANCE hInst, char *name, WNDPROC procedure )
der Funktionsheader von
{ WNDCLASSEX wndMain; wndMain.cbSize = sizeof(WNDCLASSEX); wndMain.style = CS_HREDRAW | CS_VREDRAW;
?
Geht die Funktion unten noch weiter?In der Funktion wird NUR wndMain regtistriert, und nix anderes. Also kann er auch nichts anderes finden.
Wenn Du mehrere Klassen registrieren willst, mußt Du die schon eigens implementieren. Schreibarbeit sparen bringt da nichts.
-
Ich nehme an du kennst funktionen...
Du kennst auch Variablen, denke ich mir...
Diese Funktion bekommt einen Fenster-klassen-namen und eine instanz und die betreffende Prozedur.
Mit dieser Funktion kann ich x tausend und abermillionen fensterklassen erzeugen.Ich muss diesen block nicht für jede zu erzeugende klasse neu schreiben.
bool regStandardWnd( HINSTANCE hInst, char *name, WNDPROC procedure )
ist nicht der funktionsheader.
bool regStandardWnd( HINSTANCE, char*, WNDPROC );
(4 zeilen drüber) ist der funktionsheader
Dazwischen ist das kommentar, was die Funktion macht (ist in unserer Firma so zu kommentieren)
Klar geht die Funktion weiter, kannste ja lesen: Zeile 12 - 41.
ps: in dieser funktion wird kein wndMain registriert.
dort wird die fensterklasse MIT HILFE von wndMain(struct WNDCLASSEX [die kann auch hans-karl-peter heißen) registriert. Der Name der Fensterklasse wird bei dem char* übergeben
Ich versuche sachen Variabel zu halten.{EDIT]habe ich gerade funktionskopf mit prototyp verwechselt *abwesend-in-himmel-schau*
-
printf( "%s\n", wndMain.lpszClassName );
myNote Error: 1407 INFO
HWA..... NEIN... ICH DUMMKOOPf... WHA...
//WENN *registrierung von der MAIN windowclass* //UND(DANACH NOCH) *kreiren und anzeigen* //UND(DANACH NOCH)registrieren der fensterklasse //alle funktionieren mache dass if( regStandardWnd( hInstance, appName, (WNDPROC)WndProc ) && createMainWindow() && regInfoWnd( hInstance ) )
Schrit 1: Registrieren Fensterklasse Main
Schrit 2: erstellen (WM_CREATE ausführen)
WM_CREATE beinhaltet das erzeugen eines Fensters mit derk lasse INFO
Schrit 3: Registrieren der Fensterklasse INFODas das nicht funktioniert ist klar...
for life...