[Gelöst] Gui-Udf

  • Hallo ich hab folgende Probleme:
    1. in der GUI-Proc kommt es nichts bis MessageBox 1 (ins if)
    2. Wenn ich gui[0] angebe klappt es, aber Windows sagt keine Rückmeldung, aber die proc wird ja aufgerufen!?

    Wär schön wenn ihr mir helfen könnt, danke.

    Spoiler anzeigen

    7 Mal editiert, zuletzt von TheShadowAE (3. Januar 2011 um 16:02)

  • @Mattthias ich würde es aber gerne selber machen, um mehr Übung zu kriegen und es leichter modifizieren zu können.

    Greenhorn Mein Hauptproblem ist ja das mit dem GUI-Classarray, dass es nicht klappt das Element im Ifblock zu setzen, trotzdem danke, ich werde das mit der Rückmeldung hoffentlich damit hinkriegen

    EDIT: Ich glaube das hängt alles mit der fehlenden HINSTANCE zusammen

  • Hi,

    ich glaube es liegt eher daran, dass bei der Erstellung des GUI-Arrays das Element "hwnd" nicht initialisiert wird,
    sprich dieses durch evtl. Speicherreste x-beliebige Werte annehmen kann, wodurch die Abfrage dieses zu unerwartenden Fehlern
    führen kann und dass du nach der for-Schleife, in
    GUICreate(), nicht "ngui" prüfst ob dieses einen Wert zugewiesen bekommen hat.
    Sprich folgende Codezeilen würde umändern/hinzufügen:

    Code
    GUI(void) {this->hwnd = NULL;};


    Als Basis-Konstruktor der Klasse "GUI". Natürlich muss dieser "public" sein.

    Zitat


    GUI *ngui = NULL;


    Bei Zeile 43, nur um sicher zu gehen, dass später alles richtig läuft, liegt ein Fehler beim Zuweisen des Variable "ngui" vor bemerkst du es dann gleich,
    da das Schreiben in einen NULL-Zeiger zu einem sofortigen Fehler führt.


    Zitat


    if(!ngui) {return NULL; }


    Zusätzlich hinzufügen zwischen Zeile 50 und 51.

    Und zu guter Letzt:

    Zitat


    if(g) {
    MessageBox(0, "GUI wurde erstellt!", "Info", MB_OK | MB_ICONINFORMATION);
    } else {
    MessageBox(0, "GUI-Erstellung fehlgeschlagen", "Info", MB_OK | MB_ICONWARNING);
    }


    Zwischen Zeile 159 und 160 hinzufügen.

  • Ah super danke es funktioniert! Jetzt ist nur noch das Problem mit dem "Keine Rückmeldung". Dagegen sollte doch eigentlich das DefWindowProc "ankämpfen" oder? Kann es sein, dass man eine WinMain braucht?

    EDIT:
    WinMain brauch man mit dem Standardbeispiel jedenfalls nicht, also daran liegt es nicht. Ich verstehe aber wirklich nicht was da jetzt noch falsch ist. Ich seh kein Unterschied zu den ganzen anderen GUIbeispielen aus C++

    Einmal editiert, zuletzt von TheShadowAE (3. Dezember 2010 um 21:36)

  • Nach ca. 5s mit Maus und Sanduhr kann man auf das Fenster klicken und der Hitnergrund wird weiß und das keine Rückmeldung ist da, dann ist nur über dem fenster nur eine Sanduhr (wenn die Maus auf dem Fenster ist natürlich nur). Ich hab WinXP prof x86

  • Okay, danke dir.
    Das Problem liegt daran, dass GetMessage() die Nachrichten aus dem Message-Queue, des Threads holt, der auch das Fenster erstellt hat.
    In deinem Fall der main-"Thread".
    Als Lösung fällt mir zurzeit nur ein, dass du deinen _Handler-Thread so erweiterst, dass dieser immer wieder eine Variable testet und schaut ob diese "true" oder sonstiges ist,
    und gegenfalls ein neues Fenster erstellt, usw.
    Kann man beliebig verändern/erweitern.

  • So, das ist auch beseitigt, einfach PeekMessage statt GetMessage. Aber jetzt reagiert das Fenster nicht auf irgendwas, aber es kommt auch kein "Keine Rückmeldung". Was muss ich machen, damit man das Fenster z.B. bewegen und aktivieren kann, ich dachte das macht die DefWindowProc?

    Die geänderte Funktion sieht übrigens jetzt so aus:

    Spoiler anzeigen

    EDIT:
    Schon wieder nur Kleinsch**ß, der letzte Parameter von PeekMessage muss PM_REMOVE sein

    Einmal editiert, zuletzt von TheShadowAE (11. Dezember 2010 um 12:21)

  • Nächster komischer Fehler:
    Mit einer GUI funktioniert alles super! Jetzt wollte ich aber erstmal manuell einen Button dadrauf erstellen, leider wird das WM_CLOSE dann nicht mehr ignoriert (?() und der Button ist entweder nicht sichtbar (trotz WS_VISIBLE) oder wird garnicht erstellt. Ich hoffe ihr könnt mir helfen, danke

    EDIT: Wenn ich 2 GUIs mache ohne Buttons, wird das Close auch nur bei der 2. GUI geblockt, warum? Hat es wieder etwas mit PeekMessage oder so ähnlich zu tun?

  • Hi,
    sry, dass ich mich erst jetzt wieder melde.

    Mach aus der Funktion:

    Spoiler anzeigen


    Diese hier:

    Spoiler anzeigen

    Solllte dann funktionieren.

  • Hm, funktioniert immernoch nicht, aber wozu ist das Sleep(INFINITE), nach der Schleife ist Funktionsende, es wird gewartet bis die Funktion fertig ist. Und das Sleep(10) ist wichtig wenn man nicht volle Auslastung haben will (wegen Peekmessage)

  • Bin mit meinem Latein leider am Ende.
    Das Sleep(INFINITE) war einfach nur ein Versuch, allerdings, laut MSDN sollte dieses entfernt, sprich von meiner Seite nicht mitgedacht.

    Das Sleep(10) habe ich deswegen entfernt, da nach einer Fenstererstellung relativ gleich danach die WM_CREATE-Nachricht behandelt werden sollte,
    wobei auch hier, nur ein Versuch, und da mMn, deswegen nicht der Prozessor zum Glühen anfangen sollte.

    Weiterer Versuch wäre, aus PeekMessage ein GetMessage zu machen, bei mir hat es so funktioniert.

  • Nein, ds war vorhher so, das wartet aber auf Nachrichten, das heißt es kann keine GUI erstellt werden, weil ohne GUI keine MSG, aber die GUI wird erst erstellt, wenn GetMessage loslässt.
    Hat nicht irgendjemand eine Idee?

  • Ich hab den Fehler, dadurch, dass in GUIStartup() die GUI-Classes static erstellt werden, enthält jedes Element den gleichen Pointer. ich finde aber keine Möglichkeit das Array so zu definieren um es so benutzen zu können:
    GUI *ngui=gui[x];
    ngui->hwnd
    gui[x]->hwnd
    Es soll also ein Array auf GUI-Pointer sein und global benutzbar sein. Es ist egal ob es in GUIStartup oder global erstellt wird, hautpsache global nutzbar.

    Ich hoffe ihr könnt mir helfen, danke.


    EDIT:
    Hab es, ein static class GUI und schon geht es :)

    Einmal editiert, zuletzt von TheShadowAE (16. Dezember 2010 um 11:15)