Transparent bei Verschieben des Anwendungsfensters ...

Don Philippo

Mitglied
Hallo zusammen,

ich steh mal wieder auf dem Schlauch. Möchte mein Programm interessehalber mit einem Design-Gimmick aufpeppen, d.h. wenn man das Anwendungsfenster (FormMain) verschiebt, soll für den Zeitraum des Verschiebens das Fenster halbtransparent werden.

Code:
private void FormMain_Move(object sender, EventArgs e)
        {
            this.Opacity = 50.0;
        }

Das funktioniert auf jeden Fall nicht. Wär auch zu schön gewesen.
Aber kompliziert kann das egentlich nicht sein, oder?
Wär cool, wenn ihr mir helfen könnt.

Vielen Dank!

Grüßle,
Philipp :)
 
Ich hab mal ein Bisschen rumprobiert:
C#:
bool Schalter = false;

private const int VK_LBUTTON = 1;
    
private const int VK_RBUTTON = 2;
    
private const int VK_MBUTTON = 4;
    
[DllImport("user32.dll")]
private static extern int GetAsyncKeyState(int vKey);
    
private void Form1_Load(object sender, System.EventArgs e) {
    Schalter = true;
}
    
private void Form1_Move(object sender, System.EventArgs e) {
    if (Schalter) {
        this.Opacity = 0.5;
        Timer1.Start();
    }
}
    
private void Timer1_Tick(object sender, System.EventArgs e) {
    if (!bool.Parse(GetAsyncKeyState(VK_LBUTTON))) {
        this.Opacity = 1;
        Timer1.Stop();
    }
}

Da ich nicht so viel Ahnung von C# habe, habe ich den Code maschinell Übersetzen lassen. Ich garantiere nicht für korrektes Funktionieren. :D
 
Hallo Don Philippo,

eine Methode ist das Überschreiben der WndProc-Methode und das Abfangen der WM_ENTERSIZEMOVE und WM_EXITSIZEMOVE - Fensternachrichten.
Das Ganze könnte dann z.B. so aussehen:

Code:
(...)

private const int WM_ENTERSIZEMOVE = 0x231;
private const int WM_EXITSIZEMOVE = 0x232;

(...)

protected overrides void WndProc(ref System.Windows.Forms.Message m)
{if(!this.DesignMode)
{if(m.Msg == WM_ENTERSIZEMOVE)
{this.Opacity = 0.5;
}
else if(m.Msg == WM_EXITSIZEMOVE)
{this.Opacity = 1.0;
}
}

base.WndProc(ref m);
}
Dabei wird das Fenster auch transparent, wenn seine Größe geändert wird. Wenn Du das nicht willst, könnest Du statt WM_ENTERSIZEMOVE die WM_MOVING - Fensternachricht verwenden (Code: 0x216).

Der Code ist zwar nicht getestet, sollte aber trotzdem funktionieren. Wenn nicht, melde Dich einfach. ;-)

Gruß
PhoenixLoe
 
Danke für die Antwort und sorry für die späte Antwort meinerseits ...
Bin im Moment Land unter und komme so schnell nicht dazu, den Vorschlag auszuprobieren. Werd ich aber so bald wie möglich in augenschein nehmen ...

Bis dahin ...

LG,
Philipp
 
Hallo Don Philippo,

eine Methode ist das Überschreiben der WndProc-Methode und das Abfangen der WM_ENTERSIZEMOVE und WM_EXITSIZEMOVE - Fensternachrichten.
Das Ganze könnte dann z.B. so aussehen:

Code:
(...)

private const int WM_ENTERSIZEMOVE = 0x231;
private const int WM_EXITSIZEMOVE = 0x232;

(...)

protected overrides void WndProc(ref System.Windows.Forms.Message m)
{if(!this.DesignMode)
{if(m.Msg == WM_ENTERSIZEMOVE)
{this.Opacity = 0.5;
}
else if(m.Msg == WM_EXITSIZEMOVE)
{this.Opacity = 1.0;
}
}

base.WndProc(ref m);
}
Dabei wird das Fenster auch transparent, wenn seine Größe geändert wird. Wenn Du das nicht willst, könnest Du statt WM_ENTERSIZEMOVE die WM_MOVING - Fensternachricht verwenden (Code: 0x216).

Der Code ist zwar nicht getestet, sollte aber trotzdem funktionieren. Wenn nicht, melde Dich einfach. ;-)

Gruß
PhoenixLoe

Hallo,
ich kenne mich nicht besonderlich gut aus in C# ;) mich intressiert jedoch für was dieser Code ist:
Code:
WM_ENTERSIZEMOVE = 0x231;
WM_EXITSIZEMOVE = 0x232;

Dabei meine ich besonders den Wert.

Mit freundlichen Grüßen
 
Dort werden zwei Konstanten mit einem Hex-Wert initialisiert.
Die Werte stehen jeweils für eine WindowsMessage, welche innerhalb der WndProc Methode über m.Msg abgefragt werden kann.
 
Zurück