vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Oberfläche · Fenster   |   VB-Versionen: VB5, VB621.07.01
Neues Fenster erstellen - per Code

Das Beispiel zeigt, wie sich ein neues Fenster per API und VB-Code erstellen lässt - ohn VB-FORM!

Autor:   LonelySuicide666Bewertung:  Views:  20.272 
www.vbapihelpline.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Wollten Sie schon immer mal wissen, was für ein Programmier- und Verwaltungsaufwand eigentlich hinter dem puren Anzeigen eines Fensters steckt?

Dann ist unser heutiger Tipp genau das Richtige für Sie!

Zum Erstellen neuer "Windows"-Fenster stellt und das Windows-API alle benötigten Funktionen und Konstanten zur Verfügung. Zunächst wird über die Struktur WNDCLASS die Klasse (das neue Fenster) "beschrieben". Hier legen Sie u.a. den Fensterstil, den Namen und die Hintergrundfarbe fest - und, das ist ganz wichtig - die Funktion, welche alle Windows-Ereignisse erhalten soll. Danach wird die Klasse im System angemeldet (registriert). Als nächstes wird das Fenster erstellt. Diese Aufgabe übernimmt die CreateWindowEx-Funktion, welche eine Vielzahl an Parametern erwartet (Namen, Titel, Position, Größe usw.). Nun da das neue Fenster erstellt ist, braucht es nur noch angezeigt werden - und zwar mit Hilfe der ShowWindow-Funktion. Über eine Do...Loop-Schleife warten wir nun solange, bis das Fenster geschlossen wurde, um es dann wieder vom System abzumelden (deregistrieren).

Das sind im groben alle notwendigen Schritte zum Erzeugen eines Fensters - ohne eine VB-FORM zu verwenden.

Und hier der Code:
Starten Sie hierzu ein neues Projekt, entfernen die Form1 und fügen dem Projekt ein neues leeres Modul hinzu. "Packen" Sie den gesamten nachfolgenden Quellcode dann in das Modul und starten Sie das Projekt. Obwohl Ihr Projekt über kein VB-Formular verfügt, erscheint dennoch ein Fenster - das per Code erzeugte Fenster "Hallo Welt!".

Option Explicit
 
' alle benötigten API-Deklarationen
Private Declare Function CreateWindowEx Lib "user32.dll" _
  Alias "CreateWindowExA" ( _
  ByVal dwExStyle As Long, _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String, _
  ByVal dwStyle As Long, _
  ByVal x As Long, _
  ByVal y As Long, _
  ByVal nWidth As Long, _
  ByVal nHeight As Long, _
  ByVal hWndParent As Long, _
  ByVal hMenu As Long, _
  ByVal hInstance As Long, _
  lpParam As Any) As Long
 
Private Declare Function RegisterClass Lib "user32.dll" _
  Alias "RegisterClassA" ( _
  lpWndClass As WNDCLASS) As Long
 
Private Declare Function UnregisterClass Lib "user32.dll" _
  Alias "UnregisterClassA" ( _
  ByVal lpClassName As Any, _
  ByVal hInstance As Long) As Long
 
Private Declare Function DefWindowProc Lib "user32.dll" _
  Alias "DefWindowProcA" ( _
  ByVal hWnd As Long, _
  ByVal Msg As Long, _
  ByVal wParam As Long, _
  ByVal lParam As Long) As Long
 
Private Declare Function ShowWindow Lib "user32" ( _
  ByVal hWnd As Long, _
  ByVal nCmdShow As Long) As Long
 
Private Type WNDCLASS
  style As Long
  lpfnWndProc As Long
  cbClsExtra As Long
  cbWndExtra As Long
  hInstance As Long
  hIcon As Long
  hCursor As Long
  hbrBackground As Long
  lpszMenuName As String
  lpszClassName As String
End Type
 
