Win32 API Application

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Jan_

Ehemaliger Admin

Betreff: Win32 API Application

BeitragMi, Jul 05, 2006 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier seht ihr, wie ihr eure eigenen Windows GUI Programme schreiben könnt, ohne die BlitzMax Gui zu kaufen/zu nutzen

Code: [AUSKLAPPEN]
Strict

Framework PUB.Win32
Import BRL.System
Import BRL.EventQueue
Import BRL.basic

Extern "Win32"
   Function UpdateWindow(hWnd)
End Extern


Global CLASS_NAME:Byte Ptr="bbW32 Window".ToCString() ' Wie heißt unsere Anwendung
Global hinst=GetModuleHandleA(0) ' was ist uinsere instance


Local hwnd%=CreateHWND(600,400,0,"Jan_'s Win32 Application".ToCString()) ' Fenster erstellen
'showwindow(hwnd,sw_show) ' fenster Zeigen
'showwindow(hwnd,sw_hide) ' fenster verstecken
Local ende%
Repeat
   WaitEvent() ' warten, das was passiert, das wichtig ist --> 0% CPU last
   ende=True
Until (ende=True)

DestroyWindow(hWnd) ' das Fenster wieder löschen
End

Function WndProc( hwnd,message,wp,lp ) "win32"
   Local event:TEvent

   Select message ' hier reagieren wir auf die aktionen die der nutzer auslöst
   Case WM_CLOSE ' schließen
      event=New TEvent
      PostEvent(event) ' so, das sendet an Waitevent das es was machen soll (siehe oben)
      postquitmessage(0)
      DestroyWindow(hWnd)
      End
      Return
   Case WM_DESTROY ' zerstören
      event=New TEvent
      PostEvent(event) ' so, das sendet an Waitevent das es was machen soll (siehe oben)
      postquitmessage(0)
      DestroyWindow(hWnd)
      End
      Return
   Case WM_MOVE ' bewegen
      'updatewindow(hwnd)
      Return
   Case WM_SIZE
      'bbSystemEmitOSEvent hwnd,message,wp,lp,Null
      'updatewindow(hwnd)
      Return
   Case WM_Paint
      updatewindow(hwnd)
      Return
'   Case WM_MOUSEMOVE
   'Default
      'bbSystemEmitOSEvent hwnd,message,wp,lp,Null
   End Select
   Return DefWindowProcA( hwnd,message,wp,lp )
End Function

Function CreateHWND(width,height,fullscreen,WINDOW_TITLE:Byte Ptr,PosX%=100,PosY%=100) ' Fenster erstellen
   
   Local style,ex_style,hwnd
   Local hinst=GetModuleHandleA(0)
   
   Global wndClas
   
   If Not wndClas
      Local wc:WNDCLASS=New WNDCLASS
      Local hinst=GetModuleHandleA(0)
      'Local icon:Byte Ptr="IDI_INFORMATION".ToCString()
      wc.style=CS_HREDRAW Or CS_VREDRAW ' Fensterstyle
      wc.lpfnWndProc=WndProc 'Zeiger auf die Fensterprozedur
      wc.cbClsExtra=0
      wc.cbWndExtra=0
      wc.hInstance=hinst ' Instanz des Programms
      wc.hIcon=LoadIconA(Null, Null) 'Handle eines Icons das z.B. mit LoadIcon() geladen wurde
      wc.hbrBackground = GetStockObject (LTGRAY_BRUSH)
      wc.hCursor=LoadCursorA( Null,Byte Ptr IDC_ARROW ) 'Handle eines Cursors
      wc.lpszClassName=CLASS_NAME ' Name der zu registrierenden Fensterklasse
      wndClas=RegisterClassA( wc )
      If Not wndClas
         Throw "Failed to register window class"
      EndIf
   EndIf

   ex_style=WS_EX_TRANSPARENT
   style=WS_VISIBLE|WS_SYSMENU|WS_CAPTION|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_SIZEBOX'|WS_SYSMENU
   
   Local rect[]=[posx,posy,width+posx,height+posy]

   hWnd=CreateWindowExA(..
      ex_style,..
      CLASS_NAME,..
      WINDOW_TITLE,..
      style,..
      posx,posy,width,height,..
      0,0,hinst,Null)
   ShowWindow(hWnd,SW_SHOW);

   MemFree WINDOW_TITLE
   If Not hwnd Throw "Failed to create window"
   Return hwnd
End Function
between angels and insects
  • Zuletzt bearbeitet von Jan_ am Mi, Jul 05, 2006 15:38, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragMi, Jul 05, 2006 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert bei mir nicht richtig. Dragge ich das Fenster ein wenig hin und her, wird es zunehmend zerstört.
