Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.11.2012, 18:04

C++ / WINAPI Static Text aus Variable updaten

Moin.

Der Titel ist villt etwas verwirred, ich wusst aber nicht wie ichs besser beschreiben soll.

Mein Problem:

Ich möchte den Text von nem CHild-Window ändern( STATIC).

Dazu die Funktion

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void updateText(HWND hText)
{   

    SetWindowText(hText,L"Geaendert");

}
//ODER
void updateText(HWND hText)
{   

    SetWindowText(hText,TEXT("Geaendert"));

}

Die beiden Möglichkeiten funktionieren auf jeden Fall .
Ich will jetz aber bei der Funktion updateText noch den Text angeben der neu in das Fenster geschrieben werden soll.


Dazu hätte ich folgende Lösungen gehabt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//1)
void updateText(HWND hText,std::string str)
{   

    SetWindowText(hText,str);

}
//2)
void updateText(HWND hText,std::string str)
{   

    SetWindowText(hText,TEXT(str));

}


Beide funktionieren nicht.
Bei der ersten kommt logischerweise die Fehlermeldung ,dass std::string nicht in LPCWSTR konvertiert werden kann
& bei der zweiten,kommt die Fehlermeldung : "error C2065: 'Lstr': nichtdeklarierter Bezeichner" .

Kann mir da jemand helfen ?
Oder sollte ich einfach eine andere Funktion zum ändern des Textes nehmen als "SetWindowText"?

Danke schonmal.
*grins*
*grins*

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

27.11.2012, 18:15

Einfache Lösung: Verwend SetWindowTextA(). ;)

Prinzipiell gibt es 3 Möglichkeiten:

C-/C++-Quelltext

1
2
3
4
5
SetWindowText(hWnd, TEXT("blub"));

SetWindowTextA(hWnd, "blub");

SetWindowTextW(hWnd, L"blub");

Das A kennzeichnet die ANSI (char*) Variante der Funktion, das W die Unicode Variante (wchar_t*). Die Version ohne Anhängsel ist ein Makro, das, je nachdem ob das Projekt auf UNICODE gestellt ist (was der Standardeinstellung entspricht) oder nicht, entweder zur A oder zur W Variante wird. TEXT() ist ein Makro, das einfach, wieder je nachdem ob UNICODE definiert ist oder nicht, an alles was es übergeben bekommt ein L vorn dranhängt oder nicht.

Heutzutage gibt es aber keinen wirklichen Grund mehr, etwas anderes als Unicode zu benutzen. Daher imo bessere Lösung: Verwend durchgehend std::wstring und die W Varianten aller API Funktionen.

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »dot« (27.11.2012, 18:42)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

3

27.11.2012, 20:27

Außerdem musst du c_str() aufrufen, um einen std::string in char * zu konvertieren:

SetWindowText(hText, str.c_str());

4

27.11.2012, 20:27

Laut MSDN (http://msdn.microsoft.com/en-us/library/…v=vs.80%29.aspx)( wenn ichs richtig verstanden hab) erzeuge ich einen wstring so :

C-/C++-Quelltext

1
std::wstring str (L"abc")


Funst auch ohne Fehler.
Wenn ich jetz die Methode schreib,bekomm ich ne Fehlermeldung (error C2664: 'SetWindowTextW': Konvertierung des Parameters 2 von 'std::wstring' in 'LPCWSTR' nicht möglich).

C-/C++-Quelltext

1
2
3
4
5
void updateText(HWND hText,std::wstring str)
{   
    SetWindowTextW(hText,str);

}

Irgendwie startet des Programm trotzdem und zeigt da wo abc stehn sollte irgendwelche Zeichen an.
Des müsste doch eigentlich soweit stimmen oder ?
Das irritiert mich grad etwas :o

EDIT:
Hab den Post über mir erst danach gesehn. :) Danke !
*grins*
*grins*

5

02.12.2012, 17:20

Wenn du Microsoft Visual c++ 2010 Express nutzt, geh unter Projekt -> Projekt eigenschaften -> Konfiguratinseigenschaften -> Allgemein und setze dort Zeichensatz von "Unicode Zeichensatz verwenden" auf "nicht festgelegt". Dann solltest du auch auf das L vor "abc" oder auf TEXT( "abc" ) verzichten können.
Hoffe es hilf. ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

02.12.2012, 23:14

Das ist die Lösung, die ich einem Anfänger empfehlen würde, der sich mit diesen Problemen nicht weiter befassen sollte, weil er besseres zu tun hat. Für eine ernsthafte Anwendung ist das aber imo keine Option. ;)

Werbeanzeige