Allgemeine Frage zum HWnd und ob Realisierbar?!?!?!
-
Servus,
ich habe mal eine Frage zu den Handle in meinem Dialog. Gibt es eigentlich eine Möglichkeit alle Handle in meinem Dialog von jedem Objekt zu bekommen???
Das Vorhaben von mir ist relativ simple. Ich würde mir gerne alle Handle einer bestimmten Klasse z.B. CEdit anzeigen lassen. Diese Handle übergebe ich dann nach für nach in eine Funktion um z.B. diese inaktiv zu schalten. Jeder kennt bestimmt das Problem das man für verschiedene Buttons, Editfelder usw. bestimmte Eigenschaften während der Laufzeit zuordnen will. Da es immer eine ellenlange Liste mit membervariablen etc. für jedes Editfeld, Buttons und sonstiges gibt wollte ich das mal über handle realisieren.
Vielleicht hat das schon jemand gemacht dann wärs nett wenn er mir eine kleine Hilfestellung gibt. Wie gesagt die Vorraussetzungen sind dafür das ich im Vorraus nicht weiss wieviele Buttons Edits etc. ich in meinem Dialog habe. Diese soll er anhand des Handles ermitteln. Durch das Handle kommt man auch an die Klasse heran.
Bin für jede Antwort dankbar...
*winke*
Hellsgore
-
Hallo

Mmh, kann sein das ich das nicht richtig verstanden habe, aber mitGetDlgItem( ID )bekommst Du doch ein Handle auf ein Objekt Deines Dialogs. So hole ich mir immer ein Handle z.B. auf ein CEdit um es beispielsweise inaktiv zu schalten. Dazu brauch man dann keine Control-Membervariable.
Wenn Du das ganze allerdings so machen willst, dass man die Objekt-Ids nicht kennt und einfach alle Steuerelemente Deines Dialogs inaktiv werden sollen, das fällt mir jetz spontan nicht ein.
-
Servus,
Thx für Antwort. Aber das Problem was bisher besteht ist, wie du zum Schluss erkannt hast, das ich nichts über die Objekte weiss ausser deren Klasse. Ich weiss das ich Editboxen der Klasse CEdit in meinem Dialog habe. Jetzt möchte ich wissen wieviele und deren Handle herausfinden.
Gibt es noch weitere Vorschläge??
THX
Hellsgore
-
Hab grad nochmal nachgeschaut:
Wie wärs denn wenn Du mit CDialog::NextDlgCtrl() über alle Controls iterierst und sie mit GetDlgItem() aktiv/inaktiv schaltest?
-
EnumChildWindows
-
Servus,
@msdn
The EnumChildWindows function enumerates the child windows that belong to the specified parent window by passing the handle to each child window, in turn, to an application-defined callback function. EnumChildWindows continues until the last child window is enumerated or the callback function returns FALSE.
Du weisst ja das ich damit nicht alle Objekte bekomme?
Habe damit schonmal gearbeitet als ich am Testen war wie ich alle Handles von den Fenster holen kann. Dabei war ich schonmal auf die Funk gestoßen. Hat aber meiner Ansicht glaube ich nichts hiermit zu tun.@Cosmixx
Eine Recht gute Idee doch leider hat das Ding keinen Rückgabewert.Moves the focus to the next control in the dialog box.
void NextDlgCtrl( ) const;
Remarks
If the focus is at the last control in the dialog box, it moves to the first control.Schade drum wäre ne Idee gewesen. Damit kann ich nur den Focus auf jedes Objekt setzen. Dann kann ich dann auch den Focus abfragen von jedem Objekt und dann vielleicht auf das Objekt kommen. Ist aber wirklich sehr sehr sehr umständlich.
Habt ihr sonst noch Ideen?
THX
Hellsgore
-
Ich hab sowas mal mit GetNextDlgTabItem gemacht - war aber auch nicht das Gelbe vom Ei.

-
Dann hab ich wohl dein Problem missverstanden.

Mit EnumChildWindows kriegst du doch jedes Handle von den Child Fenstern auf deinem Dialog.
-
Servus,
@msdn
Ja war leider missverstanden von dir. Will ja die Objekte haben nicht die Childfenster.@estartu_de
GetNextDlgTabItem Ich werde irgendwie nicht daraus schlau. Er gibt dir nen Pointer zurück von dem ersten Objekt auf dem ein Tabstop liegt? Das würde also bedeuten das ich auf das erste Objekt auf jenes ich mit einem Tab springen kann, er mir einen Pointer zurückgibt?--------
Also zum Verständnis...
Ich weiss:
- Die Klasse des Objekts
- Ich kenne das Parent- und ggf. das ChildWindowIch würde gerne wissen:
- Das Handle des Objekts
- ggf. ID des Objekts
- Pointer des ObjektsIrgendwie gibs da doch bestimmt eine Möglichkeit. Codeguru, Codeproject, Google spucken da nicht wirklich etwas darüber heraus.... oder ich habe nicht gründlich gesucht.
Vielleicht noch weitere Ideen?
THX
Hellsgore
-
Hmm, also bevor du gar nix mehr weißt...
Mach eine Klasse für deine Edits und lass die sich beim Erstellen beim Dialog anmelden. Der Dialog kann die sich dann merken und später ohne Probleme darauf zugreifen. Vielleicht nicht super elegant aber es sollte funktionieren.
-
Servus,
@estartu_de
Tja dann müsste ich mir aber für ComboBoxen, Listenfelder etc. wiederrum eine Klasse erstellen. Das ist wirklich nicht ganz das gelbe vom Ei. Währe aber einen Versuch werd. Doch müsste man dann in einem neuen Projekt abermals neue Klassen deklarieren und das will ich halt nicht.... Schade aber schöne IdeeVielleicht noch was anderes??
THX
Hellsgore
-
Servus,
habe da eine Lösung wenn es jemand interessiert. Gerade erstellt also ganz frisch und noch warm
also msdn hat doch recht gehabt mit seinem EnumChildWindow. Ich habe mir das mal etwas genauer angeguckt und kam zum Ergebnis:BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam) { CWnd* cWndTest = FromHandle(hwnd); cWndTest->EnableWindow(FALSE); return TRUE; } void OnBnClickedButton1() { EnumChildWindows(this->m_hWnd,EnumChildProc, (LPARAM)this); }Vorsicht wer das ausführt beim dem werden erstmal alle Controls etc. auf Enable FALSE gesetzt. Aber ein dickes THX an euch alle und an msdn der im Prinzip die Lösung auf der Zunge hatte aber etwas anderes dachte

THX
Hellsgore