| CreateEllipticRgn, CreateRectRgn, CreateRoundRectRgn, CreatePolygonRgn, CombineRgn |
| |
| |
| Prozedur im Modul | |
| Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, _ |
| ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long |
| Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, _ |
| ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long |
|
| Public Sub ChangeWindowShape(WindowhWnd As Long) |
| SetWindowRgn WindowhWnd, CreateEllipticRgn(0, 0, 100, 100), True |
| End Sub | Für eine Ellipse nimmt man ungleiche Werte: |
| (0, 0, 200, 100), True |
| Setzt man den Boolschen Wert auf False, kann man |
| das runde Fenster (an der Titelleiste mit der Maus |
| fassen und bewegen) raustrennen: |
| SetWindowRgn WindowhWnd, _ |
| CreateEllipticRgn(0, 0, 100, 100), False |
| Prozedur im Formular | |
| Private Sub cmdRundesFenster_Click() | |
| ChangeWindowShape Me.hWnd | |
| End Sub | |
| |
| | |
| |
| |
| Microsoft hat einige API-Funktionen, um den Bedürfnissen nach unregelmäßig geformten Fenstern nachzukommen. |
| Mit diesen Funktionen lassen sich Regionen in der Form von Kreisen, Rechtecken, Elipsen und Polygonen |
| erzeugen. Eine Kombination dieser Geometrien ist möglich. |
| |
| Funktion | Beschreibung |
| CreateEllipticRgn | Region in elliptischer Form |
| CreateRectRgn | Region in rechteckiger Form |
| CreateRoundRectRgn | Region in rechteckiger Form mit abgerundeten Ecken |
| CreatePolygonRgn | Region in polygonaler Form; dazu wird ein Punkte-Array benötigt. |
| CombineRgn | Kombiniert mehrere Regionen |
| SetWindowRgn | Weist eine Region einem Fenster-Handle zu |
| |
| Desweiteren gibt es noch einige Flags, die definieren, wie die Regionen kombiniert werden. Dadurch können komplexere |
| Regionen zusammengestellt werden. Dabei muß man zwischen zwei Möglichkeiten unterscheiden: die Addition und die |
| Subtraktion von Regionen. |
| Bei der Addition werden zwei Regionen miteinander vereint; bei der Subtraktion wird eine Region aus der anderen |
| herausgeschnitten. |
| |
| Flag | Beschreibung |
| RGN_AND = 1 | Verbindet die überlappenden Bereiche zweier Regionen |
| RGN_OR = 2 | Verbindet zwei Regionen |
| RGN_XOR = 3 | Verbindet zwei Regionen und entfernt überlappende Bereiche |
| RGN_DIFF = 4 | Bereiche von Region 1, die nicht Teil von Region 2 sind |
| RGN_COPY = 5 | Erzeugt eine Kopie von Region 1 |
| |
 | |
| Private Declare Function CreateEllipticRgn Lib "gdi32" _ |
| (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _ |
| ByVal Y2 As Long) As Long |
| Private Declare Function CreateRoundRectRgn Lib "gdi32" _ |
| (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _ |
| ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long |
| Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn _ |
| As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, _ |
| ByVal nCombineMode As Long) As Long |
| Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd _ |
| As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long |
|
| Private Const RGN_OR = 2 |
| Dim MStartX, MStartY |
| |
| Private Sub Form_Load() | |
| Dim GesamtRgn As Long | |
| Dim RegionA As Long | |
| Dim RegionB As Long | |
| Dim tmp As Long | |
| | |
| 'Erzeugen der Regionen | |
| RegionB = CreateEllipticRgn(0, 0, 100, 100) | |
| RegionA = CreateRoundRectRgn(90, 0, 150, 101, 10, 10) | |
| | |
| 'Regionen kombinieren | |
| GesamtRgn = RegionA | |
| tmp = CombineRgn(GesamtRgn, GesamtRgn, RegionB, RGN_OR) |
| | |
| 'auf Formular anwenden | |
| tmp = SetWindowRgn(Me.hwnd, GesamtRgn, True) | |
| End Sub | |
| |
| Private Sub cmdExit_Click() | |
| End | |
| End Sub | |
| |
| ' Zum Verschieben des Formulars | |
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) |
| MStartX = X | |
| MStartY = Y | |
| End Sub | |
| |
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) |
| Dim PosX, PosY | |
| If Button = 1 Then | |
| If MStartX = -1 Or MStartY = -1 Then Exit Sub | |
| PosX = Me.Left + (X - MStartX) | |
| PosY = Me.Top + (Y - MStartY) | |
| Me.Move PosX, PosY | |
| End If | |
| End Sub | |
| |
| Siehe auch "Formular mit runden Ecken" auf: | http://www.wbrnet.info/db/0516.html |
| |