Win32 API Application
Übersicht

![]() |
Jan_Ehemaliger AdminBetreff: Win32 API Application |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
du hast auch XP?
beim Scalieren taucht bei mir ein Problem auf, aber ansonten nciht, komisch. |
||
between angels and insects |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok, braucht anscheinend nen Repaint. | ||
between angels and insects |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Berichtigt, siehe dazu oben. | ||
between angels and insects |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich sehe ein paar kleine Fetzen des Fensters. Habe Win2k.
Kannst aber mal ein GUI Module draus machen, wenns geht. mfg olli |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group