Mache ich es von desktopfüllend auf verkleinert, minimiert es und lässt sich nicht wieder öffnen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Jan_

Ehemaliger Admin

BeitragMi, Jul 05, 2006 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
du hast auch XP?

beim Scalieren taucht bei mir ein Problem auf, aber ansonten nciht, komisch.
between angels and insects

BladeRunner

Moderator

BeitragMi, Jul 05, 2006 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
xp home, auf dem neusten stand. Dragge das fenster mal dass es den Rand des desktops überschreitet- es wird zerstört.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Jan_

Ehemaliger Admin

BeitragMi, Jul 05, 2006 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, braucht anscheinend nen Repaint.
between angels and insects

BladeRunner

Moderator

BeitragMi, Jul 05, 2006 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop, denke ich auch
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Jan_

Ehemaliger Admin

BeitragMi, Jul 05, 2006 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Berichtigt, siehe dazu oben.
between angels and insects

Vertex

BeitragMi, Jul 05, 2006 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe ein paar kleine Fetzen des Fensters. Habe Win2k.
Kannst aber mal ein GUI Module draus machen, wenns geht.
mfg olli

Vertex

BeitragDi, Jul 11, 2006 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe jetzt mal ein Lauffähiges Programm erstellt:
Code: [AUSKLAPPEN]
SuperStrict

Framework PUB.Win32

Global Window  : Int
Global Message : MSG
Global Quit    : Int

Window  = CreateWindow("BMax Class", "Test", 10, 10, 400, 400)
If Not Window Then
   MessageBoxA(0, "Fenster konnte nicht erstellt werden".ToCString(), ..
               "Fehler".ToCString(), MB_OK | MB_ICONEXCLAMATION)
   End
EndIf

Message = New MSG
Quit    = False

While GetMessageA(Message, Window, 0, 0) And Not Quit
   ' MessageHandler aufrufen
   TranslateMessage(Message)
   DispatchMessageA(Message)
Wend

End

Function CreateWindow:Int(ClassName:String, Title:String, X:Int, Y:Int, ..
                          Width:Int, Height:Int)
   Local Instance:Int, WindowClass:WNDCLASSEX

   ' Instanz des Desktop
   Instance = GetModuleHandleA(Null)
   If Not Instance Then Return 0

   ' Fensterklasse festlegen
   WindowClass = New WNDCLASSEX
   WindowClass.cbSize        = SizeOf(WNDCLASSEX)
   WindowClass.Style         = CS_HREDRAW ..
                               | CS_VREDRAW ..
                               | CS_OWNDC
   WindowClass.lpfnWndProc   = MessageHandler
   WindowClass.cbClsExtra    = 0
   WindowClass.cbWndExtra    = 0
   WindowClass.hInstance     = GetModuleHandleA(0)
   WindowClass.hIcon         = LoadIconA(Null, Byte Ptr(IDI_WINLOGO))
   WindowClass.hCursor       = LoadCursorA(Null, Byte Ptr(IDC_ARROW))
   WindowClass.hbrBackground = GetStockObject(LTGRAY_BRUSH)
   WindowClass.lpszMenuName  = Null
   WindowClass.lpszClassName = ClassName.ToCString()
   WindowClass.hIconSm       = LoadIconA(Null, Byte Ptr(IDI_WINLOGO))

   ' Fensterklasse registrieren
   If Not RegisterClassExA(WindowClass)   Then Return 0

   ' Fenster erstellen
   Return CreateWindowExA(Null, ClassName.ToCString(), Title.ToCString(), ..
                          WS_OVERLAPPEDWINDOW | WS_VISIBLE, X, Y, Width, Height, ..
                          Null, Null, Instance, Null)
End Function

Function MessageHandler:Int(hWnd:Int, msg:Int, wParam:Int, lParam:Int)
   Select msg
      Case WM_DESTROY
         Quit = True
         PostQuitMessage(0)
         Return 0
   End Select

   Return DefWindowProcA(hWnd, msg, wParam, lParam)
End Function

' -------------------------------------------------------------------------------------

Const IDI_WINLOGO        : Short = $32517
Const MB_OK              : Int   = $0
Const MB_ICONEXCLAMATION : Int   = $30

Extern "Win32"
   Function RegisterClassExA:Int(lpwcx:Byte Ptr)
   Function CreateWindowExA:Int(dwExStyle:Int, lpClassName:Byte Ptr, ..
                                lpWindowName:Byte Ptr, dwStyle:Int, x:Int, y:Int, ..
                                nWidth:Int, nHeight:Int, hWndParent:Int, hMenu:Int, ..
                                hInstance:Int, lpParam:Byte Ptr)
   Function MessageBoxA:Int(hWnd:Int, lpText:Byte Ptr, lpCaption:Byte Ptr, uType:Int)
