Frage zu SetWindowLong( ) ???



  • hallö'chen,
    Ich hab da mal eine Frage zu SetWindowLong(), und zwar ist es doch so das man mit dem Index GWL_EXSTYLE und GWL_STYLE die Fensterattribute zur Laufzeit ändern kann.
    Ich habe hier ein kleines Programm, das die Listview styles mal durch spielen soll. SPrich ich habe alle möglichen exstyles und styles am Rand als Checkbox aufgelistet und je nach dem wo nun ein Hacken gesetzt wird der style soll dann gesetzt werden bzw. zu den schon gesetzten styles "addiert" werden. Aber würde man nun jede einzelne Checkbox mit SetWindowLong machen würde doch der vorherige style verloren gehen, oder?!

    Mein Problem ist also wie stelle ich es an, dass immer wenn ich nen Hacken setze der style gesetzt wird, oder entfernt wird?

    Hier noch etwas grafisches zur veranschaulichung:

    Listview ( ohne gesetzte Fensterattribute,   || Listview - Settings
    außer WS_CHILD und WS_VISIBLE )              ||
                                                 ||
    +-----------------------------------------+  || EX_STYLES:              STYLES:              
    |                                         |  || 
    |                                         |  || []AUTOAUTOARRANGE       []ALIGNLEFT
    |                                         |  || []AUTOCHECKSELECT       []ALIGNMASK
    |                                         |  || []AUTOSIZECOLUMNS       []ALIGNTOP 
    |                                         |  || []BORDERSELECT          []AUTOARRANGE
    |                                         |  || ...                     ... 
    |                                         |  ||
    |                                         |  ||
    |                                         |  ||
    +-----------------------------------------+  ||
    

    Gruß Tobi.



  • Wo ist das Problem?
    Du holst dir mit GetWindowLong den aktuellen Style, setzt oder löscht das entsprechende Bit und schreibst den Style mit SetWindowLong wieder zurück. Nicht vergessen, nach Setzen des neuen Styles noch SetWindowPos mit dem Flag SWP_FRAMECHANGED aufzurufen.



  • hmm versteh ich net ganz.... könntest du mir mal code schnippsel posten?
    mit swp wusst ich natürlich xD.

    Gruß Tobi.



  • Hmm ... hast

    SetWindowLong(hWnd, GetWindowLong(hWnd, GWL_STYLE) &~(WS_VISIBLE) | WS_BORDER);
    

    sollte WS_VISIBLE entfernen und WS_BORDER hinzufügen ...



  • aha?!,

    SetWindowLong(hWnd, GetWindowLong(hWnd, GWL_STYLE) &~(WS_VISIBLE) | WS_BORDER);
    

    hast du da jetzt irgendwo nen Komma vergessen?

    und was bedeutet &~ ???

    Gruß Tobi.



  • Nja & ist ein Bit-Operator ... und ~ ... such mal danach ^^



  • aha ok, aber trotzdem hast du da irgendwo nen komma vergessen.



  • also irgendwie wird da kein neuer style gesetzt... ich wollts so machen( ich ne checkbox )

    case ID_CHECKBOX_REPORT: {
    
                        switch( HIWORD( wParam ) ) {
    
                            case BN_CLICKED: {
    
                                int iCheck = (int) SendMessage( hWnd_Check[ 13 ], BM_GETCHECK, 0, 0 );
    
                                if( iCheck != 0 ) {
    
                                    SetWindowLong( hWnd_Listview, GWL_STYLE, LVS_REPORT );
                                }
                                else if( iCheck == 0 ) {
    
                                    //   SetWindowLong( hWnd_Listview, GetWindowLong( hWnd_Listview, GWL_STYLE ), ~&( LVS_REPORT ) );
                                }
                                SetWindowPos( hWnd_Listview, 0, 0, 0, ( clientX - ( clientX * 0.5f ) ), clientY - (clientY * 0.40f ), SWP_FRAMECHANGED );
                                break;
                            }
                        }
                        break;
                    }
    

    geht aber irgendwie net.



  • Hier mal eine Beispielfunktion:

    // hDlg       - HWND der DialogBox
    // uIdTarget  - ID des Controls dessen Style geändert werden soll
    // uStyle     - Style der geändert werden soll (GWL_STYLE oder GWL_EXSTYLE)
    // uStyleFlag - Flag das gesetzt oder gelöscht werden soll (z.B. WS_BORDER)
    // uIdCheck   - Control ID der zu überprüfenden CheckBox
    void setStyle(HWND hDlg, UINT uIdTarget, UINT uStyle, UINT uStyleFlag, UINT uIdCheck)
    {
    	HWND hwndControl = GetDlgItem(hDlg, uIdTarget);
    	if(!IsDlgButtonChecked(hDlg, uIdCheck))
    	{
    		SetWindowLong(hwndControl, uStyle,
    			GetWindowLong(hwndControl, uStyle) &~ uStyleFlag);
    	}
    	else
    	{
    		SetWindowLong(hwndControl, uStyle,
    			GetWindowLong(hwndControl, uStyle) | uStyleFlag);
    	}
    	SetWindowPos(hwndControl, NULL, 0, 0, 0, 0,
    		SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
    }
    

    Beispiel bei WM_COMMAND - LOWORD(wParam) (IDC_LIST durch ID deiner ListView ersetzen, hDlg durch HWND der DialogBox ersetzen)

    case ID_CHECKBOX_CLIENTEDGE:
    	setStyle(hDlg, IDC_LIST, GWL_EXSTYLE, WS_EX_CLIENTEDGE, ID_CHECKBOX_CLIENTEDGE);
    	return TRUE;
    

    Beachte jedoch, dass einige Styles bei bestimmten Controls so nicht geändert werden können - habe dieses noch nicht bei einer ListView getestet.



  • also irgendwie passiert jetzt was nur nicht das was passieren sollte -.-
    wenn ich jetzt nen hacken rein setze dann verliert das fenster irgendwie jedliche form und das mainfenster verliert den focus.

    Irgendwelche Ideen warum das so ist o.O

    Gruß Tobi.


Anmelden zum Antworten