Barnaba Napisano Styczeń 18, 2019 Autor Zgłoś Udostępnij Napisano Styczeń 18, 2019 Cześć. Mam problem. Mianowicie chodzi mi o to, że utworzyłem sobie własnie własną klasę okna i nie wiem gdzie poszczególne kontrolki tej klasy mogą przechowywać dane. Na stronce jest opis tworzenia własnych klas, i tam zapamiętywane są dwie zmienne za pomocą funkcji SetWindowLong. Pobiera się je tak: LONG data = GetWindowLong(hWnd,GWL_USERDATA); WORD zmienna1 = LOWORD(data); WORD zmienna2 = HIWORD(data); a zapisuje tak: SetWindowLong(hWnd,GWL_USERDATA,MAKELONG(zmienna1,zmienna2)); I wszyskto pięknie, ale co w przypadku gdy kontrolka ma do zapamiętania więcej niż dwie zmienne? Zmienne których używam to 5 zmiennych typu WORD tak więc tylko 2 z nich można wpakować do młodszego i starszego słowa zmiennej z którą odpowiada GWL_USERDATA. Proszę o szybką pomoc. Z góry dzięki. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Barnaba Napisano Styczeń 18, 2019 Autor Zgłoś Udostępnij Napisano Styczeń 18, 2019 Dobra, już zrobiłem. Cała sztuka to odpowiednio zainicjalizować (a nie zainicjować jak to większość ludzi pisze :D ) odpowiednio pole struktry WNDCLASS.cbWndExtra, które określa ilość dodatkowaej pamiętci dla każdej kontrolki tej klasy. I tak, jak ja potrzebowałem 3 zmiennych 16 biotwych czyli 2 bajtowych to wpisałem wartość 6 (w bajtach się podaje). Do tej pamięci dane zapisuje się unkcją SetWindowWord (jeżeli chcemy wartości 16 bitowe zapisać) lub SetWindowLong (32 biotwe).Funkcje wymagają podania indexu, a jest to nic innego jak numer bajta od którego należy zacząc zapisywać. I tak jeżeli chcemy zapisać wartość 32 bitową do tej pamięci to podajamy 0 (do 3 będzie zapisywał), 4 (do 7), 8 (do 11) i tak dalej. Oczywiście jeżeli zapisujemy liczbe 16 bitową wówczas mamy, 0 (do 1), 2 (do 3) i tak dalej. Wartości również pobiera się bardzo łatwo. Zapodam teraz jakiś przykład, bo chyba strasznie zamotałem ;). gdzieś tam przy tworzeniu klasy przypisujemy do cbWndExtra wartość 8 co wystarczy nam na 2 liczby 16 bitowe i jedną 32 bitową. ... wc.cbWndExtra = 8 .. POBIERANIE WARTOŚCI: WORD zmienna1 = GetWindowWord(hWnd,0); // 0 - 1 bajty DWORD zmienna2 = GetWindowLong(hWnd,2); // 2 - 5 bajty WORD zmienna3 = GetWindowWord(hWnd,6); // 6 - 7 bajty PRZYPISYWANIE: SetWindowWord(hWnd,0,zmienna1); SetWindowLong(hWnd,2,zmienna2); SetWindowWord(hWnd,6,zmienna3); Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Flinch Napisano Styczeń 25, 2019 Zgłoś Udostępnij Napisano Styczeń 25, 2019 Załużmy, że cbWndExtra ustawiłem na 1. Jak teraz zapisać tam jaiegoś bajta? Próbowałem użyć SetWindowWord i SetWindowLong, ale umieszczają tam zera. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Freak Napisano Styczeń 25, 2019 Zgłoś Udostępnij Napisano Styczeń 25, 2019 SetWindowWord jest tylko do 16bitowych wersji windows (3.11?)więc daj sobie z tym spokój. Chyba nie da się zapisać 1 bajta, najmniejszą liczbą są 4 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Flinch Napisano Styczeń 25, 2019 Zgłoś Udostępnij Napisano Styczeń 25, 2019 U mnie działa SetWindowWord a ma 32 bitowego windowsa. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Omega Napisano Styczeń 25, 2019 Zgłoś Udostępnij Napisano Styczeń 25, 2019 Dzialac to i dziala - dla kompatybilnosci poprzednich wersji systemow. Ale nie powinno sie uzywac tej funkcji. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Flinch Napisano Styczeń 25, 2019 Zgłoś Udostępnij Napisano Styczeń 25, 2019 Wiem, że SetWindowWord jest starą funkcją, pozostałością po 16 bitowych systemach operacyjnych, i jest zalecane używanie SetWindowLong, ale czy da się odczytać jeden bajt Albo przynajmniej uzyskać wskaźnik do miejsca , gdzie przechowywane są dane okna Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Styczeń 27, 2019 Zgłoś Udostępnij Napisano Styczeń 27, 2019 Eh, ludzie, ludzie. Robi sie to tak: Przypuscmy ze mamy do zapamietania jakas klase, np.: class CKlasa { public: char imie[16], nazwisko[32], nr_telefonu[20]; void JakasFunkcja(void) {}; }; tworzymy sobie jakis obiekt; zapisujemy adres tego obiektu go do danych okna; i potem odczytujemy; CKlasa klasa; // zapis SetWindowLong(hWnd, GWL_USERDATA, (LONG)&klasa); [...] // i gdzies indziej w programie: CKlasa *tmp = (CKlasa) GetWindowLong(hWnd, GWL_USERDATA); //i teraz tak sie tym poslugujemy: tmp->JakasFunkcja(); i po sprawie ;) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Flinch Napisano Styczeń 27, 2019 Zgłoś Udostępnij Napisano Styczeń 27, 2019 Piasiu mi nie chodzi o zapis klasy, ale o pojedyćczego bajta. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Styczeń 28, 2019 Zgłoś Udostępnij Napisano Styczeń 28, 2019 No ot jeszcze latwiej BYTE b; SetWindowLong(hWnd, GWL_USERDATA, MAKELONG(MAKEWORD(b,0),0)); //gdzies tam dalej w programie long lon = GetWindowLong(hWnd, GWL_USERDATA); BYTE tmp = HIBYTE(HIWORD(lon)); Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Flinch Napisano Styczeń 28, 2019 Zgłoś Udostępnij Napisano Styczeń 28, 2019 I tym razem mnie nie zrozumiałeś. Ustawiam dodatkową pamięć cbWndExtra na 1 bajt i chcę do niej zapisać poedyńczy bajt, nie do GKL_USERDATA. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Styczeń 28, 2019 Zgłoś Udostępnij Napisano Styczeń 28, 2019 Zreszta - topic byl o tym jak do kontroli wstawic 3 zmienne typu word wiec moj sposob jest idelany. W sumei na wstawienie jednego bajta jets jeszcze latwiejszy sposob: BYTE b; SetWindowLong(hWnd, GWL_USERDATA, (long)&b); //gdzies tam dalej w programie BYTE *tmp = (BYTE*)GetWindowLong(hWnd, GWL_USERDATA); Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Flinch Napisano Styczeń 28, 2019 Zgłoś Udostępnij Napisano Styczeń 28, 2019 Mi chodzi o coś takiego dla 1 bajta (wc.cbWndExtra = 1): wc.cbWndExtra = 8 .. POBIERANIE WARTOŚCI: WORD zmienna1 = GetWindowWord(hWnd,0); // 0 - 1 bajty DWORD zmienna2 = GetWindowLong(hWnd,2); // 2 - 5 bajty WORD zmienna3 = GetWindowWord(hWnd,6); // 6 - 7 bajty PRZYPISYWANIE: SetWindowWord(hWnd,0,zmienna1); SetWindowLong(hWnd,2,zmienna2); SetWindowWord(hWnd,6,zmienna3); Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Styczeń 28, 2019 Zgłoś Udostępnij Napisano Styczeń 28, 2019 No ale jak wczesniej napisalem odpowiadalem na glowne pytanie topicu a nie na twoje. Piasiu napisał: Zreszta - topic byl o tym jak do kontroli wstawic 3 zmienne typu word wiec moj sposob jest idelany. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Flinch Napisano Styczeń 29, 2019 Zgłoś Udostępnij Napisano Styczeń 29, 2019 A potrafisz odpowiedzieć na moje?? Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Styczeń 30, 2019 Zgłoś Udostępnij Napisano Styczeń 30, 2019 Salwadore napisał: A potrafisz odpowiedzieć na moje?? A po co odpowiadac na twoje skoro juz sobie odpowiedziales sam ??? Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.