CString in HWND umwandeln



  • Hallo, mein Problem ist folgendes:

    Ich habe ein CStringArray:

    CStringArray HWNDArray;
    

    In einer Funktion in der ich alle Kindfenster eines Elternfensters durchgehe, fülle ich das CString Array mit den HWNDs der Kindfenster/-elemente, die ich zuvor in CStrings umwandle.
    Ich möchte dieses CStringArray nutzen, weil es bestimmte Vorteile hat.

    Die HWND-Werte werden zunächst folgendermaßen von mir in CStrings umgewandelt.

    CString str;
    str.Format("8X", hWnd);
    

    Nun möchte ich in einer anderen Funktion die CStrings aus dem Array wieder in HWND umwandeln, wie kann ich da vorgehen?

    Folgendes Konstrukt funktioniert nicht:

    HWND Test = (HWND)HWNDArray.ElementAt(i);
    


  • Interessante Idee... 😮

    Tja, entweder gibts sowas wie atoi auch für Hex - oder du musst das von Hand machen.
    Warum ist es denn gerade ein CStringarray? Und kein CArray<HWND, HWND>? 😕



  • Na ja, dieses atoi für Hexzahlen bräuchte ich dann ja noch. 😉

    Ich möchte ein CStringArray nutzen, da es die Funktionen RemoveAll(), GetSize() etc. bietet und ich damit immer recht gut umgehen konnte.

    Wie könnte man eine atoi-Funktion für Hexzahlen selbst erstellen, so dass die HWNDs wieder korrekt aus den CStrings zurückverwandelt werden können? 😕



  • Dressman1981 schrieb:

    Ich möchte ein CStringArray nutzen, da es die Funktionen RemoveAll(), GetSize() etc. bietet und ich damit immer recht gut umgehen konnte.

    Hmmm ... bietet die CArray nicht auch? Also die beiden genannten zumindest.

    Aber ansonsten wär' halt noch die Frage, warum Du den String, wenn Du ihn denn unbedingt nutzen willst, denn dann in Hex speicherst. Direkt als Dezimalzahl könntest Du dann atoi wieder nutzten. Oder willst Du die Hexdarstellung zwecks Anzeige?

    Gruss,
    Qweety



  • CArray kann das auch.

    Ersetz mal spaßeshalber CStringArray durch CArray<HWND, HWND> und guck, was du für Meldungen bekommst. 🙂
    (Klar, das Format funktioniert dann nicht mehr...)



  • Hallo ihr beiden, also ich hab das mit dem CArray umgesetzt und es funktioniert wunderbar, ich weiß auch nicht warum ich angenommen habe, das die gewünschten Arrayfunktionen nur für CStringArray nutzbar wären!

    @Qweety@work:
    Du hast Recht, ich habe aus Formatgründen die Darstellung gewählt.

    Danke für den Tip noch mal!

    -closed-



  • Nicht closed.

    Du weißt schon das ein HWND ein Handle ist.
    Hast du schon mal versucht eine Zeiger als CString abzubilden?

    Ein Zeiger ist eine Adresse auf einen Speicherbereich.
    Ein CString ist eine Klasse für Zeichenketten.

    Um Zeiger zu speichern gibt es eigene Klassen in der MFC.



  • Hey Unix-Tom,

    ich hab den Post schließen lassen, weil ich nun mit der CArray-Klasse arbeite und daher mein Problem nicht mehr besteht.

    Aber deine Anmerkungen sind völlig korrekt.
    Falls jemand doch wieder erwarten das CStringArray einsetzen möchte, muss er davon ausgehen, dass ein HWND ein void* ist.

    HWND Test;

    CString TestString;
    TestString.Format(_T("%X"), Test);

    std::basic_istringstream<TCHAR> iss(TestString.GetBuffer());
    TestString.ReleaseBuffer();

    void* p = 0;

    if (iss >> p && ::IsWindow(Test = static_cast<HWND>(p) ) )
    {
    }
    else
    {
    // Fehler
    }



  • Mal abgesehen von deinem Problem, kannst Du kein Posting schließen lassen.

    Ein Posting ist erst dann erledigt wenn sicher ist das ein anderen User nicht den Fehler macht einn Zeiger, Handle in einem String speichern zu wollen.


Anmelden zum Antworten