tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
18
ZUGRIFFE
481
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Roflmao Roflmao ist offline Mitglied Silber
    Registriert seit
    Sep 2011
    Beiträge
    54
    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.

    http://img94.imageshack.us/img94/1454/tempacp.jpg

    Die Textfelder kreiere ich mit 2 for loops.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
           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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    #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 :
    1
    
    #define IDA1,IDA2,IDA3,...,IDAn

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

    Danke
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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.
    Geändert von sheel (06.09.11 um 19:59 Uhr) Grund: rund->Grund
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    Roflmao Roflmao ist offline Mitglied Silber
    Registriert seit
    Sep 2011
    Beiträge
    54
    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
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Du hast zurzeit vom Prinzip her sowas vor:
    Code cpp:
    1
    2
    3
    4
    5
    6
    
    #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:
    Code cpp:
    1
    
    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
    Code cpp:
    1
    2
    3
    4
    
    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...
    Roflmao bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  5. #5
    Roflmao Roflmao ist offline Mitglied Silber
    Registriert seit
    Sep 2011
    Beiträge
    54
    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.
     

  6. #6
    SE Tutorials.de Gastzugang
    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.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken win32 gui-tempacp.jpg  
    Roflmao bedankt sich. 

  7. #7
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von Roflmao Beitrag anzeigen
    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

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  8. #8
    Roflmao Roflmao ist offline Mitglied Silber
    Registriert seit
    Sep 2011
    Beiträge
    54
    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 ===|

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    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...button-actions
    Geändert von Roflmao (07.09.11 um 22:55 Uhr)
     

  9. #9
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    wPARAM und WPARAM ist ein Unterschied.

    Und da wir hier bei C/C++ sind, statt php-Tags bitte cpp verwenden.
    Roflmao bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  10. #10
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.358
    Blog-Einträge
    4
    Zitat Zitat von MCoder Beitrag anzeigen
    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
    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:
    win32 gui-screenshot.png

    Auch die Forms musst du nicht mehr selber schreiben, dazu kannst du wxFormBuilder nutzen.
    Hier das Programm: upload.zip
    Roflmao bedankt sich. 
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  11. #11
    Roflmao Roflmao ist offline Mitglied Silber
    Registriert seit
    Sep 2011
    Beiträge
    54
    # shell ich habe beides ausprobiert wPARAM und WPARAM beidesmal bekomme ich einen Error.
    Bei WPARA ist es
    C:\....\main.cpp|149|error: expected primary-expression before ')' token|
    #ComFreek. Danke ich werde es mir morgen einmal anschauen.


    @ ich habe oben einmal die php tags durch cpp ersetzt danke
     

  12. #12
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Welche Zeile ist denn 149?
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  13. #13
    Roflmao Roflmao ist offline Mitglied Silber
    Registriert seit
    Sep 2011
    Beiträge
    54
    Code cpp:
    1
    
    /*149*/    if(LOWORD(WPARAM) == IDBUTTON){

    habe ich irgendeinen include vergessen?
     

  14. #14
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Moment...WPARAM ist doch der Typname?
    Zeig einmal die erste Zeile der Funktion (Returntyp, Funktionsname, Parameter)
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  15. #15
    Roflmao Roflmao ist offline Mitglied Silber
    Registriert seit
    Sep 2011
    Beiträge
    54
    Edit: "ja man haette mal selber auf die parameter schauen sollen. wParam funktioniert ..."

    Edit2:



    Und schon stehe ich wieder vor einen Problem. Wie aender ich den Text der Textbox. Ich habe jetzt einfach einmal auf WindowSetText() getippt und so eine Funktion existiert sogar.

    Die Beschreibung passt:

    "Changes the text of the specified window's title bar (if it has one). If the specified window is a control, the text of the control is changed. "

    Code cpp:
    1
    2
    3
    4
    
    SetWindowText(
      __in      HWND hWnd,
      __in_opt  LPCTSTR lpString
    );
    Die Funktion erfordert einen HWND. Also wird warscheinlich der Wert benoetigt, der bei der WindowCreate() Funktion zurueckgegeben wurde.
    Soweit so gut, ich kenne es von anderen Programmiersprachen aber so, dass ich meine Objecte direkt per ID ansprechen kann. Wofuer habe ich meinen Textboxen ueberhaupt eine ID gegeben, wenn diese nirgends gebraucht wird.


    Gibt es HWND arrays?

    Pseudo Code


    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    static HWND hwndTextbox[200]
     
    .
    .
    .
     
    WM_CREATE : 
        {
        
        for(int i ....)
            {
            hwndTextbox[i] = CreateWindow();
            {
        break;
        }
     
    WM_COMMAND :
        {
        for(int i ....) 
            {
            SetWindowText(hwndTextbox[i],"Value");
            }
        break;
        }
    Geändert von Roflmao (07.09.11 um 23:43 Uhr)
     

Ähnliche Themen

  1. win32 api
    Von zerix im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 04.11.06, 14:34
  2. win32 api
    Von elfvyn im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 21.06.05, 13:15
  3. c und win32?
    Von psycho_matic im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 16.02.02, 11:27
  4. MSDE+apache_1.3.22-win32-x86+php-4.0.6-Win32+Verzweiflung
    Von Volker im Forum Microsoft Windows
    Antworten: 1
    Letzter Beitrag: 19.11.01, 02:51
  5. Antworten: 1
    Letzter Beitrag: 18.11.01, 22:39