Forum: PC-Programmierung C - Visible-Eigenschaft von einem Dialog-Item einstellen


von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Lesenswert?

Hallo Forengemeinde,

habe u.A ein/mehrere Dialog's in meinem C-Projekt erstellt. Auch sind da 
Bitmaps (kleine grüne/rote Punkte) die ich als BMP erstellt habe, und in 
den Dialog plaziert habe.

Nun möchte ich diese Bitmaps mit der Visible-Eigenschaft 
sichtbar/unsichtbar machen. Und dies vom C-Code aus.

bitte, mit welchen Befehlen wird dies erreicht?
Wir sind hier bei ganz normalen C.

Habe schon ausgedehnt im Netz gesucht, unter C-HowTo, StackOverflow, 
ect. . Bin aber nicht fündig geworden. Meine C-Bücher (Api-Bible) sind 
bislang verschollen.

von Michael B. (laberkopp)


Lesenswert?

Thomas S. schrieb:
> Wir sind hier bei ganz normalen C.

ShowWindow(GetDlgItem(ID),SW_SHOWNA); bzw. SW_HIDE.

von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Lesenswert?

Danke Dir, bringt aber Fehler.

Füge mal einen Schnipsel meines Codes hier rein, der soweit 
funktioniert.
1
SetDlgItemInt(hDlg, IDC_WaitTime_7, Speicher_Inhalt [7][6], TRUE); // Pausenzeit reinschreiben
2
SetDlgItemInt(hDlg, IDC_Loops_7, Speicher_Inhalt [7][7], TRUE);     // Loops, Waits, noch klären
3
4
//SetDlgItemInt(hDlg, IDC_Running_4.Visible = FALSE);
5
6
ShowWindow(GetDlgItem(IDC_Running_4),SW_HIDE);

'IDC_Running_4' ist das bmp im Dialog.

Dies bringt Fehler:
...r.c(1535) : warning C4022: 'GetDlgItem' : pointer mismatch for actual 
parameter 1
...r.c(1535) : error C2198: 'GetDlgItem' : too few actual parameters

von Udo K. (udok)


Lesenswert?

GetDlgItem braucht ein Handle auf den Dialog als erstes Argument, die ID 
ist das zweite Argument.
https://learn.microsoft.com/de-de/windows/win32/api/winuser/nf-winuser-getdlgitem

von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Lesenswert?

Udo K. schrieb:
> GetDlgItem braucht ein Handle auf den Dialog als erstes Argument,

Hallo und danke an die Mitwirkende.