Private Const WS_EX_ACCEPTFILES = &H10
Private Const WS_EX_APPWINDOW = &H40000
Private Const WS_EX_CLIENTEDGE = &H200
Private Const WS_EX_CONTEXTHELP = &H400
Private Const WS_EX_CONTROLPARENT = &H10000
Private Const WS_EX_DLGMODALFRAME = &H1
Private Const WS_EX_LEFT = &H0
Private Const WS_EX_LEFTSCROLLBAR = &H4000
Private Const WS_EX_LTRREADING = &H0
Private Const WS_EX_MDICHILD = &H40
Private Const WS_EX_NOACTIVATE = &H8000000
Private Const WS_EX_NOPARENTNOTIFY = &H4
Private Const WS_EX_OVERLAPPEDWINDOW = &H300
Private Const WS_EX_PALETTEWINDOW = &H188
Private Const WS_EX_RIGHT = &H1000
Private Const WS_EX_RIGHTSCROLLBAR = &H0
Private Const WS_EX_RTLREADING = &H2000
Private Const WS_EX_STATICEDGE = &H20000
Private Const WS_EX_TOOLWINDOW = &H80
Private Const WS_EX_TOPMOST = &H8
Private Const WS_EX_TRANSPARENT = &H20
Private Const WS_EX_WINDOWEDGE = &H100
 
Private Const WS_BORDER = &H800000
Private Const WS_CAPTION = &HC00000
Private Const WS_CHILD = &H40000000
Private Const WS_CHILDWINDOW = &H40000000
Private Const WS_CLIPCHILDREN = &H2000000
Private Const WS_CLIPSIBLINGS = &H4000000
Private Const WS_DISABLED = &H8000000
Private Const WS_DLGFRAME = &H400000
Private Const WS_GROUP = &H20000
Private Const WS_HSCROLL = &H100000
Private Const WS_ICONIC = &H20000000
Private Const WS_MAXIMIZE = &H1000000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZE = &H20000000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_OVERLAPPED = &H0
Private Const WS_OVERLAPPEDWINDOW = &HCF0000
Private Const WS_POPUP = &H80000000
Private Const WS_POPUPWINDOW = &H80880000
Private Const WS_SIZEBOX = &H40000
Private Const WS_SYSMENU = &H80000
Private Const WS_TABSTOP = &H10000
Private Const WS_THICKFRAME = &H40000
Private Const WS_TILED = &H0
Private Const WS_TILEDWINDOW = &HCF0000
Private Const WS_VISIBLE = &H10000000
Private Const WS_VSCROLL = &H200000
 
Private Const CS_BYTEALIGNCLIENT = &H1000
Private Const CS_BYTEALIGNWINDOW = &H2000
Private Const CS_CLASSDC = &H40
Private Const CS_DBLCLKS = &H8
Private Const CS_HREDRAW = &H2
Private Const CS_NOCLOSE = &H200
Private Const CS_OWNDC = &H20
Private Const CS_PARENTDC = &H80
Private Const CS_SAVEBITS = &H800
Private Const CS_VREDRAW = &H1
 
Private Const COLOR_ACTIVEBORDER = 10
Private Const COLOR_ACTIVECAPTION = 2
Private Const COLOR_APPWORKSPACE = 12
Private Const COLOR_BACKGROUND = 1
Private Const COLOR_BTNFACE = 15
Private Const COLOR_BTNHIGHLIGHT = 20
Private Const COLOR_BTNSHADOW = 16
Private Const COLOR_BTNTEXT = 18
Private Const COLOR_CAPTIONTEXT = 9
Private Const COLOR_GRAYTEXT = 17
Private Const COLOR_HIGHLIGHT = 13
Private Const COLOR_HIGHLIGHTTEXT = 14
Private Const COLOR_INACTIVEBORDER = 11
Private Const COLOR_INACTIVECAPTION = 3
Private Const COLOR_INACTIVECAPTIONTEXT = 19
Private Const COLOR_MENU = 4
Private Const COLOR_MENUTEXT = 7
Private Const COLOR_SCROLLBAR = 0
Private Const COLOR_WINDOW = 5
Private Const COLOR_WINDOWFRAME = 6
Private Const COLOR_WINDOWTEXT = 8
 
