win32 gui

Roflmao

Mitglied
Hallo Community.

Ich habe letztens mit c++ begonnen und ein Programm fertiggestellt. Es führt einfache Rechnungen an Zufallsnummern durch. Bisher läuft alles in der Konsole und für ein anwenderfreundlicheres Aussehen möchte ich jetzt eine GUI schreiben.

Soweit so gut.
Problem:
Ich muss 1369 verschiedene Zahlen anzeigen.

tempacp.jpg


Die Textfelder kreiere ich mit 2 for loops.

Code:
       case WM_CREATE: {


                    for(int i=1; i<=37; i++)
                    {

                        switch(i){

                        case 1: Buf="A"; break; case 13: Buf="M"; break;case 25: Buf="X"; break;
                        case 2: Buf="B"; break; case 14: Buf="N"; break;case 26: Buf="Z"; break;
                        case 3: Buf="C"; break; case 15: Buf="O"; break;case 27: Buf="AA"; break;
                        case 4: Buf="D"; break; case 16: Buf="P"; break;case 28: Buf="AB"; break;
                        case 5: Buf="E"; break; case 17: Buf="Q"; break;case 29: Buf="AC"; break;
                        case 6: Buf="F"; break; case 18: Buf="R"; break;case 30: Buf="AD"; break;
                        case 7: Buf="G"; break; case 19: Buf="S"; break;case 31: Buf="AE"; break;
                        case 8: Buf="H"; break; case 20: Buf="T"; break;case 32: Buf="AF"; break;
                        case 9: Buf="I"; break; case 21: Buf="U"; break;case 33: Buf="AG"; break;
                        case 10:Buf="J"; break; case 22: Buf="V"; break;case 34: Buf="AH"; break;
                        case 11:Buf="K"; break; case 23: Buf="W"; break;case 35: Buf="AI"; break;
                        case 12:Buf="L"; break; case 24: Buf="X"; break;case 36: Buf="AJ"; break;
                        case 37:Buf="AK";
                        }

                         //Create Label
                         //X
                       CreateWindow(TEXT("STATIC"), TEXT(InttoconstChar(i)),
                                    WS_VISIBLE | WS_CHILD,
                                    (i*28)+3+x_Offset,y_Offset,20,13,
                                      hwnd, (HMENU) NULL, NULL, NULL);
                        // Y
                       CreateWindow(TEXT("STATIC"), TEXT(InttoconstChar(i)),
                                    WS_VISIBLE | WS_CHILD,
                                    x_Offset,(i*13)+7+y_Offset,20,13,
                                      hwnd, (HMENU) NULL, NULL, NULL);


                        for(int ii=1; ii<=37; ii++){

                          CreateWindow(TEXT("EDIT"),TEXT(InttoconstChar(i)),
                                       WS_VISIBLE | WS_CHILD | WS_BORDER,
                                      (i*28)+1+x_Offset,(ii*13)+8+y_Offset,20,13,
                                       hwnd, (HMENU) NULL, NULL, NULL);
                        }
                    }
        break;
        }

Damit ich den Wert der einzelnen Felder ändernkann, muss jedes Feld eine einzigartige ID besitzen. 9ter Parameter der CreateWindow Funktion.



Frage1: Wie gebe ich jeder Textbox eine individuelle ID?

Frage2: Muss ich jeden Id am Anfang des Documents definieren?

Code:
#define IDA1
#define IDA2
#define IDA3
#define IDA4
#define IDA5
#define IDA6
#define IDA7
#define IDA8
#define IDA9
#define IDA10
.
.
.
#define IDAK37

(1369 Zeilen "define code" ist meiner Meinung nach nicht das Wahre. Ist es valide mehrere IDs in einer Zeile zu definieren?
Code:
#define IDA1,IDA2,IDA3,...,IDAn

Frage3: Gibt es nicht eien viel bessere und elegantere Lösung für das Problem?

Danke :)
 
Hi und Willkommen bei tutorials.de :)

Kannst du einmal beschreiben, wofür das Ganze gut sein soll?
Weil über 1000 Textfelder zu haben ist irgendwie nicht so toll...
vielleicht gibt es eine andere Lösung?

Und du musst nicht alles mit den puren Winapibefehlen schreiben.
Es gibt viele Bibliotheken, die einem die GUIs abnehmen.
Oder machst du es absichtlich so, zu Lernzwecken etc?

Zu den #defines: Die müssen, wenn schon, auch noch einen Wert bekommen.
Und mehrere in einer Zeile sind nicht erlaubt.
Aber da du ja auch selber nicht 1000+ #defines haben willst:
Jede ID/Hanlde/etc ist doch nur ein int.
Schleifen usw. kann alles verwendet werden.
Kein Grund für so viele #defines.
 
Zuletzt bearbeitet:
Vielen dank fuer die nette Begruessung.

Wofuer das ganze?

Vereinfacht dargestellt:

Auf Knopfdruck wird eine zufallszahl erzeugt.

Beispiel 4 x 4

Anfang


[0][0][0][0]
[0][0][0][0]
[0][0][0][0]
[0][0][0][0]

Nachdem die erste Zufallszahl erzeugt wurde wird

[0][0][0][0]
[0][0][0][0]
[0][0][0][0]
[0][0][0][1]

Und beim naechsten:

[0][0][0][0] | [0][0][0][0] | [0][0][0][1] | [0][0][2][0]
[0][0][0][0] | [0][0][0][1] | [0][0][2][2] | [0][3][3][0]
[0][0][0][1] | [0][0][2][2] | [0][3][3][3] | [4][4][4][0]
[0][0][2][2] | [0][3][3][3] | [4][4][4][4] | [5][5][5][5]