End Extern

Type WNDCLASSEX
   Field cbSize        : Int
   Field style         : Int
   Field lpfnWndProc   : Byte Ptr
   Field cbClsExtra    : Int
   Field cbWndExtra    : Int
   Field hInstance     : Int
   Field hIcon         : Int
   Field hCursor       : Int
   Field hbrBackground : Int
   Field lpszMenuName  : Byte Ptr
   Field lpszClassName : Byte Ptr
   Field hIconSm       : Int
End Type


Kann mir jemand mal erklähren, was die Suffixe A und W bedeuten? Z. B. bei MessageBoxA. Weiterhin, warum es in PUB.Win32 -> user32.bmx z. B. kein MB_OK, CreateWindowEx usw. gibt? Ist das nur eine ältere Version von user32.h oder hat das Mark ganz einfach vergessen?

mfg olli

Jan_

Ehemaliger Admin

BeitragDi, Jul 11, 2006 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
a und w sind für die schieden eingabe, z.B. bei überladenen versionen.
er hat nciht alles Portiert.

hm, jetzt sehe ich, was ich falsch hatte. Mann.
between angels and insects

Vertex

BeitragDi, Jul 11, 2006 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du nicht Lust ein GUI Modul á la MaxGUI für Win32 zu machen?
Code: [AUSKLAPPEN]
SuperStrict

Framework PUB.Win32
Include "WinAPI.bmx"

Type TWinGUI
   Global Instance : Int
End Type

Type TGadget
   Field Handle : Int
   Field Text   : String

   Method Hide()
   End Method

   Method Show()
   End Method

   Method Enable()
   End Method

   Method Disable()
   End Method
End Type

Type TWindow Extends TGadget
   Function Create:TWindow()
   End Function
End Type

Type TButton Extends TGadget
   Function Create:TWindow()
   End Function
End Type


soetwas in der Art...

mfg olli

Vertex

BeitragMi, Jul 12, 2006 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Jan, ich habe nochmal geschaut. Ich muss mich doch mal noch ein wenig einlesen, bevor ich ein Entwurf des Moduls anfertigen kann.

http://winprog.org/tutorial/fi...torial.zip
Ist, wie ich finde, dass Einzige, welches wirklich das WinGUI gut beschreibt. Die Meisten behandeln eher nur, wie man ein schnödes Fenster erstellt oder Benutzen Ressourcedateien für Buttons.

mfg olli

Vertex

BeitragDo, Jul 13, 2006 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
So, nochmal ein letzter Zumüllpost:

Code: [AUSKLAPPEN]
SuperStrict

Framework PUB.Win32
Import BRL.LinkedList
Include "WinAPI.bmx"

Const WINGUI_CLASS_NAME : String = "WinGUI Class"


Const WINGUI_EVENT_CLOSE       : Int = 1
Const WINGUI_EVENT_DESTROY     : Int = 2
Const WINGUI_EVENT_CLICK       : Int = 3
Const WINGUI_EVENT_DOUBLECLICK : Int = 4

