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 Struktur

    struct 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 ist

    Das 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.


Anmelden zum Antworten