GetWindowThreadProcessId
-
Hallo.
Ich habe da noch eine Frage:Im Windows-Fenster habe ich eine Textbox erstellt und mit einer ID versehen
hRSK1Base = CreateWindow("STATIC", "", WS_VISIBLE | WS_CHILD | SS_RIGHT, 295, 100, 500, 30, hParent, (HMENU)ID_STATICTEXT, hInst, NULL); SendMessage(hRSK1Base, WM_SETFONT,(WPARAM)SubFont,0);Wenn ich jetzt das hier aufrufe:
DWORD dwTest; GetWindowThreadProcessId (hLSK1Base, &dwTest); if (dwTest == ID_STATICTEXT) { MessageBox(NULL, "Static", "id:", 0); }bekomme ich die MessageBox nicht angezeigt.
Beim überprüfen im Debug-mode habe ich festgestellt, dass das dwTest jedes mal einen anderen Wert enthält.
Wieso liefert mir die Funktion nicht den gewünschten Wert zurück?
-
Tut sie.
-
na, dann würde es ja funkionieren, tut's aber nicht.
ID_STATICTEXT ist 3000, dwTest ist 3387. Und beim nächsten Durchlauf wieder etwas anderes. Wäre schön, wenn du deine Antwort etwas erleutern könntest.
-
ID_STATICTEXT ist keine ProcessId.
-
Aha, Danke schonmal.
Soetwas hab ich mir schon gedacht...
Gibts denn ne Möglichkeit die ID_STATICTEXT zu bekommen?
-
-
Super, vielen Dank!
-
Ok, hat soweit alles geklappt. Allerdings werde ich aus der Umkehrfunktion
( SetDlgCtrlId )
nicht wirklich schlau. Ich übergebe ja nur die ID, wie kann ich die aber dem gewünschten Handle zuweisen?
-
campinge schrieb:
Ok, hat soweit alles geklappt. Allerdings werde ich aus der Umkehrfunktion
( SetDlgCtrlId )
nicht wirklich schlau. Ich übergebe ja nur die ID, wie kann ich die aber dem gewünschten Handle zuweisen?Gar nicht. Das Handle ist der eindeutige Bezeichner für ein Fenster. Die ID kann und ist mehrdeutig und nur ein Helferlein...
Was hast Du denn vor?
-
Sorry, für Die Späte Antwort, aber ich hatte ne Menge zu tun.
Ich hatte eigentlich vor, dass über die ID ausgelesen wird, welch ein "Typ" das Feld besitzt, Sprich: Writeable, Static, Variable, etc... Die ID's dafür hab ich alle schon definiert und kann sie halt auslesen, aber wenn ich die nicht änderen kann, müsste ich das komplette Window ja eigentlich leeren und neu erstellen.
Oder gibts da einen eleganteren Weg.Soll halt eine Art Handymenü" werden, sprich man kann durch verschiedene Seiten blättern und hat dort überall verschiedene Eingabemöglichkeiten...
Hier mal ein paar Seitendarstellungen:
http://www.b737.org.uk/images/fmc_pos_3.gif
http://www.b737.org.uk/images/fmc_crz_econ.gif
http://www.b737.org.uk/images/fmc_irs_legs.gif
-
Du kannst die ID nachträglich nicht ändern (zumindest kenne ich keinen Weg, und würde es auch in deinem Fall nicht machen).
Was du machen kannst, ist z.B. eine map<> zu verwenden, in der du die diversen Flags einer ID zuordnest.
Beim Erstellen vergibst du die IDs dann so dass du alle "relevanten" Controls auseinanderhalten kannst, also normalerweise bekommt jedes Control eine eigene ID. (Manchmal vergibt man Controls die bloss "zierde" sind keine eigene ID, sondern verwendet eine einzige "Zier-Control-ID" für alle solchen Controls.)
Dann kannst du anhand der ID auf diese Flags zugreifen, und die Flags auch ändern. Beispiel:
std::map<int, int> g_flagsByControlID; void InitializeDialog() { // ... g_flagsByControlID[IDC_OK_BUTTON] = 123; g_flagsByControlID[IDC_CANCEL_BUTTON] = 42; // ... } void Foo() { int controlID = ...; int flags = g_flagsByControlID[controlID]; // Flags lesen if (...) { g_flagsByControlID[controlID] = flags | 8; // Flags ändern } }