[C++] Erstellen von Eingabefenstern

lars96

Mitglied
Hallo Community,

ich bin hier neu und habe eine Frage, jedoch erstmal Grundlegendes:

Compiler: Visual C++ Express 2010
Buch: C++ für Spieleprogrammierer von Heiko Kalista


1. Ich möchte soetwas wie eine "Editbox" machen, doch möchte ich Zahlen eingeben und diese als Variable speichern. Wie ist das möglich?

2. Kennt jemand eine Visual C++ Fensterdesign Alternative ? (zum Gestalten)


Mit freundl. Grüßen,

lars96
 
Willkommen bei tutorials.de :)

Zu 1:Mit was arbeitest du (dein angesprochenes "Fensterdesign")?
MFC, Winapi, Winforms...?
Wenn du nicht sicher bist, zeig uns etwas Code.

Zu 2: Qt, wxwidgets...
Beides im Internet zum Downloaden und einbinden ins Visual Studio.
 
1. Ich möchte soetwas wie eine "Editbox" machen, doch möchte ich Zahlen eingeben und diese als Variable speichern. Wie ist das möglich?
Das kommt ganz darauf an welche GUI-Bibliothek du verwendest (Win32, MFC, Windows Forms…).

2. Kennt jemand eine Visual C++ Fensterdesign Alternative ? (zum Gestalten)
Meinst du eine GUI-Bibliothek oder nur einen Resourceneditor? Bei ersterem wäre die Antwort z.B. Qt oder wxWidgets.

\edit: Links raussuchen kostet zu viel Zeit :-(

Grüße,
Matthias
 
Das hier ist der Quellcode (von meinem Buch):
// C++ für Spieleprogrammierer
// Listing 10.3
// Eine kleine Anwendung
//

#include <windows.h>

// Prototypen
//
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam);

HWND ErstelleHauptfenster (HINSTANCE hInst);
void ErstelleSteuerelemente (HWND hWnd, HINSTANCE hInst);

// IDs der Child-Fenster
//
#define ID_STATICTEXT 4000
#define ID_EDITBOX 4001
#define ID_BTN_UEBERNEHMEN 4002
#define ID_BTN_BEENDEN 4003

// Globale Variablen
// Don't do this at home!
//
HWND hText; // Handle für den statischen Text
HWND hEditBox; // Handle für die Editbox
HWND hUebernehmen; // Handle für Button "Übernehmen"
HWND hBeenden; // Handle für Button "Beenden"

// Hauptprogramm
//
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpcmdline, int ncmdshow)
{
HWND hWnd; // Fenster-Handle
MSG message; // Nachricht

// Hauptfenster erstellen
hWnd = ErstelleHauptfenster (hInst);

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

// Alle Steuerelemente erstellen
ErstelleSteuerelemente (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


// Erstelle Hauptfenster
//
// Hauptfenster erstellen und Handle zurückliefern
//
HWND ErstelleHauptfenster (HINSTANCE hInst)
{
HWND hWnd; // Fenster-Handle
WNDCLASSEX windowclass; // Nachricht

// Der Klassenname des Fensters ist frei wählbar
const char szClassName[] = "Zweites Fenster";

// 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 (NULL);

// Das Fenster erzeugen
hWnd = CreateWindowEx (NULL,
szClassName,
"Eine kleine Anwendung",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
300, 135,
NULL,
NULL,
hInst,
NULL);

// Fensterhandle zurückgeben
return (hWnd);

} // ErstelleHauptfenster


// ErstelleSteuerelemente
//
// Alle Steuerelemente erstellen
//
void ErstelleSteuerelemente (HWND hWnd, HINSTANCE hInst)
{
// Statischen Text als Child-Fenster erstellen
//
hText = CreateWindow ("STATIC",
"Eingegebener Text",
WS_VISIBLE | WS_CHILD | ES_CENTER,
0, 0,
300, 20,
hWnd,
(HMENU)ID_STATICTEXT,
hInst,
NULL);

// Editbox als Child-Fenster erstellen
//
hEditBox = CreateWindow ("EDIT",
"Bitte Text eingeben",
WS_VISIBLE | WS_CHILD | WS_BORDER,
0, 20,
300, 20,
hWnd,
(HMENU)ID_EDITBOX,
hInst,
NULL);

// "Übernehmen"-Button als Child-Fenster erstellen
//
hUebernehmen = CreateWindow ("BUTTON",
"Übernehmen",
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
20, 50,
95, 40,
hWnd,
(HMENU)ID_BTN_UEBERNEHMEN,
hInst,
NULL);

// "Beenden"-Button als Child-Fenster erstellen
//
hBeenden = CreateWindow ("BUTTON",
"Beenden",
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
175, 50,
95, 40,
hWnd,
(HMENU)ID_BTN_BEENDEN,
hInst,
NULL);

} // ErstelleSteuerelemente


// Callback-Funktion zur Nachrichtenverarbeitung
//
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);

}

