Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1456to1460
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Userform komplett ohne Rand

Userform komplett ohne Rand
21.11.2015 16:14:51
Luggesch
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

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform komplett ohne Rand
21.11.2015 17:43:53
Nepumuk
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

Anzeige
OT @ Nepumuk
21.11.2015 18:02:46
Michael
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

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

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige