Skocz do zawartości

Za mało miejsca w danych kontrolki


Barnaba

Recommended Posts

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.

Link do komentarza
Udostępnij na innych stronach

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);

Link do komentarza
Udostępnij na innych stronach

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 ;)

Link do komentarza
Udostępnij na innych stronach

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);
Link do komentarza
Udostępnij na innych stronach

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);

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...