// Ab hier die Nachrichten unserer Child-Fenster bearbeiten
case WM_COMMAND:
{
switch (wParam)
{
// Wurde "Übernehmen" angeklickt?
case ID_BTN_UEBERNEHMEN:
{
char szText[256];

// Text aus der Editbox holen
GetWindowText (hEditBox, szText, 256);

// Diesen Text in das Label schreiben und
// den Text der Editbox löschen
SetWindowText (hText, szText);
SetWindowText (hEditBox, "");

return (0);

}

// Wurde "Beenden" angeklickt?
case ID_BTN_BEENDEN:
{
int Resultat; // Rückgabewert der Messagebox

// Messagebox für Sicherheitsabfrage
Resultat = MessageBox (hWnd, "Wirklich beenden?",
"Programm beenden",
MB_YESNO | MB_ICONQUESTION);

// Wurde "Ja" angeklickt?
if (Resultat == IDYES)
{
// Ja, also Programm beenden
PostQuitMessage (0);
return (0);

}

// Nein, also ganz normal weiter
return (0);

}
} break;
} break;
}

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

} // WindowProc
( dieser ist aber selbst geschrieben ohne Visual Studio als Hilfe)

Also ich meine ein Programm, mit dem ich Fenster erstellen kann (WYSIWIG :D).

Und bei Visual C++ 2010:

Ich erstelle ein neues Win 32 Projekt und füge dann ein Windows Form Element hinzu.
Dann füge ich per "Toolbox" Sachen hinzu.

Mit dem Winapi etc. habe ich leider keine ahnung ._. .

mfg
 
Mit dem Winapi etc. habe ich leider keine ahnung ._. .

Dein Quelltext ist aber genau das ;-]
Mit dem "Winapi" ist eben gemeint, dass das Fenster komplett selber gecodet wird, ohne Wysiwyg-Zeug oder externe Bibliotheken aus dem Internet.

Für den von dir gezeigten Code ist das Win32-Projekt schon richtig.

Winforms ist allerdings was ganz anderes.
Gehört zum .NET-Framework; und der Code ist auch nicht mehr wirklich C++, sondern C++/CLI.
Schaut zwar ähnlich aus und heißt auch ähnlich, ist aber trotzdem nicht das Gleiche.

Willst du Spiele mit C++ Programmieren? Winforms ist da eher suboptimal,
ist eher auf die Sachen ausgerichtet, die du eben in der Toolbox siehst.
Buttons, Texteingabefelder, Tabellen, Comboboxen etc etc
Ist ja eher nicht das, was man für Spiele hauptsächlich braucht.
 
nein das mit Spielen ist mir erstmal egal ;)

Ich wollte mich nur mal etwas an die Materie heranwagen und versuchen einen Taschenrechner zu programmieren und dafür brauche ich ein Eingabefeld und frage deshalb hier, ob mir jemand irgenteine Funktion nennen kann, mit der ich so ein Eingabefeld in C++ machen kann und wie ich das dann in einer Variable speichern kann.

lg
 
Ich wollte mich nur mal etwas an die Materie heranwagen und versuchen einen Taschenrechner zu programmieren und dafür brauche ich ein Eingabefeld und frage deshalb hier, ob mir jemand irgenteine Funktion nennen kann, mit der ich so ein Eingabefeld in C++ machen kann und wie ich das dann in einer Variable speichern kann.
Die C++-Standardbibliothek bietet keine solche Funktion an. Du musst deshalb auf eine GUI-Bibliothek zurückgreifen. Es wurden ja schon einige Alternativen genannt. In deinem Quellcodebeispiel wird schon eine Editbox erstellt. Wo genau kommst du jetzt nicht weiter?

Grüße,
Matthias
 
Das erledigt die Funktion GetWindowText().

PS: Du kannst hier nicht direkt von C++ sprechen, im Prinzip nur bei der Syntanx, etc. Bei deinem Quelltext verwendest du - wie gesagt - die Windows API.
 
Zurück