Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] Wyświetlanie kilku zmiennych za pomocą SetWindowText

Ostatnio zmodyfikowano 2012-11-15 19:14
Autor Wiadomość
hit
Temat założony przez niniejszego użytkownika
[WinAPI] Wyświetlanie kilku zmiennych za pomocą SetWindowText
» 2012-11-15 13:02:32
Witam,

pisałem wczoraj o swoim problemie z podwójnym buforowaniem wyświetlanych przez TextOut(); zmiennych
([WinAPI] Jak używać podwójnego buforowania?).

Zgodnie z zaleceniem xevuel użyłem teraz SetWindowText, aby te zmienne wyświetlić. I tutaj pojawia się pierwszy problem - czy można wyświetlać kilka zmiennych na raz (jednym poleceniem), a jeśli nie, to jak je wyświetlić jedna pod drugą? Bo jak używam dwa razy tego polecenia to wyświetla w tym samym miejscu i się nakłada, a nie ma możliwości ( chyba ? ) ustawienia żadnych współrzędnych.

A drugie z pytań to powrót do odświeżania. Jeśli już uda mi się poprawnie wyświetlać te zmienne, to w jaki sposób je odświeżać. Bo w sumie z wczorajszego tematu nadal tego nie wywnioskowałem poza tym, że miałem zmienić funkcje do wyświetlania.
Pozdrawiam :)
P-69297
crash
» 2012-11-15 14:38:17
Hmm stwórz dynamicznie label'e (tak to się z BC++ nazywa) poustawiaj je w żądanych miejscach i powstawiaj im zadane wartości ;>
P-69299
xevuel
» 2012-11-15 15:29:01
@up: Człowieku, kto dzisiaj jeszcze Borlanda używa?

Co do tematu: Cóż, najlepiej będzie Cię chyba odesłać do kursu: » KursyKurs WinAPI, C++ kurs, bo za dużo tłumaczenia, a i tak bez tych podstaw byś pewnie nie zrozumiał. SetWindowText działa zupełnie inaczej niż TextOut. Ona po prostu ustawia tekst dla danej kontrolki. Oczywiście możesz tam walnąć n zmiennych, ale musisz się wtedy zapoznać z (najlepiej) łańcuchami formatującymi, albo konwertować zmienne do odpowiednich formatów i je łączyć.

Nie martw się o odświeżanie. W zwykłych okienkowych programach nie będzie widać migotania, a tekst zostanie automatycznie odświeżony po każdym wywołaniu SetWindowText. Przykład:

C/C++
int zmienna = 123;
std::string text = "jakis tekst";

char buf[ 100 ];
sprintf( buf, "zmienna: %d\r\ntext: %s", zmienna, text.c_str() );

SetWindowText( hEdit, buf );
P-69302
hit
Temat założony przez niniejszego użytkownika
» 2012-11-15 17:13:06
To znaczy samo SetWindowText już użyłem i mi wyświetla, funkcję mam która konwertuje z int na LPCSTR i wyświetla poprawnie. Tylko że ja po prostu chcę wyświetlić kilka zmiennych jedną pod drugą i nie wiem czy da się to zrobić za pomocą jednej kontrolki static w tym wypadku, czy dla każdej zmiennej muszę zrobić osobną?
A co do odświeżania, to żeby działało to tak jak Ty piszesz, to musiałbym mieć tą funkcję w pętli, a ja mam to zrobione na tej zasadzie, że ona jest wywołana bez pętli w programie:

C/C++
HWND wyniki2 = CreateWindowEx( WS_EX_CLIENTEDGE, "STATIC", NULL, WS_CHILD | WS_VISIBLE |
SS_LEFT, 120, 215, 183, 208, hwnd, NULL, hInstance, NULL );

char zmien[ 10 ];
int_to_lpcstr( widelec[ 0 ], zmien );
SetWindowText( wyniki2, zmien );
(jakie znaczniki są żeby  tu na forum pokazywać to jako kod c++ ? )

a zmienna, w tym wypadku widelec[0] będzie ulegać zmianie ale w innym wątku więc SetWindowText nie wyświetli innej wartości tak jak tego oczekuję, dlatego myślałem ze jednak trzeba zastosować odświeżanie.
P-69313
xevuel
» 2012-11-15 17:22:06
Czekaj. Czemu nie wsadzisz SetWindowText do wątku zaraz po wykonaniu operacji na tych zmiennych?

Tylko że ja po prostu chcę wyświetlić kilka zmiennych jedną pod drugą i nie wiem czy da się to zrobić za pomocą jednej kontrolki static w tym wypadku, czy dla każdej zmiennej muszę zrobić osobną?
Post wyżej dałem przykład jak zrobić coś takiego. Wystarczy jedna + zastosowanie "\r\n".

jakie znaczniki są żeby  tu na forum pokazywać to jako kod c++ ?
[cpp]...[/cpp] ;)
P-69314
hit
Temat założony przez niniejszego użytkownika
» 2012-11-15 17:39:27
Nie wsadzę tak dlatego, że generalnie wątków które z tych samych zmiennych korzystają i je zmieniają będzie pięć ( mam 'zasymulować' synchronizację przy problemie pięciu filozofów ).

Edit:

Wyświetlanie kilku zmiennych działa już poprawnie, ale tylko w przypadku int. Dołączyłem bibliotekę <string> i jak zapiszę
C/C++
string text;

to jest ok, a jak próbuję ją zdefiniować to pokazuje taki błąd:

error LNK2019: unresolved external symbol __CrtDbgReportW referenced in function "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z)


P-69316
xevuel
» 2012-11-15 17:57:44
Nie można naraz zmieniać tej samej wartości. Od tego masz sekcje krytyczne. A zresztą, nawet mimo to nie widzę problemu - po prostu wsadź SetWindowText do każdego wątku.

//edit: debuguj. Ciężko z tego błędu wywnioskować coś konkretnego. http://msdn.microsoft.com/en-us/library/799kze2z%28v=vs.80%29.aspx
P-69320
hit
Temat założony przez niniejszego użytkownika
» 2012-11-15 18:14:03
W porządku, wystarczyło użyć typu zmiennej LPSTR.
Co do sekcji krytycznej to trochę o tym czytałem bo generalnie jest to jedno z możliwych rozwiązań mojego problemu. Z tym, że jak rozumiem sugerujesz mi aby w tej sekcji krytycznej otwierać nowy wątek i na jego końcu stosować SetWindowText()? A nawet jeśli mam ją stosować w każdym wątku, to mam jeszcze taki problem, że wątki mam w innym pliku, a w artykule tutaj wyczytałem że funkcja musi się znajdować zaraz pod kontrolką?
P-69326
« 1 » 2
  Strona 1 z 2 Następna strona