Das war es. Das Handle fehlte. Hätte mir auch auffallen sollen/können. 
Aber danke. Ich dachte vorher, wenn einzelne Editfelder, ect. mit
SetDlgItemInt(hDlg,....
angesprochen werden, dann sollte es auch für dieses Bitmap, das mir nur 
einen farbigen Punkt darstellt, gelten.

von Hmmm (hmmm)


Lesenswert?

Thomas S. schrieb:
> Ich dachte vorher, wenn einzelne Editfelder, ect. mit
> SetDlgItemInt(hDlg,....
> angesprochen werden, dann sollte es auch für dieses Bitmap, das mir nur
> einen farbigen Punkt darstellt, gelten.

Generell wird erstmal alles über Handles angesprochen, es gibt bloss ein 
paar "Abkürzungen" für besonders häufig benutzte Dinge wie das Befüllen 
oder Auslesen von Werten.

Unter der Haube schickt SetDlgItemInt() ein WM_SETTEXT an das 
Window-Handle, das per GetDlgItem() ermittelt wird. Vorher macht es aus 
dem übergebenen Integer auch noch einen String.

von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Lesenswert?

Danke für die Erläuterung von Deiner Seite.

Hmmm schrieb:
> es gibt bloss ein
> paar "Abkürzungen" für besonders häufig benutzte Dinge

Als die wären?

Ich bin kein C-Guru. Kann mit C für meine Bedürfnisse umgehen, aber 
Tricks sind mir halt noch nicht geläufig.

von Hmmm (hmmm)


Lesenswert?

Thomas S. schrieb:
> Als die wären?

Neben SetDlgItemInt() gibt es im gleichen Stil noch SetDlgItemText() und 
Get* für den Rückweg.

Was weitere Vereinfachungen angeht, einfach mal die Doku durchlesen, da 
steht immer dabei, was die einzelnen Funktionen und Macros tun. Meistens 
läuft es auf das Senden von Window Messages an die jeweiligen Controls 
hinaus.

Thomas S. schrieb:
> Ich bin kein C-Guru.

Das ist allerdings nicht wirklich ein C-Thema, sondern betrifft nur die 
Win32-API.

Ob man sich die als Quasi-Anfänger heute noch antun will, steht auf 
einem anderen Blatt.

von Harald K. (kirnbichler)


Lesenswert?

Hmmm schrieb:
> Ob man sich die als Quasi-Anfänger heute noch antun will, steht auf
> einem anderen Blatt.

Ich würds ja auch vermeiden (einfach, weil ich's kenne), aber wenn es 
nötig ist, kann ich folgenden Literaturhinweis geben:

Charles Petzold, "Programming Windows", vierte oder fünfte Ausgabe.

Wird man nur noch antiquarisch bekommen, die sind von 1996 bzw. 1998. 
Neuere Bücher mit ähnlichem Titel sind ungeeignet.

Ältere Ausgaben sind auch ungeeignet, da die noch 16-Bit-Windows 
beschreiben (die erschienen 1988, 1990 und 1992).

Das hier ist die 5. Ausgabe:
(drei Sekunden Google-Suche, erster(!) Treffer)

https://www.cl72.org/100winProg/Charles%20Petzold%20-%20Programming%20Windows%20-%205th%20Ed.pdf

: Bearbeitet durch User
von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Lesenswert?

Hmmm schrieb:
> Ob man sich die als Quasi-Anfänger heute noch antun will, steht auf
> einem anderen Blatt.

Was ist dann als Nachfolger C zu verstehen? - C++, C#?

Objektorientiert ist für mich irgendwie ne Hürde. Hatte ich schon 
mehrfach versucht zu starten, aber Klassen, Container Vererbung, blabla 
sind irgendwie abstakt. Hab Bücher schon ewig da, mal sehen.

von Hmmm (hmmm)


Lesenswert?

Harald K. schrieb:
> Charles Petzold, "Programming Windows", vierte oder fünfte Ausgabe.

Der Empfehlung schliesse ich mich an, steht hier auch seit zig Jahren im 
Regal.

Thomas S. schrieb:
> Was ist dann als Nachfolger C zu verstehen?

Nochmal: Es geht hier NICHT um die Programmiersprache, sondern um die 
Win32-API, die keineswegs der einzige Weg ist, Windows-GUI-Anwendungen 
zu erstellen.

Plattformübergreifend gibt es z.B. GTK (C) oder Qt (C++). Such Dir was 
aus:

https://en.wikipedia.org/wiki/List_of_widget_toolkits

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Thomas S. schrieb:

> Was ist dann als Nachfolger C zu verstehen? - C++, C#?
>
> Objektorientiert ist für mich irgendwie ne Hürde.

Ja, das Konzept ist nicht leicht zu knacken, wenn man von rein 
prozeduraler Programmierung kommt. Hat bei mir auch etwas gedauert, bis 
es Klick gemacht hat. Ist aber zum Glück Jahrzehnte her, dass ich diese 
Hürde genommen habe.

> Hatte ich schon
> mehrfach versucht zu starten, aber Klassen, Container Vererbung, blabla
> sind irgendwie abstakt.

Nunja, benutzen tust du es zwangsläufig trotzdem, selbst wenn du nur via 
WinAPI in C programmierst. Was da letztlich angesprochen wird, sind auch 
wieder praktisch durchgängig Objekte.

Es ist aber ein wesentlicher Unterschied, ob man bestehende Objekte 
verwendet oder selbst objektorentiert programmiert. Für ersteres braucht 
man die OO-Konzepte oft nicht wirklich zu verstehen, insbesondere dann 
nicht, wenn die Objekte wiederum über ein C-API präsentiert werden. 
Nützlich ist es allerdings oft trotzdem. Schon um zu verstehen, warum 
das C-API so aussieht, wie es halt aussieht.

Dein Fehler wäre dir z.B. nicht unterlaufen, wenn du das Konzept kennen 
würdest. Da wäre dir sofort aufgefallen, dass da wohl noch was fehlen 
muss.

Allerdings: kurze Lektüre der API-Referenz hätte das Problem genauso 
geklärt. Ist ja nicht so, das MS die unter Verschluß hält. Nö, man kann 
die für lau im Internet nachlesen. Jederzeit...

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.