Private Const CW_USEDEFAULT = &H80000000
Private Const HWND_BROADCAST = &HFFFF
 
' Einige der Fensternachrichten
Private Const WM_DESTROY = &H2
Private Const WM_MOVE = &H3
 
Private WindowClose As Boolean
 
' Ein Fenster per Code erstellen
Sub Main()
  Dim OwnClass As WNDCLASS
  Dim hWnd As Long
  Dim RetVal As Long
  Dim ClassAtom As Long
 
  ' Klasse beschreiben
  With OwnClass
    .style = CS_OWNDC Or CS_HREDRAW Or CS_VREDRAW
    .lpfnWndProc = GetFuncAddress(AddressOf WindowProc)
    .hInstance = App.hInstance
    .lpszClassName = "MeineKlasse"
    .hbrBackground = COLOR_APPWORKSPACE
  End With
 
  ' Neue Klasse registrieren
  ClassAtom = RegisterClass(OwnClass)
  If ClassAtom = 0 Then
    MsgBox "Die Fensterklasse konnte nicht registriert" & _
      " werden.", vbInformation, "Fehler"
    End
  End If
 
  ' Fenster erstellen
  Dim NormalStyles As Long
  Dim xPos As Long, yPos As Long
 
  NormalStyles = WS_OVERLAPPEDWINDOW Or WS_CAPTION Or _
    WS_BORDER
 
  ' Positopn (zentriert)
  xPos = (Screen.Width / Screen.TwipsPerPixelX - 320) / 2
  yPos = (Screen.Height / Screen.TwipsPerPixelY - 200) / 2
 
  ' Größe 320x200
  hWnd = CreateWindowEx(WS_EX_APPWINDOW, "MeineKlasse", _
    "Hallo Welt !!!", NormalStyles, xPos, yPos, 320&, _
    200&, 0&, 0&, App.hInstance, ByVal 0&)
 
  ' Fenster konnte nicht erstellt werden
  If hWnd = 0 Then
    MsgBox "Das Fenster konnte nicht erstellt werden.", _
      vbInformation, "Fehler"
  Else
    ' Fenster anzeigen und Schleife durchlaufen,
    ' bis das Fenster geschlossen wird
    ShowWindow hWnd, 1
    Do
      DoEvents
    Loop While WindowClose = False
  End If
 
  ' Klasse wieder deregistrieren
  RetVal = UnregisterClass("MeineKlasse", App.hInstance)
  If RetVal = 0 Then
    MsgBox "Fehler beim Deregistrieren der " & _
      "Fensterklasse", vbCritical, "Fehler"
  End If
End Sub
 
' Die Fensterprozedur unseres selbsterzeugten Fensters
' Hier treffen alle Ereigniss ein
Public Function WindowProc(ByVal hWnd As Long, _
  ByVal uMsg As Long, ByVal wParam As Long, _
  ByVal lParam As Long) As Long
 
  ' Auf bestimmte Ereignisse reagieren
  Select Case uMsg
    Case WM_DESTROY
      ' Fenster schließen
      WindowClose = True
    Case WM_MOVE
      ' Fenster verschieben
      Debug.Print "Das Fenster wird verschoben"
  End Select
 
  ' Standard-Prozedur aufrufen und Ergebnis zurückgeben
  WindowProc = DefWindowProc(hWnd, uMsg, wParam, _
    lParam)
End Function
 
' Dient nur zum Ermitteln der Funktionsadresse von
' WindowProc
Private Function GetFuncAddress(ByVal Address As Long) _
  As Long
 
  GetFuncAddress = Address
End Function



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.