Win32 GUI

BlitzMax Forums/BlitzMax Programming/Win32 GUI

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.