SetWindowLong
-
So, ich habe die sache mit der adressierung nicht verstanden - die fängt beim 0 offset an und hört beim sizeof(cbWndExtra) - sizeof(int) offset auf. Wieso denn minus größe von int? kann man das letzte byte net ansprechen? Und wie macht man es am besten, wenn man dort eine Struktur unterbringen will?
-
ok, egal, andere Frage, ich hab jetzt für das Fenster etwas speicher reserviert
... wcex.cbWndExtra = sizeof(TCHAR**) + sizeof(short); ...
wie greif ich auf den (danach) gespeicherten short-wert zu?
LOWORD(GetWindowLong(hWnd, sizeof(TCHAR**)) & 0xFF oder LOWORD(GetWindowLong(hWnd, sizeof(TCHAR**)) oder HIWORD(GetWindowLong(hWnd, sizeof(TCHAR**)) & 0xFF oder HIWORD(GetWindowLong(hWnd, sizeof(TCHAR**)) ??? bzw geht ja nicht, weil man ja byteanzahl - sizeof(int) adressieren muss, argh, verstehe nix
bitte helfen
EDIT:
(short) HIWORD((GetWindowLong(hWnd, sizeof(TCHAR**) + sizeof(short) - sizeof(int))) & 0x00FF);
komm ich so hin?
-
Azrael, il Meraz schrieb:
(...) ich habe die sache mit der adressierung nicht verstanden (...)
Beispiel :
... wcex.cbWndExtra = 10; ... // 1. So liegen die Bytes im Speicher : (anfangs mit NULL initialisiert) | | | Index : 0 1 2 3 4 5 6 7 8 9 10 Byte Nr. : 00 01 02 03 04 05 06 07 08 09 10 Wert : 00 00 00 00 00 00 00 00 00 00 00 | | | // 2. Initialisierung immer über den Index : SetWindowLong (hwnd,0,0x12345678); // Index 0 mit 0x12345678 initialisieren // 3. Nun sieht es so aus im Speicher : | | | Index : 0 1 2 3 4 5 6 7 8 9 10 Byte Nr. : 00 01 02 03 04 05 06 07 08 09 10 Wert : 78 56 34 12 00 00 00 00 00 00 00 | | | // 4. Zugriff auf die 0x12345678 wieder über den Index : GetWindowLong (hwnd,0) // -> liefert Byte Nr. 00,01,02,03 als LONG -> eine 0x12345678
Falls Du einen "krummen" Index nimmst, ist alles entsprechend verschoben :
SetWindowLong (hwnd,3,0x12345678); // Index 3 mit 0x12345678 initialisieren | | | Index : 0 1 2 3 4 5 6 7 8 9 10 Byte Nr. : 00 01 02 03 04 05 06 07 08 09 10 Wert : 00 00 00 78 56 34 12 00 00 00 00 | | | GetWindowLong (hwnd,0) // -> liefert Byte Nr. 00,01,02,03 als LONG -> eine 0x78000000 !!!
Azrael, il Meraz schrieb:
(...) andere Frage, ich hab jetzt für das Fenster etwas speicher reserviert (...) wie greif ich auf den (danach) gespeicherten short-wert zu?
Hängt davon ab, welchen Index Du genommen hast. So könnte es gehen :
... wcex.cbWndExtra = sizeof(TCHAR**) + sizeof(short); ...// 4 Bytes + 2 Bytes = 6 Bytes -> wcex.cbWndExtra = 6; SetWindowLong (hwnd,0,0x1234); // Index 0 mit (short) 0x1234 | | Index : 0 1 2 3 4 5 6 Byte Nr. : 00 01 02 03 04 05 06 Wert : 34 12 00 00 00 00 00 | | (GetWindowLong (hwnd,0) & 0x0000FFFF); // liefert 0x1234 als short
-
ok, danke sehr.
Jetz bitte kurz drüber gucken -> ich hab jetzt eine Strukturstruct HauptInfo { TCHAR** pszFeldName; short idFocus; HBITMAP hActiveBmp; };
wenn ich jetzt sizeof(HauptInfo) reserviere, hab ich ja 10 byte, dann sind die bytes 0-3 mit pszFeldName besetzt, 4-5 mit idFocus und 6-9 mit hActiveBmp?
d.h ich greife
mit (TCHAR**) GetWindowLong(hWnd, 0) auf pszFeldName mit (short) (GetWindowLong(hWnd, sizeof(TCHAR**)) &0xFFFF) auf idFocus und mit (HBITMAP) GetWindowLong(hWnd, sizeof(TCHAR**) + sizeof(short)) auf hActiveBmp und das schreiben erfolgt dann mit SetWindowLong(hWnd, 0,(LONG) pszBla); für pzFeldName mit SetWindowLong(hWnd, sizeof(TCHAR**),(LONG) idBla); für idFocus und mit SetWindowLong(hWnd, sizeof(TCHAR**) + sizeof(short),(LONG) hBmp);
bitte sagt mir, dass es richtig ist, dann weiß ich, dass ich es verstanden hab ^^"
-
Azrael, il Meraz schrieb:
wenn ich jetzt sizeof(HauptInfo) reserviere, hab ich ja 10 byte, dann sind die bytes 0-3 mit pszFeldName besetzt, 4-5 mit idFocus und 6-9 mit hActiveBmp?
d.h ich greife (...)code(...) bitte sagt mir, dass es richtig istDas ist alles richtig.
Beache aber beim Schreiben unbedingt die Reihenfolge :
SetWindowLong () setzt immer 4 bzw. sizeof(LONG) Bytes.
Wenn Du idFocus (Byte Nr. 4,5) setzt, dann setzt SetWindowLong () Byte Nr. 4,5,6,7.
-> Wenn Du z.B. erst hActiveBmp setzt (Byte Nr. 6,7,8,9) und danach idFocus (Byte Nr. 4,5), dann werden Byte Nr. 6,7 von hActiveBmp wieder überschrieben !
-
dann am besten so, oder?
SetWindowLong(hWnd, sizeof(TCHAR**),(LONG) (idBla << 16 | LOWORD(GetWindowLong(hWnd, sizeof(TCHAR**) + sizeof(short)));
-
Funktioniert zwar, aber beim Setzen von 2 Bytes (sizeof(WORD)) gibt es eine einfachere Methode :
SetWindowWord (hwnd,sizeof(TCHAR**),(short) idBla);
SetWindowWord () und GetWindowWord () arbeiten genauso wie Set/GetWindowLong (), nur eben dass 2 Bytes (sizeof(WORD)) gesetzt werden.
-
xD, das ist ja mal ein Luxus - auch 2 bytes gehen, danke sehr.