Type TWinGUI
   Global Instance    : Int
   Global WindowClass : WNDCLASSEX
   Global EventGadget : TGadget
   Global EventID     : Int

   Function Init:Int()
      TWinGUI.Instance = GetModuleHandleA(0)

      WindowClass = New WNDCLASSEX
      WindowClass.cbSize        = SizeOf(WNDCLASSEX)
      WindowClass.Style         = CS_HREDRAW ..
                                  | CS_VREDRAW ..
                                  | CS_OWNDC
      WindowClass.lpfnWndProc   = MessageHandler
      WindowClass.cbClsExtra    = 0
      WindowClass.cbWndExtra    = 0
      WindowClass.hInstance     = TWinGUI.Instance
      WindowClass.hIcon         = LoadIconA(Null, Byte Ptr(IDI_WINLOGO))
      WindowClass.hCursor       = LoadCursorA(Null, Byte Ptr(IDC_ARROW))
      WindowClass.hbrBackground = GetStockObject(LTGRAY_BRUSH)
      WindowClass.lpszMenuName  = Null
      WindowClass.lpszClassName = WINGUI_CLASS_NAME.ToCString()
      WindowClass.hIconSm       = LoadIconA(Null, Byte Ptr(IDI_WINLOGO))

      If Not RegisterClassExA(WindowClass) Then Return False

      TGadget.List = New TList

      Return True
   End Function

   Function Update:Int(Gadget:TGadget)
      Local Message:MSG

      Message = New MSG

      If Not GetMessageA(Message, Gadget.Handle, 0, 0) Return False
      TranslateMessage(Message)
      DispatchMessageA(Message)

      Return True
   End Function

   Function MessageHandler:Int(hWnd:Int, msg:Int, wParam:Int, lParam:Int)
      Local Gadget:TGadget

      Self.EventGadget = Null

      Select msg
         Case WM_CLOSE
            TWinGUI.EventID = WINGUI_EVENT_CLOSE
            DestroyWindow(hWnd)

         Case WM_DESTROY
            TWinGUI.EventID = WINGUI_EVENT_DESTROY
            PostQuitMessage(0)
            Return 0

         Case WM_COMMAND
            For Gadget = EachIn TGadget.List
               If Gadget.Handle = lParam Then
                  TWinGUI.EventGadget = Gadget
                  Exit
               EndIf
            Next
            

            Select (wParam Shl 16) & $FFFF
               Case BN_CLICKED
                  TWinGUI.EventID = WINGUI_EVENT_CLICK
               Case BN_DBLCLK
                  TWinGUI.EventID = WINGUI_EVENT_DOUBLECLICK
               Default
                  TWinGUI.EventID = 0
            End Select
         Default
            Return DefWindowProcA(hWnd, msg, wParam, lParam)
      End Select
   End Function
End Type

Type TGadget
   Global List : TList

   Field Handle : Int

   Method New()
      Self.Handle = 0
      List.AddLast(Self)
   End Method
   
   Method SetText:Int(Text:String)
      If Self.Handle Then Return SetWindowTextA(Self.Handle, Text)
   End Method

   Method SetShape:Int(X:Int, Y:Int, Width:Int, Height:Int)
      If Self.Handle Then Return SetWindowPos(Self.Handle, 0, X, Y, ..
                                              Width, Height, 0)
   End Method
End Type

Const WINGUI_WINDOW_TITLELEFT  : Int = WS_EX_LEFT
Const WINGUI_WINDOW_TITLERIGHT : Int = WS_EX_RIGHT
Const WINGUI_WINDOW_TOPMOST    : Int = WS_EX_TOPMOST

Const WINGUI_WINDOW_DISABLED   : Int = WS_DISABLED
Const WINGUI_WINDOW_VISIBLE    : Int = WS_VISIBLE
Const WINGUI_WINDOW_MAXIMIZED  : Int = WS_MAXIMIZE
Const WINGUI_WINDOW_MINIMIZED  : Int = WS_MINIMIZE
Const WINGUI_WINDOW_MAXBOX     : Int = WS_MAXIMIZEBOX
Const WINGUI_WINDOW_MINBOX     : Int = WS_MINIMIZEBOX
Const WINGUI_WINDOW_SYSMENU    : Int = WS_SYSMENU
Const WINGUI_WINDOW_SIZEABLE   : Int = WS_SIZEBOX

Type TWindow Extends TGadget
   Function Create:TWindow(Title:String, X:Int, Y:Int, Width:Int, Height:Int, ..
                           Style:Int=WINGUI_WINDOW_VISIBLE | ..
                           WINGUI_WINDOW_MAXBOX | WINGUI_WINDOW_MINBOX | ..
                           WINGUI_WINDOW_SYSMENU | WINGUI_WINDOW_SIZEABLE)

      Local ExStyle:Int, WindowStyle:Int, Handle:Int, Window:TWindow

      ExStyle = (Style & WINGUI_WINDOW_TITLELEFT) ..
                | (Style & WINGUI_WINDOW_TITLERIGHT) ..
                | (Style & WINGUI_WINDOW_TOPMOST) ..
      
      WindowStyle = (Style & WINGUI_WINDOW_DISABLED) ..
                    | (Style & WINGUI_WINDOW_VISIBLE) ..
                    | (Style & WINGUI_WINDOW_MAXIMIZED) ..
                    | (Style & WINGUI_WINDOW_MINIMIZED) ..
                    | (Style & WINGUI_WINDOW_MAXBOX ) ..
                    | (Style & WINGUI_WINDOW_MINBOX) ..
                    | (Style & WINGUI_WINDOW_SYSMENU) ..
                    | (Style & WINGUI_WINDOW_SIZEABLE)

      Handle = CreateWindowExA(ExStyle, WINGUI_CLASS_NAME.ToCString(), ..
                               Title.ToCString(),WindowStyle, X, Y, ..
                               Width, Height, 0, 0, TWinGUI.Instance, Null)

      If Not Handle Then Return Null

      Window = New TWindow
      Window.Handle = Handle

      Return Window
   End Function
