Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

08.08.2008, 12:58

Probleme bei Windows Projekt

Hallo,

zurzeit arbeite ich an einem Projekt namens "Kundenverwaltung". Es ist ein Tool, dass es der Firma meines Opas ermöglichen soll die Daten ihrer Kunden in einer Liste abzuspeichern, und bei bedarf abzurufen.

Dabei haben sich folgende Probleme ergeben, aber zuerst einmal, der bisherige Quellcode des Programms:

main.cpp

Quellcode

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <windows.h>

// Prototyp der Callback-Funktion
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam);

//Prototyp zum Erzeugen der Überschriften
bool CreateTitles (HWND hWnd, HINSTANCE hInst);

//Prototyp zum Erzeugen der Boxen
bool CreateBoxes (HWND hWnd, HINSTANCE hInst);

//Prototyp zum Erzeugen der Buttons
bool CreateButtons (HWND hWnd, HINSTANCE hInst);

// Hauptprogramm
//
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
                    LPSTR lpcmdline, int ncmdshow)
{
  WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften
  HWND       hWnd;        // Fenster-Handle
  MSG        message;     // Nachricht

  // Der Klassen-Name des Fensters ist frei wählbar
  const char szClassName[] = "Kundenverwaltung";

  // Struktur mit gewünschten Eigenschaften füllen
  //

  // Größe der Struktur zwischenspeichern
  windowclass.cbSize = sizeof (WNDCLASSEX);

  // Fenster soll beim Verschieben neu gezeichnet werden
  windowclass.style = CS_HREDRAW | CS_VREDRAW;

  // Zeiger auf Callback-Funktion
  windowclass.lpfnWndProc = WindowProc;

  // Keine erweiterten Einstellungen
  windowclass.cbClsExtra = 0;
  windowclass.cbWndExtra = 0;

  // Instanz speichern
  windowclass.hInstance = hInst;

  // Icons und Cursor festlegen
  windowclass.hIcon   = LoadIcon (NULL, IDI_APPLICATION);
  windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  windowclass.hCursor = LoadCursor (NULL, IDC_ARROW);

  // Hintergrundfarbe festlegen
  windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;

  // Ein Menü brauchen wir nicht
  windowclass.lpszMenuName = NULL;

  // Klassenname angeben
  windowclass.lpszClassName = szClassName;

  // Fensterklasse registrieren
  if (!RegisterClassEx (&windowclass) )
    return (0);

  // Das Fenster erzeugen
  hWnd = CreateWindowEx (NULL,
                         szClassName,
                         "Kundenverwaltung",
                         WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_VSCROLL,
                         100, 100,
                         1248, 1024,
                         NULL,
                         NULL,
                         hInst,
                         NULL);

  // Prüfen, ob alles glatt ging
  if (hWnd == NULL)
    return (0);
 
  //===================================================================================================

  //Überschriften erzeugen
  CreateTitles (hWnd, hInst);

  //Boxen erzeugen
  CreateBoxes (hWnd, hInst);

  //Buttons erzeugen
  CreateButtons (hWnd, hInst);



  // Der "Herzschlag" des Programms.
  // Hier werden alle Nachrichten abgeholt,
  // übersetzt und weitergeleitet.
  while (GetMessage (&message, NULL, 0, 0) )
  {
    TranslateMessage (&message);
    DispatchMessage (&message);

  }

  // Programm beenden
  return (int)(message.wParam);

} // WinMain


//========================================================================================================//
//------------------------------------------CALLBACK-FUNKTION---------------------------------------------//
//========================================================================================================//


LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam)
{
  // Messages auswerten
  switch (message)
  {
    // Fenster schließen? (Auch Alt-F4)
    case WM_DESTROY:
    {
      // Nachricht zum Beenden schicken
      PostQuitMessage (0);
      return (0);

    }
    
    //NAchrichten aller Child-Fenster
    case WM_COMMAND:
    {
        switch (wParam)
        {
            //Wurde "Kunde hinzufügen" gedrückt?
            case ID_KUNDEN:
            {
                MessageBox (hWnd, "MöPp", "--", MB_OK | MB_ICONINFORMATION);
            }
        }
    }

    // Wurde eine Taste gedrückt?
    case WM_KEYDOWN:
    {
      // Ja, also je nach Taste verzweigen
      switch (wParam)
      {
        // Wurde "Escape" gedrückt?
        case VK_ESCAPE:
        {
          // Ja, also Nachricht zum Beenden schicken
          PostQuitMessage (0);
          return (0);

        }
      }
    } break;
  } 

  // Die Nachricht wurde nicht von uns verarbeitet, also
  // von Windows verarbeiten lassen.
  return (DefWindowProc (hWnd, message, wParam, lParam) );

} // WindowProc


Titles.cpp

Quellcode

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <windows.h>

//Handles für die Titel
HWND hText;
HWND hEmail;
HWND hPLZ;
HWND hOrt;
HWND hAdresse;
HWND hTel;

//Titles
//
//Aufgabe: Titel erzeugen und an der richtigen Stelle ins Fenster schreiben
//
bool CreateTitles (HWND hWnd, HINSTANCE hInst)
{
     //Text für den Namen der Kunden

  //ID des Childfensters
  #define ID_NAME 4000
  
  //Statischen Text als Fenster erzeugen
  hText = CreateWindow ("STATIC",
                        "Name     ",
                        WS_VISIBLE | WS_CHILD,
                        50, 40,
                        300, 20,
                        hWnd,
                        (HMENU)ID_NAME,
                        hInst,
                        NULL);
  //==============================================================================================

  //Text für E-Mail

  //ID des Childfensters
  #define ID_EMAIL 4001

  //Email als Child-Fenster erzeugen
  hEmail = CreateWindow ("STATIC",
                         "E-Mail",
                         WS_VISIBLE | WS_CHILD,
                         700, 40,
                         300, 20,
                         hWnd,
                         (HMENU)ID_EMAIL,
                         hInst,
                         NULL);
  //===============================================================================================
  
  //Text für die PLZ

  //ID für die PLZ
  #define ID_PLZ 4002

  //PLZ als Child-Fenster erzeugen
  hPLZ = CreateWindow ("STATIC",
                       "PLZ       ",
                       WS_VISIBLE | WS_CHILD,
                       400, 40,
                       50, 20,
                       hWnd,
                       (HMENU)ID_PLZ,
                       hInst,
                       NULL);
  //=================================================================================================

  //Text für den Ort

  //ID für den Ort
  #define ID_ORT 4003

  //Ort als Child-Fenster erzeugen
  hOrt = CreateWindow ("STATIC",
                       "Ort        ",
                       WS_VISIBLE | WS_CHILD,
                       250, 40,
                       50, 20,
                       hWnd,
                       (HMENU)ID_ORT,
                       hInst,
                       NULL);
  //==================================================================================================

  //Text für die Adresse

  //ID für die Adresse
  #define ID_ADRESSE 4004

  //Adresse erzeugen
  hAdresse = CreateWindow ("STATIC",
                           "Addresse",
                           WS_VISIBLE | WS_CHILD,
                           550, 40,
                           60, 20,
                           hWnd,
                           (HMENU)ID_ADRESSE,
                           hInst,
                           NULL);
  //==================================================================================================
 
  //Text für die TelNummer

  //Id der TelNummer
  #define ID_TELNUMMER 4005

  //TelNummer erzeugen
  hTel = CreateWindow ("STATIC",
                       "Telefonnummer       ",
                       WS_VISIBLE | WS_CHILD,
                       850, 40,
                       101, 20,
                       hWnd,
                       (HMENU)ID_TELNUMMER,
                       hInst,
                       NULL);
    //prüfen, ob alles glatt ging
    if ((hText == NULL) || (hEmail == NULL) || (hPLZ == NULL) || (hOrt == NULL) || (hAdresse == NULL) || (hTel == NULL))
    {
          return (false);
    }
    else
    {
        return(true);
    }

  }//CreateTitles


