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?


    Anmelden zum Antworten
     


  • 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