Win32 GUI

BlitzMax Forums/BlitzMax Programming/Win32 GUI

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Hi!

I experiment with the Windows GUI... Here a little example without MaxGUI:



SuperStrict

Framework PUB.Win32
Include "WinAPI.bmx"

Const WINGUI_CLASS_NAME : String = "WinGUI Class"

' Menu-Entry IDs
Const MENU_FILEOPEN : Int = 1
Const MENU_FILESAVE : Int = 2
Const MENU_EXIT     : Int = 3
Const MENU_COPY     : Int = 4
Const MENU_PASTE    : Int = 5
Const MENU_MISC     : Int = 6

Global Instance     : Int
Global WindowClass  : WNDCLASSEX
Global InitControls : TINITCOMMONCONTROLSEX
Global Message      : MSG

Global Menu         : Int
Global FileMenu     : Int
Global EditMenu     : Int
Global Window       : Int
Global Button       : Int
Global Groupbox     : Int
Global Radiobuttons : Int[3]
Global Label        : Int
Global Checkbox     : Int
Global Font         : Int
Global Textbox      : Int
Global Listbox      : Int

' Get instance of desktop
Instance = GetModuleHandleA(0)

' Register window class
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     = 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
	MessageBoxA(0, "Can't register window class.", "Error", ..
	            MB_OK | MB_ICONEXCLAMATION)
	End
EndIf

' Init common controls for more window classes
Rem
InitControls = New TINITCOMMONCONTROLSEX
InitControls.dwSize = SizeOf(TINITCOMMONCONTROLSEX)
InitControls.dwICC  = ICC_PROGRESS_CLASS
If Not InitCommonControlsEx(InitControls) Then
	MessageBoxA(0, "Can't load common controls.", "Error", ..
	            MB_OK | MB_ICONEXCLAMATION)
	End
EndIf
End Rem

' Create popupmenu "File"
FileMenu = CreatePopupMenu()
AppendMenuA(FileMenu, MF_STRING, MENU_FILEOPEN, "Open...".ToCString())
AppendMenuA(FileMenu, MF_STRING | MF_DISABLED | MF_GRAYED, MENU_FILESAVE, ..
            "Save...".ToCString())
AppendMenuA(FileMenu, MF_SEPARATOR, 0, Null)
AppendMenuA(FileMenu, MF_STRING, MENU_EXIT, "Exit".ToCString())

' Create popupmenu "Edit"
EditMenu = CreatePopupMenu()
AppendMenuA(EditMenu, MF_STRING, MENU_COPY,  "Copy".ToCString())
AppendMenuA(EditMenu, MF_STRING, MENU_PASTE, "Paste".ToCString())
AppendMenuA(EditMenu, MF_STRING | MF_CHECKED, MENU_MISC,  "Misc".ToCString())

' Create mainmenu
Menu = CreateMenu_()
AppendMenuA(Menu, MF_STRING | MF_POPUP, FileMenu, "File".ToCString())
AppendMenuA(Menu, MF_STRING | MF_POPUP, EditMenu, "Edit".ToCString())

' Create window
Window = CreateWindowExA(0, WINGUI_CLASS_NAME, "Main", WS_VISIBLE | ..
                         WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, ..
                         400, 300, 0, Menu, Instance, Null)

' Create button
Button = CreateWindowExA(0, "BUTTON", "Button", WS_VISIBLE | WS_CHILD | ..
                         BS_PUSHBUTTON | BS_NOTIFY, 10, 10, 80, 25, Window, ..
                         0, Instance, Null)

' Create groupbox
Groupbox = CreateWindowExA(0, "BUTTON", "Choose", WS_VISIBLE | WS_CHILD | ..
                           BS_GROUPBOX, 100, 10, 150, 115, Window, 0, ..
                           Instance, Null)

' Create radiobuttons
Radiobuttons[0] = CreateWindowExA(0, "BUTTON", "One", WS_VISIBLE | WS_CHILD | ..
                                  BS_AUTORADIOBUTTON | WS_GROUP, 110, 35, 80, 15, ..
                                  Window, 0, Instance, Null)

Radiobuttons[1] = CreateWindowExA(0, "BUTTON", "Two", WS_VISIBLE | WS_CHILD | ..
                                  BS_AUTORADIOBUTTON, 110, 55, 80, 15, ..
                                  Window, 0, Instance, Null)

Radiobuttons[2] = CreateWindowExA(0, "BUTTON", "Three", WS_VISIBLE | WS_CHILD | ..
                                  BS_AUTORADIOBUTTON, 110, 75, 80, 15, ..
                                  Window, 0, Instance, Null)

' Create label
Label = CreateWindowExA(0, "STATIC", "Case:", WS_VISIBLE | WS_CHILD, 110, 100, ..
                        80, 15, Window, 0, Instance, Null)

' Create checkbox
Checkbox = CreateWindowExA(0, "BUTTON", "Check", WS_VISIBLE | WS_CHILD | ..
                           BS_AUTOCHECKBOX, 260, 10, 120, 15, Window, 0, Instance, Null)

' Create textbox
Textbox = CreateWindowExA(0, "EDIT", "ff", WS_VISIBLE | WS_CHILD | WS_VSCROLL | ..
                          ES_MULTILINE | ES_AUTOVSCROLL, 10, 150, 240, 100, ..
                          Window, 0, Instance, Null)

