API - Steuerelement größe ändern zur Laufzeit durch Benutzer



  • Also ich will das der Nutzer die größe eines Steuerelementes selber ändern kann, deshalb hatte ich mir das so gedacht:

    [DllImport( "user32.dll", CharSet=CharSet.Auto )] 
    public static extern long GetWindowLong(long hwnd, long nIndex); 
    
    [DllImport( "user32.dll", CharSet=CharSet.Auto )] 
    public static extern long SetWindowLong(long hwnd, long nIndex, long dwNewLong); 
    
    [DllImport( "user32.dll", CharSet=CharSet.Auto )] 
    public static extern long SetWindowPos(long hwnd, long hWndInsertAfter, long x, long y, long CX, long CY,long wFlags); 
    
    const long SW_SHOWNORMAL = 1; 
    
    const long SWP_NOSIZE = 0x1; 
    const long SWP_NOZORDER = 0x4; 
    const long SWP_NOMOVE = 0x2; 
    const long SWP_DRAWFRAME = 0x20; 
    const long GWL_STYLE = (-16); 
    const long WS_THICKFRAME = 0x40000; 
    
    private void DoResize(long hWndParent, long hWndObject, bool bStatus) 
    { 
       long Result=GetWindowLong(hWndObject, GWL_STYLE) | WS_THICKFRAME; 
       if(!bStatus) 
          Result = Result - WS_THICKFRAME; 
    
       SetWindowLong(hWndObject, GWL_STYLE, Result); 
       SetWindowPos(hWndObject, hWndParent, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_DRAWFRAME); 
    } 
    
    private void button1_Click(object sender, System.EventArgs e) 
    { 
       DoResize(this.Handle.ToInt64(), Rich1.Handle.ToInt64(), true); 
    } 
    
    private void button2_Click(object sender, System.EventArgs e) 
    { 
       DoResize(this.Handle.ToInt64(), Rich1.Handle.ToInt64(), false); 
    }
    

    doch wenn nun SetWindowLong und SetWindowPos aufgerufen werden kommt folgende Fehlermeldung:
    Zitat:
    Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in system.windows.forms.dll aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Hoffe jemand kann helfen.

    P.S.: scheint an Rich1.Handle.ToInt64() zuliegen
    aber was genau muss ich machen?



  • P.S.: scheint an Rich1.Handle.ToInt64() zuliegen
    aber was genau muss ich machen?

    nimm statt "long hwnd" -> "System.IntPtr hwnd"



  • jetzt bricht er nicht mehr ab
    aber das gewünschte ergebnis erzielt er nicht 😢

    kennt ihr noch ne andere Methode mit dem man einem benutzer selber erlauben kann die Größe eines Steuerelementes selber anzupassen (so ähnlich wie beim Visual Studio mit der Maus)



  • Mit der Maus, wüsste ich nicht wie. Aber Du kannst den Nutzer ja die Werte eingeben lassen und setzt dann die Width und Height Eigenschaft des Controls auf diese Werte. Ist nicht sehr elegant, aber vielleicht hat ja noch jemand eine bessere Idee.



  • ein ganz einfaches bsp., wie es mit der maus geht:

    bool b = false;
    
    		private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    		{
    			b = true;	
    		}
    
    		private void button1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    		{
    			b = false;
    		}
    
    		private void button1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    		{
    			if (b)
    			{
    				button1.Width = e.X;
    				button1.Height = e.Y;
    			}
    		}
    

    einfach Mousetaste drucken, ziehen, loslasen.



  • Xqgene schrieb:

    ein ganz einfaches bsp., wie es mit der maus geht:

    bool b = false;
    
    		private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    		{
    			b = true;	
    		}
    
    		private void button1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    		{
    			b = false;
    		}
    
    		private void button1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    		{
    			if (b)
    			{
    				button1.Width = e.X;
    				button1.Height = e.Y;
    			}
    		}
    

    einfach Mousetaste drucken, ziehen, loslasen.

    💡 😃



  • die Idee hat ich auch schon, allerdings hab ich dort um mein Steuerelement so kleine Panels angeordnet mit dennen man die Größe verändern sollte, nur das funktionierte auch nicht ganz



  • Also, du nutzt die Panels zum auseinanderziehen(vergößern) des Controls? Ob das so sinn macht, dahingestellt! Dss einzige was mir dazu einfällt wäre das jeweilige Panel auf der X/Y-Achse zuverschieben, und durch dieses verschieben die Größe des Controls anpassen.


Anmelden zum Antworten