Durchsichtige steuerelemente

hi,
ich bin ein vb-anfänger. ich hab mal gehört, dass man in vb 2005 durchsichtige steuerelemente machen kann. geht das auch mit forms? und kan man die auch so „durchschimmernd“ machen (wie z.b. das xtraz-fenster von icq?

vielen dank schon mal im voraus fürs antworten
j.

Hallo!
Je nachdem, was Du genau machen willst, reicht die Palette von „trivial“ bis zu „hardcore-Gefummel mit layered windows und P/Invoke“. :smile:

Daher erst mal das Einfache:
System.Windows.Forms.Form hat ein Property Opacity , über das Du festlegen kannst, wie durchscheinend der Dialog ist.
Außerdem kannst Du Teile des Fensters komplett durchsichtig machen, indem Du die TransparencyKey Eigenschaft setzt. Alles, was auf dem Dialog diese Farbe als Hintergrundfarbe hat, ist dort durchsichtig und auch Mausklicks gehen bspw. durch.
Diese 2 Möglichkeiten schließen sich aber gegenseitig aus, also entweder das eine oder das andere.

Den Dialog selbst deckend zu lassen und nur einzelne Controls halbtransparent zu machen ist seeeehr aufwändig und komplex, daher würde ich für den Anfang vorschlagen, sich mit den anderen Möglichkeiten zu begnügen…

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi,
danke erstmal. aber wenn sich di einzelnen (einfachen) zwei gegenseitig ausschließen, wie geht dann so was wie das xtraz-fenster (geschwungene ränder und halb durchsichtig)?

grüssse
j.

Keine Ahnung, wie das genau aussieht - nutze kein icq.
Du kannst prinzipiell auch noch den Bereich eines Fensters beeinflussen (um bspw. nicht rechteckige Fenster zu bekommen - Stichwort Window Regions) oder eben explizit mit „Layered Windows“ arbeiten (unter diesen Begriffen solltest Du in der englischen MSDN was finden). Das alles ist aber mit .NET nicht so ganz einfach, weil die entsprechenden Funktionen nicht direkt zur Verfügung stehen.
Du müsstest Dir also die entsprechenden Win32-Funktionen aus dem Platform SDK raussuchen und per P/Invoke aufrufen. Wenn Du gerade mit VB.NET anfängst, halte ich das noch für zu schwer.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Kurzer Nachtrag:
Hab’s gerade selber nochmal ausprobiert. Zumindest unter .NET 2.0 schließen sich der TransparencyKey und die Opacity-Eigenschaft doch nicht aus. Du kannst also halbtransparente Fenster mit Löchern drin erstellen.

Was trotzdem nicht geht, ist, nicht transparente Controls auf halbtransparenten Dialogen zu haben.

Gruß,
Martin

hi,
irgendwas stimmt da nich: bei Opacity = 1 is das fenster noch voll da, aber bei Opacity = 0 is es komplett verschwunden.
noch ein problem: wenn ich ein none-fenster verschieben will, dann brauche ich so was:

Dim mouse As Boolean
 Private Sub Form1\_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
 mouse = True
 End Sub

 Private Sub Form1\_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
 mouse = False
 End Sub

 Private Sub Form1\_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
 If mouse = True Then
 Me.Location = New System.Drawing.Point(MousePosition.X, MousePosition.Y)
 End If
 End Sub

dann „springt“ das fenster aberer immer (das heisst, es wechselt schlagartig die position). wie kann ich das vermeiden?

Keine Ahnung, wie das genau aussieht - nutze kein icq.

http://people.freenet.de/screwdrive/xtraz.bmp hier haste ein bild

Keine Ahnung, wie das genau aussieht - nutze kein icq.

http://people.freenet.de/screwdrive/xtraz.bmp hier haste ein
bild

Aha.
Genau das, was ich befürchtet habe - ein Teil transparent und ein anderer Teil opak. Wenn Du auf die Transparenz in der (selbstgemalten) Titelzeile verzichten kannst, dann mach’ Dir ein Hintergrundbild, bei dem die runden Ecken oben bspw. Magenta sind. Im Rest des Bildes darf diese Farbe dann nicht vorkommen.
Dann setzt Du dieses Bild als Hintergrundbild Deines Forms, setzt den TransparencyKey auf Magenta und den BorderStyle auf None - voilà - fertig ist das nicht-rechteckige Fenster.

Wenn partout noch Transparenz rein muss, dann geht das - wie bereits geschildert - ausschließlich mit layered windows (kannst Dich ja auf MSDN dazu belesen, aber vorsicht: nicht ganz trivial und in VB.NET mit Schweine-Aufwand verbunden, weil Du erst alle benötigten Win32-Funktionen und Strukuren für p/invoke deklarieren musst).

Gruß,
Martin

hi,
irgendwas stimmt da nich: bei Opacity = 1 is das
fenster noch voll da, aber bei Opacity = 0 is es
komplett verschwunden.

Opacity ist ein Double-Wert, es gibt also noch eine ganze Menge Werte zwischen 0 und 1 :smile:

noch ein problem: wenn ich ein none-fenster verschieben will,
dann brauche ich so was:

Dim mouse As Boolean
Private Sub Form1_MouseDown(ByVal sender As System.Object,
ByVal e As System.Windows.Forms.MouseEventArgs) Handles
MyBase.MouseDown
mouse = True
End Sub

Private Sub Form1_MouseUp(ByVal sender As System.Object,
ByVal e As System.Windows.Forms.MouseEventArgs) Handles
MyBase.MouseUp
mouse = False
End Sub

Private Sub Form1_MouseMove(ByVal sender As System.Object,
ByVal e As System.Windows.Forms.MouseEventArgs) Handles
MyBase.MouseMove
If mouse = True Then
Me.Location = New
System.Drawing.Point(MousePosition.X, MousePosition.Y)
End If
End Sub

dann „springt“ das fenster aberer immer (das heisst, es
wechselt schlagartig die position). wie kann ich das
vermeiden?

Indem Du berechnest, wo Du beim MouseDown hingeklickt hast und diesen Offset dann in die Berechnung der Location einbeziehst.
Also bspw. ein Attribut Private _clickPoint As Point = Point.Empty.
Im MouseDown brauchst Du dann noch:
_clickPoint = new Point(-e.X, -e.Y)
Im MouseMove:
If (_clickPoint Point.Empty) Then
Dim pos as Point = MousePosition
pos.Offset(_clickPoint)
Me.Location = pos
End If

Im MouseUp:
p = Point.Empty

Gruß,
Martin

hi,
und wie kriege ich das dann hin, das ein fenster einen schatten hat (wie das xtraz-fenster auch)?

grüssse
j.

Der Schatten ist auch nur ein Bereich mit Alpha-Wert.
Wenn Du’s partout probieren willst, ist bspw. hier: http://www.pc-magazin.de/praxis/cm/page/page.php?tab…
kurz angerissen, was Layered Windows sind und was man damit machen kann.
Oder hier: http://www.codeproject.com/gdi/pxalphablend.asp was zum Thema AlphaBlending mit GDI+.
Aber alle Beispiele und Artikel, die ich bisher zu dem Thema gefunden habe, sind C++.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi,

Aber alle Beispiele und Artikel, die ich bisher zu dem Thema
gefunden habe, sind C++.

das nützt mir nix…

grüssse,
j.

hi,

ok, das is jetzt ne blöde frage, aber ich habs hier schon öfters gelesen, weiß aber nich, was das is: **„P/invoke“

grüssse
j.**

Nicht alle Funktionen, die Du bei der Win32 Programmierung (normalerweise in C/C++) zur Verfügung hast, gibt es auch als Methoden von .NET Klassen.
Trotzdem kann man auch native Funktionen aus .NET heraus aufrufen, indem man sie entsprechend deklariert (also angibt, in welcher DLL die Funktion zu finden ist, wie sie heisst und welche Parameter sie erwartet).
Dann kann man solche Funktionen aufrufen, als wären es statische Methoden einer .NET Klasse.

Das bezeichnet man als P/Invoke („Platform invoke“).

Generell für solche Fragen eignet sich übrigens auch immer MSDN (http://msdn.microsoft.com) hervorragend, quasi Infos direkt vom Hersteller.

Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich fürchte, Du musst Dich wohl oder übel in die Thematik mit C++ einarbeiten, es gibt meines Wissens nach keine „vorgekauten“ fertigen Beispiele in VB, von wo Du nur das Benötigte rauskopieren musst.
Selber Hirnschmalz investieren lautet die Devise…

Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]