Forum: PC-Programmierung Frage zu printf in Visual C++ Express 2005


von Moses (Gast)


Lesenswert?

Hi,

ich fuchse mich gerade in Visual C++ Express 2005 rein und
habe es auch schon geschafft ein Fenster mit Schaltflächen
zu Erstellen und beim Klick auf Buttons etc. Aktionen
auszulösen (z.B. Message-Boxes).

Aber an so einfachen Dingen wie einen Text in einem Fenster
auszugeben scheitere ich. In Konsolenanwendungen gibt es
dafür ja printf. Bei Studio passiert aber nichts, wenn ich
den Befehl benutze. Fehlt da noch ein Hinweis, WO der Text
ausgegeben werden soll? Ich habe z.B. eine Textbox erstellt,
aber wie bekomme ich da jetzt einen variablen Text hinein?
Also nicht vorher initialisieren, sondern zur Laufzeit bei
einem Ereignis (z.B. OnClick) den Text dort erscheinen
lassen...

In der Hilfe werde ich mit allem möglichen Erschlagen, nur
das gewünschte - einfache Beispiel - finde ich nicht.

Dann suche ich noch eine einfache Dropdownbox. Scheinbar
finde ich die nicht. Ich sehe in der Toolbox nur Listbox
und Combobox.
Muss man die Combobox per Parameter zur Dropdownbox
degradieren? Ich möchte nicht, dass die Möglichkeit
besteht, selbst etwas einzugeben. Es soll lediglich
ein Dropdownfeld geöffnet werden, wie man es aus
vielen vielen Anwendungen kennt.

Und gibt es eine gute und einfache Einführung in das
Programm? Ich meine damit etwas Praxisbezogenes, dass
sich auf die grundlegenden Bedürfnisse von Anfängern
der GUI-Programmierung bezieht, so wie ich sie hier
gerade mit einigen Beispielen beschrieben habe. Mit
Threads und ähnlich komplexen Dingen beschäftige ich
mich dann gerne später.

Viele Dank.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Bei Studio passiert aber nichts, wenn ich
> den Befehl benutze. Fehlt da noch ein Hinweis, WO der Text
> ausgegeben werden soll?

Nö. printf gibt auf stdio aus, und das ist bei einer Windows-Applikation 
normalerweise nicht sichtbar. Dafür gibt es Konsolenapplikationen.

Wenn Du aber mit Windows-GUI-Elementen arbeitest, und darauf lassen 
Deine weiteren Fragen schließen, dann müsstest Du entweder mit 
AllocConsole Dir ein Konsolfenster erzeugen und obendrein auch noch 
stdio auf diese Konsole umbiegen (kann ich gerade offhand nicht 
beschreiben, wie's geht, habe ich vor 10+ Jahren in der MSDN gelesen).

Comboboxen können in der Tat zu Dropdown-Listboxen degradiert werden, 
das macht man mit dem Resourceeditor.

Wenn Du mit "Visual C++ Express" GUI-Applikationen schreibst, dann tust 
Du das entweder in reinem C/C++ mit direkten Aufrufen der 
Windows-API-Funktionen (haariger Weg mit Nachrichtenschleife und 
ellenlangen switch-case-Statements) oder aber in einer MS-Perversion von 
C++ namens "Managed C++" mit der das .Net-Geraffel und Winforms 
angesprochen werden können.

Für ersteres ist immer noch das Buch von Charles Petzold der Klassiker, 
der beschreibt, wie die Windows-API funktioniert, und zwar in C. Wer 
damit klarkommt, der wird begreifen, warum C++ schick sein kann und 
warum es Klassenbibliotheken wie die (nicht vollkommen zu Recht) 
verfemte MFC, wxWidgets, Qt etc. gibt.

MFC kannst Du mit VC2005 Express nicht programmieren (soweit ich weiß), 
da die Unterstützung dafür in dieser kostenfreien Edition von VC2005 
fehlt.

von Moses (Gast)


Lesenswert?

Hi,

ich hatte eigentlich nicht vor in einer GUI dann noch mit Konsole
anzufangen =) Da wollte ich ja gerade von weg.

>>Comboboxen können in der Tat zu Dropdown-Listboxen degradiert werden,
>>das macht man mit dem Resourceeditor.

So ganz verstanden habe ich das jetzt nicht. Ich habe in der Doku
den Hinweis auf Winres.exe gefunden, allerdings war der Text so
gehalten, dass man auch ohne Weiteres annehmen könnte, dass der
Resource Editor auf irgendeine geheime Weise in Studio 2005 Express
bereits integriert ist, aber unter einem Editor stelle ich mir immer
ein separates Programm vor, dass ich erst bewußt starten muss.
Eine Winres.exe habe ich auf meiner Platte aber nicht gefunden.