EditBoxes.cpp

Quellcode

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <windows.h>
#include <fstream>

//Handles für die Boxen
HWND hNamensbox;
HWND hOrtbox;
HWND hPLZBox;
HWND hAddrBox;
HWND hEmailBox;
HWND hTelBox;

//CreateBoxes
//
//Boxen erstellen, in denen später die Namen stehen sollen
//
bool CreateBoxes (HWND hWnd, HINSTANCE hInst)
{
    //ID des Namens
    #define ID_NAMENSBOX 4008

    //Box erzeugen
    hNamensbox = CreateWindow ("BUTTON",
                                "",
                                WS_VISIBLE | WS_CHILD | WS_DLGFRAME | BS_PUSHBUTTON,
                                50, 60,
                                190, 25,
                                hWnd,
                                (HMENU)ID_NAMENSBOX,
                                hInst,
                                NULL);
//======================================================================================================

    //Box für den Ort

    //ID für den Ort
    #define ID_ORTBOX 4101

    //Box erzeugen
    hOrtbox = CreateWindow ("BUTTON",
                            "",
                            WS_VISIBLE | WS_CHILD | WS_DLGFRAME | BS_PUSHBUTTON,
                            250, 60,
                            140, 25,
                            hWnd,
                            (HMENU)ID_ORTBOX,
                            hInst,
                            NULL);
//================================================================================================

    //PLZ-Box

    //ID
    #define ID_PLZBOX 4201

    //Box erzeugen
    hPLZBox = CreateWindow ("BUTTON",
                            "",
                            WS_VISIBLE | WS_CHILD | WS_DLGFRAME | BS_PUSHBUTTON,
                            400, 60,
                            140, 25,
                            hWnd,
                            (HMENU)ID_PLZBOX,
                            hInst,
                            NULL);
//================================================================================================

    //Adressen-Box

    //ID
    #define ID_ADDRESSENBOX 4301

    //Box erzeugen
    hAddrBox = CreateWindow ("BUTTON",
                            "",
                            WS_VISIBLE | WS_CHILD | WS_DLGFRAME | BS_PUSHBUTTON,
                            550, 60,
                            140, 25,
                            hWnd,
                            (HMENU)ID_ADDRESSENBOX,
                            hInst,
                            NULL);
//==================================================================================================

    //E-Mail Box

    //ID
    #define ID_EMAIL_BOX 4401

    //Box erzeugen
    hEmailBox = CreateWindow ("BUTTON",
                              "",
                              WS_VISIBLE | WS_CHILD | WS_DLGFRAME | BS_PUSHBUTTON,
                              700, 60,
                              140, 25,
                              hWnd,
                              (HMENU)ID_EMAIL_BOX,
                              hInst,
                              NULL);
//===================================================================================================

    //Telefon-Box

    for (int i=0; i<2; i++)
    {
        //ID
        #define ID_TELBOX 4501 + (i+1)

        //Box erzeugen
        hTelBox = CreateWindow ("BUTTON",
                                "",
                                WS_VISIBLE | WS_CHILD | WS_DLGFRAME | BS_PUSHBUTTON,
                                850, 60 + (i * 30),
                                140, 25,
                                hWnd,
                                (HMENU)ID_TELBOX,
                                hInst,
                                NULL);
    }

    //prüfen ob alles glatt ging
    if ((hNamensbox == NULL) || (hOrtbox == NULL) || (hPLZBox == NULL) || (hAddrBox == NULL) || (hEmailBox == NULL) || (hTelBox == NULL))
    {
        return(false);
    }
    else
    {
        return(true);
    }

}//CreateBoxes


Buttons.cpp

