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 INFO

    Das das nicht funktioniert ist klar... 🤡

    🕶 for life...


Anmelden zum Antworten