Es hat mich schon bei WordVBA gewundert (habe letztens ein kleines
Formular programmiert), dass es keine reinen DropDown-Boxen mehr
gibt.
Eigentlich vermutete ich, dass ich nur in den Eigenschaften der
ComboBox irgendwo ein True auf False setzen muss, um meine
DropDown-Box zu bekommen. Aber da habe ich nichts gefunden.

>>entweder in reinem C/C++ mit direkten Aufrufen der
>>Windows-API-Funktionen

Meinst Du damit Abläufe wie "WMPaint, PAINTSTRUCT, BeginPaint und
TextOut"?

>>oder aber in einer MS-Perversion von C++ namens "Managed C++" mit
>>der das .Net-Geraffel und Winforms angesprochen werden können.

Hmmm...also konstruiert Visual Studio die GUI über .NET bzw. WinForms.
Jetzt weiß ich auch, warum ich bei der Installation .NET herunterladen
musste! =)

Verstehe ich das richtig, das Managed C++ so eine Art "Slang" ist,
der nicht zum Standard gehört, mit dem es aber mit relativ einfacher
Befehls-Syntax möglich wäre, "mal eben" einen beliebigen Text an
einer bestimmten Stelle in einem Windows-Fenster auszugeben?

Danke schonmal...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nein, der Resource-Editor ist ein integraler Bestandteil von VC2005, so, 
wie er es auch schon bei den zig Vorgängerversionen war.

Das ist halt der Programmteil, mit dem man sich Dialoge zurechtmalt, 
Windows-Controls darauf plaziert und denen Resource-IDs zuweist. Und mit 
rechtsklick auf ein Control dessen Eigenschaften bearbeiten kann.

Die Eigenschaft einer Combobox, auch Dropdown-Liste zu sein, ist 
inhärent im Windows-Control "Combobox" enthalten - das ist keine 
Funktion von VC, irgendeiner Klassenbibliothek oder sonstwem.

Text in einem Windows-Fenster ausgeben? DrawText, aber das gehört in den 
Messagehandler von WM_DRAW.

Das allerdings wird durch das .Net/Winforms-Geraffel mit mehrern 
Abstraktionsschichten überzogen, so daß ich Dir beim besten Willen nicht 
sagen kann, wie das da funktioniert.

Ich habe meine ersten Windows-Programme in klassischem ANSI-C 
geschrieben, ohne Visual Studio (gabs damals noch nicht) und mit dem 
Petzold in der Hand.
Weia. Lange her.

von arc (Gast)


Lesenswert?

> Verstehe ich das richtig, das Managed C++ so eine Art "Slang" ist,
> der nicht zum Standard gehört, mit dem es aber mit relativ einfacher
> Befehls-Syntax möglich wäre, "mal eben" einen beliebigen Text an
> einer bestimmten Stelle in einem Windows-Fenster auszugeben?

So ähnlich.
Entweder den Text der TextBox (z.B. aTextBox->Text = "asfd") ändern, 
oder
den Text im Paint-Event selbst zeichen.
1
public ref class Form : ... {
2
    
3
    ...
4
    
5
    // Vom Designer erzeugter Methodenrumpf
6
    private: System::Void Form_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
7
        e->Graphics->DrawString(str, Form->Font, Brushes::Black, x, y);
8
    }

> Dropdown-Boxen
Um aus der Dropdown-Box (ComboBox) eine DropDown-ListBox zu machen, muss 
nur die entsprechende Eigenschaft "DropDownStyle" geändert werden.

> Das ist halt der Programmteil, mit dem man sich Dialoge zurechtmalt,
> Windows-Controls darauf plaziert und denen Resource-IDs zuweist.
Es gibt im NetFramework keine Resource-IDs, sondern nur Quelltext (mit 
Ausnahmen)

von Karl H. (kbuchegg)


Lesenswert?

Machts doch nicht komplizierter als notwendig.

Der OP hat einen Dialog.
In dem Dialog gibt es einen Button und ein Textedit.
Wenn er auf den Button drückt, soll im Textedit ein
Text erscheinen.
So zumindest interpretiere ich:

> Fehlt da noch ein Hinweis, WO der Text
> ausgegeben werden soll? Ich habe z.B. eine Textbox erstellt,
> aber wie bekomme ich da jetzt einen variablen Text hinein?
> Also nicht vorher initialisieren, sondern zur Laufzeit bei
> einem Ereignis (z.B. OnClick) den Text dort erscheinen
> lassen...

Im VStudio im Resource Editor den Dialog aufmachen.
Dann klickst du das Text Feld an.
Rechte Maustaste und aus dem Menü wählst du aus: "Variable
hinzufügen".

Da geht dann ein Dialog auf, in dem die Eigenschaften
der Variablen festgelegt werden. Ganz rechts, unter
"Kategorie" wählst du aus 'Value'. (Der Variablentyp
wechselt daraufhin zu CString). Jetzt gibst du noch
einen Variablennamen dafür ein und "Fertig stellen".