etc ...

Dadurch entstehen 37 Verschiedene Zahlenreihen an dennen die gleichen Rechnungen durchgefuehrt werden sollen.



Ich habe mir schon QT angeschaut muss aber gestehen, dass es mir nicht so gefaellt. Ich bin ziemlich neu bei c++ und die ganzen neuen Sachen wie QStrings QObjects etc verwirren mich viel zu viel. Da bleibe ich lieber bei der guten alten win32 Api ;).

Ich bin mir desswen bewusst, dass es so wie es im Moment ist, nicht der richtige Weg ist, da ich selber kein Platz mehr auf meinen Bildschirm habe ;).

Jede ID/Hanlde/etc ist doch nur ein int.
Schleifen usw. kann alles verwendet werden.
Kein rund für so viele #defines.

Kannst du das bitte nocheinmal genauer ausfuehren.


Danke fuer deine Hilfe :)
 
Du hast zurzeit vom Prinzip her sowas vor:
C++:
#define BUTTON1   1
#define BUTTON2   2
#define TEXTBOX1 3
#define TEXTBOX2 4
...
CreateWindow(..., TEXTBOX1, ...);
Das ist eigentlich auch in Ordnung so, wenn es um wenige bestimmte Elemente geht.
Am Namen sieht man sofort, was gemeint ist.
TEXTBOX1 ist eben für Menschen leichter verständlich als 3.

Aber: Der Compiler (bzw. der PPZ-Teil davon) macht mit #defines ja nichts anderes, als die Werte an den passenden Stelleneinzusetzen.
Der Codeteil oben schaut für den Compiler so aus:
C++:
CreateWindow(..., 3, ...);
Die #defines existieren nicht, und anstelle der Namen stehen die Zahlen.
Wenn man als Mensch den Code gleich so schreibt wird er genau so gut funktionieren.

Und wenn man jetzt noch ein "int id" macht und schreibt
C++:
int id;
...
id = 3;
CreateWindow(..., id, ...);
Macht es für die Funktionsweise auch keinen Unterschied.

Und dieses id kann jetzt wie jedes andere int mit Schleifen weitergezählt werden usw...
 
super das mit der int als id funktioniert. Danke. Morgen mache ich mir dan einmal Gedanken wie ich das ganze Layout ein bisschen kompakter hinbekomme.
 
Ich habe mir mal die Mühe gemacht deinen Screenshot als Attachement neu zu uppen. Das Problem bei Fremdhostern ist einfach das dort die Daten nach einer gewissen Zeit verloren gehen ... was bei uns hier nicht der Fall ist wenn man seine Daten richtig einfügt.
Bitte beachte diese Funktion in deinen nächsten Posts.
 

Anhänge

  • tempacp.jpg
    tempacp.jpg
    179,6 KB · Aufrufe: 20
Ich habe mir schon QT angeschaut muss aber gestehen, dass es mir nicht so gefaellt. Ich bin ziemlich neu bei c++ und die ganzen neuen Sachen wie QStrings QObjects etc verwirren mich viel zu viel. Da bleibe ich lieber bei der guten alten win32 Api ;).
Dabei würde sich die Einarbeitung in Qt durchaus lohnen, weil es meiner Meinung nach eines der besten, derzeit verfügbaren C++ - GUI-Toolkits ist. Dann könntest du dein Projekt z.B. mit einer Tabellenansicht (QTableWidget) realisieren, anstatt mit einer Million Editfeldern zu hantieren :D

Gruß
MCoder
 
Danke fuers Uploaden des Bildes. Ich werde es beim naechsten mal direkt hier hochladen.


Danke aber ich bleiber lieber bei der Win API.
Ich habe das ganze jetzt auf 5*37 Felder verkleinert, da die interesannten Sachen so oder so erst am Ende der Zahlenreihen auftauchen.

Ich moechte jetzt auf Knopfdruck eine Zufallszahl generieren lassen, aber leider bekomme ich folgenden Fehler

C:\... ||In function 'LRESULT WindowProcedure(HWND__*, UINT, WPARAM, LPARAM)':|
C:\...|150|error: 'wPARAM' was not declared in this scope|
||=== Build finished: 1 errors, 0 warnings ===|


C++:
case WM_COMMAND:{

    if(LOWORD(wPARAM) == IDBUTTON){
/*     if(FR){
             resetArray(Random,99,38);
             srand(time(0));
             FR=false;
             }
         
        else{
             Random[GlobalCount]=rand();
             GlobalCount++;
             if(GlobalCount >= 37)GlobalCount=0;
               }*/
 break;
}

Ich habe dieses Tutorial hier befolgt.

http://www.nickfrosty.com/videos/180/cpp-tutorial-perform-button-actions
 
Zuletzt bearbeitet:
Dabei würde sich die Einarbeitung in Qt durchaus lohnen, weil es meiner Meinung nach eines der besten, derzeit verfügbaren C++ - GUI-Toolkits ist. Dann könntest du dein Projekt z.B. mit einer Tabellenansicht (QTableWidget) realisieren, anstatt mit einer Million Editfeldern zu hantieren :D

Ich würde da eher wxWidgets empfehlen. Naja du kannst ja mal das auch ausprobieren.

In weniger als 10 Minuten bekommt man genau eine kleine Anwendung, die du wolltest:
screenshot.PNG

Auch die Forms musst du nicht mehr selber schreiben, dazu kannst du wxFormBuilder nutzen.
Hier das Programm: Anhang anzeigen upload.zip
 
Zurück