Auf Buttonklick neue Editbox erstellen -> geht nicht



  • Ich bins nochmal. Ich hab das jetzt fast genauso übernommen (außer diesen struct-Block und die Variablennamen), und ich kann trotzdem nur eine Editbox erstellen. Bei einer zweiten passiert gar nix. ICh schicke jetzt am besten mal meinen gesamten Code:

    #define STRICT
    
    #include <windows.h>
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApp";
    
    class summand
    {
        protected:
            UINT anz;
            int boxwidth;
            int boxhight;    
            HWND hEdit;
            char buffer[255];        
        public:   
            int ableiten(); 
            summand(void); 
            int add_sum(HWND, int);        
    };
    
    summand::summand(void){
        boxwidth=50;
        boxhight=30;
        buffer[0]=' ';
    }
    
    int summand::add_sum(HWND hwnd, int a){      
    
        hEdit = CreateWindowEx (WS_EX_CLIENTEDGE, "Edit", buffer,
                                WS_CHILD | WS_VISIBLE, 20+100*a, 30, boxwidth, boxhight,
                                hwnd, NULL, 
                                GetModuleHandle(0),
                                NULL);
    
        return a; 
    }
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
    //...Hier steht der Standardcode, wie bei jeder Windows-Anwendung.
    }
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        int n=0,i;
        static HWND hButtonPlus, hButtonMinus;
        summand* sum;
        summand* tmp=NULL;
    
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                hButtonPlus = CreateWindow ("button", "+", WS_CHILD | WS_VISIBLE,
                                            50, 100, 20, 20, hwnd, NULL, 
                                            ((LPCREATESTRUCT) lParam) ->hInstance,
                                            NULL);
                hButtonMinus = CreateWindow ("button", "-", WS_CHILD | WS_VISIBLE,
                                            70, 100, 20, 20, hwnd, NULL, 
                                            ((LPCREATESTRUCT) lParam) ->hInstance,
                                            NULL);
                /*sum[0].hEdit = CreateWindowEx (WS_EX_CLIENTEDGE, "Edit", sum[0].buffer,
                                               WS_CHILD | WS_VISIBLE, 20, 30, 30, 30,
                                               hwnd, NULL, 
                                               GetModuleHandle(0),
                                               NULL);*/
    
                break;
            case WM_COMMAND:
                if(lParam==(LPARAM)hButtonPlus){
                    if(HIWORD(wParam) == BN_CLICKED){
    
                        if(sum){
                            tmp = new summand[n];
                            memcpy (tmp, sum, sizeof(summand) * n); 
                        }    
                        delete [] sum;  
                        sum = new summand[n+1];
                        if(tmp)
                            memcpy (sum, tmp, sizeof(summand) * n);
                        delete [] tmp;                 
    
                        sum[n].add_sum(hwnd, n);
                        n++;
                    }            
                }                
                break;
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    


  • Was willste überhaupt machen Max3000. Bei jedem Click ein neues Edit Fenster erstellen? Wozu soll das gut sein? Brauchst du wirklich 10.000 Fenszer? Ich würde einfach ein array mit 16, 32 oder wieviel du ca. brauchst machen. hier mein freund das ist doch viel einfacher und wird den zweck sicherlich auch erfüllen

    #define MAX_SUM	32
    ...
    ...
    	summand sum[MAX_SUM];
    ...
    ...
            case WM_COMMAND:
                if(lParam==(LPARAM)hButtonPlus){
                    if(HIWORD(wParam) == BN_CLICKED){
    					if( n < MAX_SUM )
    					{
    	                    sum[n].hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", sum[n].buffer,
    				                                      WS_CHILD | WS_VISIBLE, 20+n*50, 30, 30, 30,
    					                                  hwnd, NULL,
    							                          ((LPCREATESTRUCT) lParam) -> hInstance,
    									                  NULL);
    						n++;
    					}
                    }            
                }                
                break;
    


  • Das geht bei mir aber genausowenig.
    Aber hast recht, ich brauch keine 10000 Fenster, sondern maximal so 20.
    So langsam glaube ich aber der Fehler liegt gar nicht an der Klasse und der Speicherreservierung.



  • Hoi,
    wenn ich mal indirekt zitieren darf...:

    int summand::add_sum(HWND hwnd, int a){      
    
        hEdit = CreateWindowEx (WS_EX_CLIENTEDGE, "Edit", buffer,
                                WS_CHILD | WS_VISIBLE, 20+100*a, 30, boxwidth, boxhight,
                                hwnd, NULL,
                                GetModuleHandle(0),
                                NULL);
    
        return a;
    }
    

    du gibst deinen Button doch gar keine ID... da steht ja NULL 😕
    Bin mir nicht ganz sicher ob das der Fehler ist, aber du kannst ja auch mal GetLastError benutzen, um den Fehler genauer zu spezifizieren 😉 💡



  • Hab den Fehler jetzt eingegrenzt.
    Die Funktion add_sum läuft jedesmal durch und ich habe auch immer eine andere Adresse von hEdit.

    Das Problem ist der Index, den ich n genannt habe. Der bleibt immer gleich, obwohl ich den bei jedem Buttonklick hochzählen lasse.

    Desswegen erstellt der die neue Editbox immer mit den selben Koordinaten, also sind diese Deckungsgleich und ich kann die dann nicht mehr unterscheiden.

    Aber warum zählt der das n nicht hoch?



  • Weil n nicht static ist. Also ich würde erstmal C oder C++ lernen, das ist nicht als Angriff gemeint aber dir würden die Dinge alle einfach WEITAUS klarer sein, wenn du wüsstest was du uberhaupt machst....Der Code ist ein misch aus C und C++ und obendrein verkompliziert WinAPI die Sache...wenn man noch nichts davon richtig beherscht dann gibt das nur Schlamassel...



  • Vielen Dank Meaning jetzt klappt alles.

    Ich weiß schon, dass WinAPI noch bissl zu schwer für mich ist, aber trotzdem will ich auch nur mit simplem WinAPI-Funktionen eine Benutzerfreundliche Oberfläche erstellen.

    Nochmals vielen Dank an alle, die mir bei meinem Problem geholfen haben.
    Besonders an (D)Evil, der anscheinend recht viel Zeit in dieses Problem investiert hat.

    Grüße
    Max



  • Max3000
    Naja... wenn 10min viel Zeit sind 😉

    Also... ich hab gedacht das du das anderes Lösen wolltest.. na was solls.. mit dem Code den ich dir gegeben hab, hättest du einfach ein (globales) Object von summand angelegt... und hättest dann wenn du gewollt hättest mit AddSum so ziemlcih so viele Edits hinzufügen können wie du wolltest 😉



  • [quote="(D)Evil"]Naja... wenn 10min viel Zeit sind 😉

    Es gibt auch Leute, die diesen Thread mit nem "loooool" beantworten (siehe auf Seite 2).
    Desswegen bin ich für so eine gute Hilfe sehr dankbar.


Anmelden zum Antworten