3D-Rahmen um Objekte

Wolfgang Kluge
wolfgang@vbwelt.de

3D-Rahmen. Seit Windows95 ein schönes mitbringsel. Doch manchmal reichen die Effekte, die man damit erreichen kann einfach nicht aus. Man müßte die verschiedenen Arten des Effektes (nach Aussen bzw. Innen "gestülpt") auf beliebige Elemente umsetzen können.

Und nichts anderes wird mit der Funktion DrawEdge erreicht.

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

Private Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long
Private Const BDR_INNER = &HC
Private Const BDR_OUTER = &H3
Private Const BDR_RAISED = &H5
Private Const BDR_RAISEDINNER = &H4
Private Const BDR_RAISEDOUTER = &H1
Private Const BDR_SUNKEN = &HA
Private Const BDR_SUNKENINNER = &H8
Private Const BDR_SUNKENOUTER = &H2

Private Const BF_BOTTOM = &H8
Private Const BF_LEFT = &H1
Private Const BF_RIGHT = &H4
Private Const BF_TOP = &H2
Private Const BF_FLAT = &H4000
Private Const BF_SOFT = &H1000
Private Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)


Eine ganze Menge wie man sieht. Aber der Aufwand lohnt sich, denn mit dieser Funktion kann man nicht nur einfach verschiedenste 3D-Rahmen zeichnen, sondern man kann auch "nur" oben, unten, links, rechts (bzw. gemischt) diesen Rahmen setzen.

Und da Windows die Eigentliche Arbeit übernimmt, stimmen die Farben dazu auch gleich.
Leider ist die Funktion auf Elemente beschränkt, die eine hDc-Eigenschaft(Device Context) besitzen, und das ist (bei den Standardsteuerelementen) eigentlich nur Form, Picture und Printer(ich weiß nicht ob das mit dem Printer geht, wäre schön zu wissen).

Wie immer bei API-Aufrufen, müssen Angaben im Koordinatensystem in Pixel angegeben werden. Am besten erreicht man das mit der Eigenschaft ScaleMode, die dazu auf 3 (Pixel) gesetzt werden sollte.

' Aufruf....Mit den Konstanten etwas rumspielen
Dim EdgeRect As RECT
Picture1.ScaleMode = 3
With EdgeRect
  .Top = Picture1.ScaleTop
  .Bottom = Picture1.ScaleHeight - Picture1.ScaleTop
  .Left = Picture1.ScaleLeft
  .Right = Picture1.ScaleWidth - Picture1.ScaleLeft
End With
DrawEdge Picture1.hdc, EdgeRect, BDR_SUNKENOUTER, BF_RECT


Weiter geht´s mit dem herausfinden von allen Einträgen, die selektiert sind.

' alle selektierten Einträge zurückgeben
Dim LV_Count As Long, LV_Index As Long
LV_Index = -1
LV_Count = SendMessage(ListView1.hwnd, LVM_GETSELECTEDCOUNT, 0&, 0&)
For i = 1 To LV_Count
  LV_Index = SendMessage(ListView1.hwnd, LVM_GETNEXTITEM, LV_Index, ByVal LVNI_SELECTED)
  If LV_Index <> -1 Then
    ' Hier bearbeiten der zurückgegebenen Werte...
    ListView1.ListItems.Item(LV_Index + 1).Bold = True
  End If
Next