Quellcode

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <windows.h>

//Handles für die Buttons
HWND hKunden;
HWND hLoeschen;
HWND hSuchen;

//CreateButtons
//
//Aufgabe: Buttons erstellen
//

bool CreateButtons (HWND hWnd, HINSTANCE hInst)
{
    //"Kunden hinzufügen"

    //ID
    #define ID_KUNDEN 4601

    //Button erzeugen
    hKunden = CreateWindow ("BUTTON",
                            "Kunden hinzufügen",
                            BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                            1020, 50,
                            160, 40,
                            hWnd,
                            (HMENU)ID_KUNDEN,
                            hInst,
                            NULL);
    //==========================================================================================
    
    //"Kunden löschen"

    //ID
    #define ID_LOESCHEN 4602

    //Button erzeugen
    hLoeschen = CreateWindow ("BUTTON",
                              "Kunden löschen",
                              BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                              1020, 110,
                              160, 40,
                              hWnd,
                              (HMENU)ID_LOESCHEN,
                              hInst,
                              NULL);
    //===========================================================================================

    //"Kunden suchen"

    //ID
    #define ID_SUCHEN 4603

    //Button erzeugen
    hSuchen = CreateWindow ("BUTTON",
                            "Kunden suchen",
                            BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                            1020, 170,
                            160, 40,
                            hWnd,
                            (HMENU)ID_LOESCHEN,
                            hInst,
                            NULL);
    //=============================================================================================

    //prüfen ob alles glatt ging
    if ((hKunden == NULL) || (hLoeschen == NULL) || (hSuchen == NULL))
    {
        return(false);
    }
    else
    {
        return(true);
    }
}


Hier noch ein Screen vom Programm, wie es jetzt aussieht: http://img161.imageshack.us/img161/4171/programmbt9.jpg

Ich weiß das ist eine Menge Holz und ich bedanke mich jetzt schon mal bei jedem der sich die Mühe macht, das durchzulesen.

zu meinen Problemen: mein dringlichstes Problem ist, dass die IDs, die in Buttons.cpp sitzen, nicht gültig sind für die Callback Funktion. Sie sollten aber mehr oder weniger dort bleiben, da für jeden eingetragenen Kunden eine Zeile entstehen soll - also brauch ich eine flexible anzahl an Zeilen.

Das bringt mich auch schon zu meinem nächsten Problem: Ich hatte geplant, die flexiblen Boxen durch schleifen zu realisieren (wie man an der Telefon-nummer-box erkennen kann). Geht das überhaupt, dass man da auch Handles und so weiter reproduziert und schickt dann nachher jede Box auch ein eigenes Command bei einem Klick (also haben die dann unterschiedliche IDs?)

und meine vorerst letzte Frage: Wie kann man buttons realisieren, die ein Bitmap anzeigen (das Flag hab ich gesehen, hab aber ansonsten keine Ahnung)?

Wie schon gesagt, ich bin sicher es ist verdammt viel arbeit sich das code-gesülze eines Anfängers anzuschauen, aber ich bin um jede Hilfe dankbar!

mfg Un{}normaL

Anonymous

unregistriert

2

08.08.2008, 13:46

1/ Dies hat nichts mit Kalistas Buch zu tun, daher verschoben.
2/ Den ganzen Code guckt sich keiner an, poste nur die relevanten Dinge.

3

08.08.2008, 15:01

zu 1. Sry, ich dachte, da ich das ganze aus einem Beispiel aus dem Buch entwickelt habe, würde es dorthin gehören. Etschuldigung wenn das falsch war!

zu 2. Das seh ich ein. Ich würd sagen dann konzentriere ich mich mal auf das Hauptproblem: nämlich der ID bei den Buttons und der Callback Funktion:

Button

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    //"Kunden hinzufügen"

    //ID
    #define ID_KUNDEN 4601

    //Button erzeugen
    hKunden = CreateWindow ("BUTTON",
                            "Kunden hinzufügen",
                            BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                            1020, 50,
                            160, 40,
                            hWnd,
                            (HMENU)ID_KUNDEN,
                            hInst,
                            NULL);


Callback-Funktion

Quellcode

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
47
48
49
50
51
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam)
{
  // Messages auswerten
  switch (message)
  {
    // Fenster schließen? (Auch Alt-F4)
    case WM_DESTROY:
    {
      // Nachricht zum Beenden schicken
      PostQuitMessage (0);
      return (0);

    }
    
    //NAchrichten aller Child-Fenster
    case WM_COMMAND:
    {
        switch (wParam)
        {
            //Wurde "Kunde hinzufügen" gedrückt?
            case ID_KUNDEN:
            {
                MessageBox (hWnd, "MöPp", "--", MB_OK | MB_ICONINFORMATION);
            }
        }
    }

    // Wurde eine Taste gedrückt?
    case WM_KEYDOWN:
    {
      // Ja, also je nach Taste verzweigen
      switch (wParam)
      {
        // Wurde "Escape" gedrückt?
        case VK_ESCAPE:
        {
          // Ja, also Nachricht zum Beenden schicken
          PostQuitMessage (0);
          return (0);

        }
      }
    } break;
  } 

  // Die Nachricht wurde nicht von uns verarbeitet, also
  // von Windows verarbeiten lassen.
  return (DefWindowProc (hWnd, message, wParam, lParam) );

} // WindowProc


Das Problem ist wie gesagt, dass die ID des Buttons für die Callback Funktion unbekannt ist, ich aber Buttons per Schleife erzeugen möchte, was ja wohl bedeutet, dass ich die IDs nicht global machen kann.

Falls ich hier irgendwas ganz falsch mache, sagt mir das bitte - ich bin eben noch ein ziemlicher Anfänger^^

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

4

08.08.2008, 15:12

Also.. mal ehrlich.. tuts da nicht ne Excel Tabelle auch?
Okay, wenns Lernzwecke hat lass ich das natürlich durchgehen, aber im das Problem zu lösen gibt es wesentlich einfachere Möglichkeiten.

5

08.08.2008, 15:15

Warum kannst du die nicht global machen und warum nimmst du überhaupt defines? :D
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

6

08.08.2008, 19:11

das mit der excel tabelle war auch mein erster gedanke, aber wie du schon gesagt hast basiert das ganze auf dem Gedanken Praxis zu sammeln

global machen kann ich die nicht, weil später nur so viele Zeilen da sein sollen, wie Kunden eingetragen sind. Ich hatte mir gedacht, das mit Schleifen zu realisieren (außerdem sind globale Variablen von Grund auf böse^^). Das man etwas anderes als defines nehmen kann wusste ich nicht. In Kalistas Buch werden nur defines gezeigt.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

7

08.08.2008, 19:20

Lass es mich so sagen: Ich glaube nicht, dass dein Wissenstand ausreicht um das zu realisieren, was dir vorschwebt ... Damit meine ich nicht deine Kenntnisse der WinAPI, sondern allgemein. Vielleicht solltest du erstmal allgemein weiterarbeiten, und dann zu dem Projekt zurückkehren?

8

08.08.2008, 19:26

ist das Problem wirklich so schwer zu umgehen? oder ist der code bis jetzt nur sehr verworren programmiert?

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

9

08.08.2008, 19:31

Naja, die WinAPI macht es Anfängern nicht unbedingt leichter ... Ich sags mal anders: Schau dir nochmal Arrays (respektive std::vector) an und überleg, ob du damit was anfangen kannst ;) Ich *vermute* allerdings, dass du dann recht schnell auf neue Probleme stoßen wirst.

Und ansonsten machs doch wirklich in Excel mit ein bisschen Macrospielerei. Es geht doch darum, etwas für deinen Opa zu machen oder nicht?

Werbeanzeige