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 :) |
|
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 ;> |
|
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: Kurs WinAPI, C++, 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: 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 );
|
|
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: 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. |
|
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] ;) |
|
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ę 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)
|
|
xevuel |
» 2012-11-15 17:57:44 |
|
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ą? |
|
« 1 » 2 |