Winapi pytanie dot SetWindowText

0

Witam

Piszę w Winapi program zamieniający spalanie w litrach na 100km na galony/mila. Miałem problem z funkcją SetWindowText do wyświetlenia wyniku jako STATIC. Przy pierwszym kliknięciu przycisku wynik się wyświetlał prawidłowo, natomiast przy drugiej próbie wynik dopisywał się do poprzedniej wartości. Problem zniknął gdy użyłem wskaźnika na obiekt klasy std::ostringstream (nie przypisując mu żadnego adresu). Czy wie ktoś może dlaczego to działa ? Jeżeli w parametrze funkcji SetWindowText będzie obiekt, a nie wskaźnik to program dalej będzie dopisywał wartość jedną do drugiej. Oto kod:

DWORD dlugosc = GetWindowTextLength( Formularz );
LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
GetWindowText( Formularz, Bufor, dlugosc + 1 );
FLOAT a;
std::ostringstream * ptr = new std::ostringstream;
a = atof(Bufor);
a = litryNaGalony(a);
 *ptr << a;
SetWindowText(wynik,ptr->str().c_str());
GlobalFree(Bufor);
delete ptr;
0

Co masz na myśli mówiąc:

Jeżeli w parametrze funkcji SetWindowText będzie obiekt, a nie wskaźnik

Może wrzuć kod dla obu przypadków, o których mówisz (SetWindowText z obiektem i ze wskaźnikiem).

0

Właśnie napisałem kod z poprzednią metodą czyli przekazaniem parametru jako obiekt klasy std::ostringstream i o dziwo działa. Problem leżał w tym, że wynik dopisywał się do starego jeśli obiekt klasy std::ostringstream był zadeklarowany globalnie. Sam nie wiem dlaczego go deklarowałem globalnie. Gdy zadeklarowałem w ifie wszystko działa. Mimo wszystko nie rozumiem, dlaczego przy globalnym obiekcie wynik się dopisywał ? Pzykładowo w EDIT wpisuję wartość 12.4. Wynik jest 19, jeśli drugi raz nacisnę przycisk to wynik będzie 1919. Dlaczego nie była nadawana nowa wartość?

DWORD dlugosc = GetWindowTextLength( Formularz );
LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
GetWindowText( Formularz, Bufor, dlugosc + 1 );
FLOAT a;
std::ostringstream o;
a = atof(Bufor);
a = litryNaGalony(a);
o << a;
SetWindowText(wynik,o.str().c_str());
GlobalFree(Bufor);
0

Czekaj, czekaj, czekaj... W obu postach wrzucasz kod, który robi dokładnie to samo:

SetWindowText(wynik, x.c_str() )

Gdzie x to:

ptr->str()
// lub:
o.str()

Ale wychodzi na to samo, bo ostatecznie do funkcji SetWindowText wrzucasz to co wyrzuca c_str().

Po drugie:

Gdy zadeklarowałem w ifie wszystko działa.

W jakim ifie? Gdzie on jest?
Jeżeli chcesz, by ktoś szybko Ci pomógł, ułatw mu to - precyzuj swoje pytanie.

Mogę się tylko domyślać, że problem leży w zasięgu Twojego wskaźnika na tekst, który chcesz wyświetlić.
Mówiąc bardzo ogólnie: Jeśli wskaźnik będzie globalny inny będzie jego zakres.

0
if((HWND) lParam == Przycisk)
                   {
                        DWORD dlugosc = GetWindowTextLength( Formularz );
                        LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                        GetWindowText( Formularz, Bufor, dlugosc + 1 );
                        FLOAT a;
                        std::ostringstream ob;
                        a = atof(Bufor);
                        a = litryNaGalony(a);
                        ob<< a;
                        SetWindowText(wynik,ob.str().c_str());
                        GlobalFree(Bufor);

                        }

To jest akcja naciśnięcia przycisku. Działa. Jeśli obiekt o nazwie ob zadeklaruje globalnie to zamiast zamieniać wynik na nowy z każdym naciśnięciem przycisku to dopisuje wartość do obecnej. Nie rozumiem dlaczego nie jest nadawana nowa wartość w tym przypadku. Problem rozwiązany tylko szukam wyjaśnienia takiego zachowania programu.

0

Tak jak mówiłem: Jeśli wskaźnik, lub ogólnie zmienna będzie lokalna, to za każdym razem gdy wchodzisz do if'a zmienna tworzona będzie na nowo.
EDIT: "na nowo" oznacza w Twoim przypadku, że będzie na chłopski rozum świeża i pusta i tekst, który do niej wrzucisz, będzie jedynym.
Jednak gdy zrobisz tą zmienną globalnie, to za każdym razem gdy wejdziesz do obsługi przycisku będziesz wrzucał kolejny raz tekst do istniejącej już, wypełnionej "zmiennej" poprzednim tekstem.

0

To chciałem wiedzieć. Sądziłem, że skoro do istniejącej zmiennej wrzucę kolejną wartość to zastąpię poprzednią.

1

Na szczęście nie zastąpisz. Spójrz na ten przykład:

char hello[] = "Hello ";
char world[] = "World";

// Czy zmienna  world  nadpisuje  hello  operatorem  <<  ?
std::cout << hello << world << std::endl;

Tutaj masz nieco zawiłe (ale jednak :P ) wyjaśnienie: std::operator<<

1 użytkowników online, w tym zalogowanych: 0, gości: 1