dynamisch erzeugte Controls - welche ID ?

EriFo

Erfahrenes Mitglied
Ich möchte in meinem Dialog dynamisch mehrere ListCtrl's erzeugen. Ich mach mir aber sorgen wegen der ID - wie komme ich zur Laufzeit meines Programms an eine noch nicht vergebene Ctrl ID des Dialog bzw. an die letzte die mit dem Klassenassi festgelegt wurde.

Gibts da ne Möglichkeit ?

M.f.G. Erik
 
Im Buch "Inside Visual C++.NET" ist beschrieben, wie man Steuerelemente zur Laufzeit hinzufügt. Dort wird aber davon ausgegangen, daß man bei der Implementierung die Datenelemente und ihre ID's schon vergibt, dann die Funktion OnInitDialog überschreibt und dort in Abhängigkeit davon, was nun angezeigt werden soll, die Create-Methode für das Steuerelement aufgerufen wird.
Eine andere Möglichkeit wäre, die Steuerelemente alle zu erzeugen und über ShowWindow(SW_SHOW) oder (SW_HIDE) anzuzeigen oder zu verbergen.
Vielleicht hilft dir das.

Mfg

langer
 
Nun ich hatte da so an 25~30 ListCtrl gedacht ^-^° Das wär mir zuviel Aufwand, alsdass ich es fest im Source verankern würde - mal abgesehen, das es unschön und unflexibel ist.

Gibts nicht sowas wie WM_APP für Nachrichten <_<°
Naja - zur Not könnt ich mir wenigstens die ID's in die Resource Datei schreiben und quasie "reservieren"
 
Uups,
das ist natürlich 'ne Menge. Aber wenn man davon ausgeht, daß "Inside Visual C++" das Standardwerk zur MFC-Programmierung ist, kann man eigentlich schlußfolgern, daß es keine andere Möglichkeit gibt. Aber vielleicht hat ja jemand 'ne bessere Idee ;) .

Mfg

langer
 
EriFo hat gesagt.:
wie komme ich zur Laufzeit meines Programms an eine noch nicht vergebene Ctrl ID des Dialog

Das ist zwar mit etwas Aufwand verbunden, aber du könntest mit "EnumChildWindows()" alle Child-Windows (Steuerelemente) des Dialog holen und über "CWnd::GetDlgCtrlID()" die jeweiligen IDs auslesen dabei die höchste merken.
 
@lange 1801: das Buch klingt interessant ^^ - mal sehen ob ich das irgendwo finde ^_^

@MCoder: Schaut vielversprechend aus.

Danke an euch beide. ^-^°

M.f.G. Erik
 
Moin Moin,

Wenn man eigene Messages implementieren will gibt es ein ähnliches Problem. Dort wird einem aber durch includen von winuser.h das Flag WM_USER bereitgestellt. in dem soll die höchste vom System verwendete/erzeugte ID stehen. Bin mir jetzt zwar nicht sicher ob Controll-ID's auch dazu gehören, aber da ID's ja nix anderes als ganzzahlige Werte sind konnte ich bei mir ein solches Problem durch WM_USER +1000 (nur ein Offset) lösen/umgehen.

Code:
#define DEFINE1 (WM_USER + 1000)
#define DEFINE2 (WM_USER + 1001)

Vielleicht hilft es ja :) .

Gruss Michael
 
Das kenn ich ja aber es ist halt für Nachrichten und ich glaube mal nur für diese.
Im übrigen soll man statt WM_USER - WM_APP benutzen. ^-^°

M.f.G. Erik
 
In der resource.h gibt es ein define '_APS_NEXT_CONTROL_VALUE', das die nächste ID für ein Control angibt und nach dem Einfügen eines Controls um 1 erhöht wird, wobei getestet wird, ob es diese ID nicht schon gibt. In einem meiner Projekte, welches sehr viele Controls enthält, ist der Wert 1188, also schonmal nicht sehr hoch. Nach meiner Meinung gibt es 2 Möglichkeiten:
1. Du fängst mit Deinen Control-ID's bei z.B. 20000 an, da kannst Du ziemlich sicher sein, daß Du da keine Konflikte bekommst.
2. Du setzt den Wert von '_APS_NEXT_CONTROL_VALUE' um 1000 hoch und hast somit eine Spanne von 1000 ID's reserviert.
Ich persönlich würde Lösung 1 vorziehen.
Vielleicht gibt's ja noch mehr Lösungen, aber das fällt mir da so auf Anhieb ein.
 
^-^ Methode 1. verwende ich im moment ^^ hab aber mit der "Start ID" vielleicht etwas hoch gegrifffen ^-^ so > 300000.

M.f.G. Erik
 
Zurück