' Setting new font to textbox
Font = CreateFontA(0, 0, 0, 0, FW_THIN, True, False, False, DEFAULT_CHARSET, ..
                   OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, ..
                   DEFAULT_PITCH, "Times New Roman")
SendMessageA(Textbox, WM_SETFONT, Font, True)

' Setting the text indirect
SendMessageA(textbox, WM_SETTEXT, 0, Int("Hello, world!".ToCString()))

' Create listbox
Listbox = CreateWindowExA(0, "LISTBOX", "ff", WS_VISIBLE | WS_CHILD | LBS_NOTIFY, ..
                          260, 150, 120, 100, Window, 0, Instance, Null)

' Fill listbox
SendMessage(Listbox, LB_ADDSTRING, Null, "One".ToCString())
SendMessage(Listbox, LB_ADDSTRING, Null, "Two".ToCString())
SendMessage(Listbox, LB_ADDSTRING, Null, "Three".ToCString())

Message = New MSG
While GetMessageA(Message, 0, 0, 0) > 0
	TranslateMessage(Message)
	DispatchMessageA(Message)
Wend

End

Function MessageHandler:Int(hWnd:Int, msg:Int, wParam:Int, lParam:Int)
	Select msg
		Case WM_CLOSE
			DestroyWindow(hWnd)
		Case WM_DESTROY
			PostQuitMessage(0)
			Return 0
		Case WM_COMMAND
			Select LOWORD(wParam)
				Case MENU_FILEOPEN
					MessageBoxA(0, "File -> Open", "Info", MB_OK | ..
					            MB_ICONEXCLAMATION)
				Case MENU_FILESAVE
					MessageBoxA(0, "File -> Save", "Info", MB_OK | ..
					            MB_ICONEXCLAMATION)
				Case MENU_EXIT
					PostQuitMessage(0)
					Return 0
				Case MENU_COPY
					MessageBoxA(0, "Edit -> Copy", "Info", MB_OK | ..
					            MB_ICONEXCLAMATION)
				Case MENU_PASTE
					MessageBoxA(0, "Edit -> Paste", "Info", MB_OK | ..
					            MB_ICONEXCLAMATION)
				Case MENU_MISC
					If GetMenuState(EditMenu, MENU_MISC, MF_BYCOMMAND) & ..
					   MF_CHECKED Then
						CheckMenuItem(EditMenu, MENU_MISC, MF_UNCHECKED)
					Else
						CheckMenuItem(EditMenu, MENU_MISC, MF_CHECKED)
					EndIf
			End Select

			Select lParam
				Case Button
					Select HIWORD(wParam)
						Case BN_CLICKED
							MessageBoxA(0, "Button -> Click", "Info", MB_OK | ..
							            MB_ICONEXCLAMATION)
						Case BN_DBLCLK
							MessageBoxA(0, "Button -> Doubleclicked", "Info", ..
							            MB_OK | MB_ICONEXCLAMATION)
					End Select
				
				Case Radiobuttons[0]
						SetWindowTextA(Label, "Case: 1")

				Case Radiobuttons[1]
						SetWindowTextA(Label, "Case: 2")

				Case Radiobuttons[2]
						SetWindowTextA(Label, "Case: 3")
				
				Case Listbox
					If HIWORD(wParam) = LBN_SELCHANGE Then
						Local Index:Int, Item:Byte Ptr
						Index = SendMessageA(Listbox, LB_GETANCHORINDEX, 0, 0)
						SetWindowTextA(Window, "Main "+(Index + 1))
					EndIf
			End Select

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

Function HIWORD:Short(Value:Int)
	Return Short((Value Shr 16) & $FFFF)
End Function

Function LOWORD:Short(Value:Int)
	Return Short(Value & $FFFF)
End Function


WinAPI.bmx
Const IDI_WINLOGO        : Short = $32517
Const MB_OK              : Int   = $0
Const MB_ICONEXCLAMATION : Int   = $30
Const LBS_NOTIFY         : Int   = $1
Const LB_ADDSTRING       : Int   = $180
Const LB_GETANCHORINDEX  : Int   = $19D
Const LBN_SELCHANGE      : Int   = 1

Extern "Win32"
	Function RegisterClassExA:Int(lpwcx:Byte Ptr)
	Function SendMessage:Byte Ptr(hWnd:Int, msg:Int, wParam:Byte Ptr, lParam:Byte Ptr) ..
	         = "SendMessageA@16"
	Function CreatePopupMenu:Int()
	Function CheckMenuItem:Int(hMenu:Int, uIDCheckItem:Int, uCheck:Int)
	Function GetMenuState:Int(hMenu:Int, uID:Int, uFlags:Int)
	Function CreateWindowExA:Int(dwExStyle:Int, lpClassName$z, lpWindowName$z, ..
	                             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$z, lpCaption$z, 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


InitCommonControlsEx for Progressbars a. s. o. can't linked together with the exe.

I hope, more examples can post here in this thread. (Please without MaxGUI)

cu olli

Edit: Now I know, I mustn't set the groupbox as parent of the radiobuttons.