Userform komplett ohne Rand

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: Userform komplett ohne Rand
von: Luggesch
Geschrieben am: 21.11.2015 16:14:51

Hallo zusammen,
ich versuche schon seit längerem eine Userform komplett ohne Rand darzustellen.
Bisher ist mit dies auch einigermaßen gut gelungen; der komplette Rand ist weg, auch die Schaltflächen in der rechten oberen Ecke sind nicht mehr vorhanden.
Was jetzt nur noch vorhanden ist sind die zwei bzw. drei Reihen Pixel an den Formularkanten, die die Userform dreidimensional erscheinen lassen.
Diesen 3D-Effekt bei Userformen möchte ich möglichst auch noch ausblenden.
Die Userform soll möglich eine ebene Fläche von Bildpunkten darstellen, ohne Rand und sonstigen 3D-Effekten.
Ich habe den aktuellen Stand in einer Beispieldatei zusammengefasst (siehe Anhang).
https://www.herber.de/bbs/user/101701.xlsm
Würde mich freuen, wenn sich zu diesem Thema ein Ansatz finden lassen würde :)
mfg
Luggesch

Bild

Betrifft: AW: Userform komplett ohne Rand
von: Nepumuk
Geschrieben am: 21.11.2015 17:43:53
Hallo,
ich würde den Rahmen einfach abschneiden:

' **********************************************************************
' Modul: UserForm1 Typ: Userform
' **********************************************************************

Option Explicit

Private Declare PtrSafe Function CreateRectRgnIndirect Lib "gdi32.dll" ( _
    ByRef lpRect As RECT) As LongPtr
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function GetWindowLongA Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function DrawMenuBar Lib "user32.dll" ( _
    ByVal hWnd As LongPtr) As Long
Private Declare PtrSafe Function SendMessageA Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByVal wMsg As Long, _
    ByVal wParam As LongPtr, _
    lParam As Any) As LongPtr
Private Declare PtrSafe Function SetWindowRgn Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByVal hRgn As LongPtr, _
    ByVal bRedraw As Long) As Long
Private Declare PtrSafe Function ScreenToClient Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    lpPoint As POINTAPI) As Long
Private Declare PtrSafe Function GetWindowRect Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByRef lpRect As RECT) As Long
Private Declare PtrSafe Function ReleaseCapture Lib "user32.dll" () As Long

Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Const GWL_STYLE As Long = -16
Private Const WS_CAPTION As LongPtr = &HC00000
Private Const HTCAPTION As LongPtr = 2
Private Const WM_NCLBUTTONDOWN As Long = &HA1
Private Const GC_CLASSNAMEMSFORM As String = "ThunderDFrame"

Private mlngptrHwnd As LongPtr

Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub UserForm_Activate()
    
    Dim udtRect As RECT, udtPoint As POINTAPI
    Dim lngptrStyle As LongPtr, lngptrRegion As LongPtr
    
    mlngptrHwnd = FindWindowA(GC_CLASSNAMEMSFORM, Caption)
    
    lngptrStyle = GetWindowLongA(mlngptrHwnd, GWL_STYLE)
    Call SetWindowLongA(mlngptrHwnd, GWL_STYLE, lngptrStyle And Not WS_CAPTION)
    Call DrawMenuBar(mlngptrHwnd)
    
    Call GetWindowRect(mlngptrHwnd, udtRect)
    udtPoint.X = udtRect.Right
    udtPoint.Y = udtRect.Bottom
    
    Call ScreenToClient(mlngptrHwnd, udtPoint)
    
    With udtRect
        .Bottom = udtPoint.Y
        .Left = 4
        .Right = udtPoint.X
        .Top = 4
    End With
    
    lngptrRegion = CreateRectRgnIndirect(udtRect)
    Call SetWindowRgn(mlngptrHwnd, lngptrRegion, 1&)
    
End Sub

Private Sub UserForm_MouseDown(ByVal Button As Integer, _
        ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

    
    If Button = 1 Then
        Call ReleaseCapture
        Call SendMessageA(mlngptrHwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End If
    
End Sub

Gruß
Nepumuk

Bild

Betrifft: OT @ Nepumuk
von: Michael
Geschrieben am: 21.11.2015 18:02:46
Hi Nepumuk,
da sieht man schon wieder den API-Profi!
Auf Deinen Rat hin habe ich mir den Appleman besorgt (hat gedauert).
Man liest ja keine 1400 Seiten, aber ich gebe mir die paar Einführungskapitel und schnüffle dann von Fall zu Fall rum, die Codeschnipsel finde ich ja heutzutage easy im Netz...
Vielen Dank nochmal und schöne Grüße,
Michael

Bild

Betrifft: AW: Userform komplett ohne Rand
von: Luggesch
Geschrieben am: 21.11.2015 18:14:41
Hallo Nepumuk,
das ist genau das, was ich gesucht habe :))))
funktioniert brilliant!
Besten Dank für die schnelle Rückantwort.
mfg
Luggesch

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Userform komplett ohne Rand"