End Type

Const WINGUI_BUTTON_DISABLED    : Int = WS_DISABLED
Const WINGUI_BUTTON_VISIBLE     : Int = WS_VISIBLE
Const WINGUI_BUTTON_TEXTCENTER  : Int = BS_CENTER
Const WINGUI_BUTTON_TEXTTOP     : Int = BS_TOP
Const WINGUI_BUTTON_TEXTBOTTOM  : Int = BS_BOTTOM
Const WINGUI_BUTTON_TEXTMIDDLE  : Int = BS_VCENTER
Const WINGUI_BUTTON_TEXTLEFT    : Int = BS_LEFT
Const WINGUI_BUTTON_TEXTRIGHT   : Int = BS_RIGHT
Const WINGUI_BUTTON_FLAT        : Int = BS_FLAT

Type TButton Extends TGadget
   Function Create:TButton(Title:String, X:Int, Y:Int, Width:Int, Height:Int, ..
                           Parent:TGadget, Style:Int=WINGUI_BUTTON_VISIBLE | ..
                           WINGUI_BUTTON_TEXTCENTER)
      Local WindowStyle:Int, Handle:Int, Button:TButton
      
      WindowStyle = (Style & WINGUI_BUTTON_DISABLED) ..
                    | (Style & WINGUI_BUTTON_VISIBLE) ..
                    | (Style & WINGUI_BUTTON_TEXTCENTER) ..
                    | (Style & WINGUI_BUTTON_TEXTTOP) ..
                    | (Style & WINGUI_BUTTON_TEXTBOTTOM) ..
                    | (Style & WINGUI_BUTTON_TEXTMIDDLE) ..
                    | (Style & WINGUI_BUTTON_TEXTLEFT) ..
                    | (Style & WINGUI_BUTTON_TEXTRIGHT) ..
                    | (Style & WINGUI_BUTTON_FLAT) ..
                    | BS_PUSHBUTTON ..
                    | WS_CHILD

      Handle = CreateWindowExA(0, "BUTTON".ToCString(), Title.ToCString(), ..
                               WindowStyle, X, Y, Width, Height, Parent.Handle, ..
                               0, TWinGUI.Instance, Null)

      If Not Handle Then Return Null

      Button = New TButton
      Button.Handle = Handle

      Return Button
   End Function
End Type

Global Window : TWindow
Global Button : TButton

TWinGUI.Init()
Window = TWindow.Create("Test", 100, 100, 400, 400)
Button = TButton.Create("Klick", 10, 10, 100, 50, Window)

While TWinGUI.Update(Window)
   If TWinGUI.EventGadget = Button And TWinGUI.EventID = WINGUI_EVENT_CLICK Then
      Button.SetText("Klack")
   EndIf

   If TWinGUI.EventID = WINGUI_EVENT_DESTROY Then Exit
Wend

End


WinAPI.bmx
Code: [AUSKLAPPEN]
Const IDI_WINLOGO        : Short = $32517
Const MB_OK              : Int   = $0
Const MB_ICONEXCLAMATION : Int   = $30

Extern "Win32"
   Function RegisterClassExA:Int(lpwcx:Byte Ptr)
   Function CreateWindowExA:Int(dwExStyle:Int, lpClassName:Byte Ptr, ..
                                lpWindowName:Byte Ptr, dwStyle:Int, x:Int, y:Int, ..
                                nWidth:Int, nHeight:Int, hWndParent:Int, hMenu:Int, ..
                                hInstance:Int, lpParam:Byte Ptr)
   Function MessageBoxA:Int(hWnd:Int, lpText:Byte Ptr, lpCaption:Byte Ptr, uType:Int)
End Extern

Type WNDCLASSEX
   Field cbSize        : Int
   Field style         : Int
   Field lpfnWndProc   : Byte Ptr
   Field cbClsExtra    : Int
   Field cbWndExtra    : Int
   Field hInstance     : Int
   Field hIcon         : Int
   Field hCursor       : Int
   Field hbrBackground : Int
   Field lpszMenuName  : Byte Ptr
   Field lpszClassName : Byte Ptr
   Field hIconSm       : Int
End Type


Der ganze Eventscheiß funktioniert noch nicht. Laut MSDN und den anderen Möchtegerntutorials müsste bei WM_COMMAND dann in lParam das Handle und in HIWORD(wParam) die Notificationmessage wie BN_DBCLICK, BN_CLICK usw. drin stehen, sie ist aber immer 0(was aber BN_CLICK entspricht). Oh man, ich hasse eigentlich den ganzen Scheiß...

mfg olli

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group