Diese neue Variable wird mit ein paar Makros mit
dem Text Feld verknüpft. D.h. Du weist dieser Variablen
was zu und rufst hinterher UpdateData(FALSE) auf.
Der UpdateData Aufruf transferiert den String von
der Variablen in die Textbox, bzw. wenn es UpdateData(TRUE)
war umgekehrt von der Textbox in die CString Variable.

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger wrote:
> Machts doch nicht komplizierter als notwendig.
>

Au weia. Ich hab ja gar nicht nachgefragt ob er Forms
oder MFC programmiert.

von Christian R. (supachris)


Lesenswert?

Hat die Express-Version überhaupt den Ressourcen-Editor und 
Klassen-Assistenten? Ich glaub die haben doch da alles wegkastriert.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Express-Version unterstützt keine MFC.

Sonst hätte ich ähnliches wie Karl Heinz beschrieben ...

von Karl H. (kbuchegg)


Lesenswert?

Rufus t. Firefly wrote:
> Die Express-Version unterstützt keine MFC.
>

Das ist schlecht.

> Sonst hätte ich ähnliches wie Karl Heinz beschrieben ...

Dann bin ich wohl mit der Lösung draussen.
Man kann über MFC schimpfen soviel man will,
aber wenn man den Bogen erst mal raus hat, ist sie
gar nicht so schlecht.

von Dirk (Gast)


Lesenswert?

Alles ganz schoen Aufwendig um ein paar Texte und Zahlen in einer 
Textbox anzuzeigen.

von Moses (Gast)


Lesenswert?

Hi,

da sind ja doch einige Antworten zusammegekommen...ich habe
es inzwischen hinbekommen, zumindest die Textboxen mit variablen
Text zu füllen. Vielen Dank. Aber da sich meine Wünsche allgemein
wohl als etwas schwierig darstellen, frage ich mal anders:

Ich habe damals auf dem 68000er viel GUI mit Assembler programmiert,
da gab es bei der Workbench auch eine recht brauchbare API für
graphische Benutzerdialoge und Dateisystemoperationen und von
daher bin ich - was die reine Lehre der Programmierung betrifft -
sicherlich kein Anfänger, würde mich aber nur ungern in eine
äußerst komplizierte proprietäre Technik reinarbeiten, die gerade
in Bezug auf Windows Vista keine Zukunft hat. Es geht mir also
darum, den klassischen C/C++ Code professionell zu erlernen
(quasi die ObjektOrientiertheit ins Gehirn saugen...) und für
das bunte Drumherum simple Funktionsaufrufe zu kennen, mit denen
man ohne Probleme eine GUI inklusive OnClickEvents auch ohne
einen graphischen Editor zusammenprorammieren kann. Ich habe
in diesem Zusammenhang schon von QuickBasic gehört, dass in
diesem Zusammenhang wohl genau diese Funktionen bieten soll.
So in der Art:
OpenWindow(XSize, YSize, Title, BGColor, ...)

Welche Entwicklungsumgebung (mit Syntax-Highlighting, Compiler,
Builder und am besten noch Debugger) ist denn zu empfehlen, um
auf der einen Seite sowohl klassischen C bzw. C++ Code in eine
autarke Exe kompilieren zu können, als auf der anderen Seite
nicht das Rad neu erfinden zu müssen, um ein einfaches Fenster
mit Schaltflächen und OnClickEvents zu erstellen? Kostenlos
wäre natürlich prima, aber ich bin auch gerne bereit, etwas
zu investieren, wenn ich dafür ein Produkt erwerbe, dass mir
für die nächsten Jahre und gerade in Bezug auf WindowsVista
Planungssicherheit gibt.

Wenn ich das richtig verstanden habe, bräuchte ich - um zumindest
unter Windows eine zukunftssichere GUI zu erstellen - eine IDE
mit MFC-Unterstützung. InLineASM-Unterstützung wäre natürlich der
absolute Hit.

von arc (Gast)


Lesenswert?

> Ich habe damals auf dem 68000er viel GUI mit Assembler programmiert,
> da gab es bei der Workbench auch eine recht brauchbare API für
> graphische Benutzerdialoge und Dateisystemoperationen
Boopsi, Viewports, datatypes.library und BCPL-Pointer ;-)

> und von
> daher bin ich - was die reine Lehre der Programmierung betrifft -
> sicherlich kein Anfänger, würde mich aber nur ungern in eine
> äußerst komplizierte proprietäre Technik reinarbeiten, die gerade
> in Bezug auf Windows Vista keine Zukunft hat.
> Wenn ich das richtig verstanden habe, bräuchte ich - um zumindest
> unter Windows eine zukunftssichere GUI zu erstellen - eine IDE
> mit MFC-Unterstützung.

Zukunftssicher und MFC schließen sich aus (ausser man will jedes Rad in 
allen Formen neuerfinden)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.