Hello all
I have tried First time to adept my freebasic example (thats running fine Here See Pic below) to pWindow Style...
There are some Problem zones to fix cause I am Not very fit with using Afx.. thats relativ new stuff
'
' mini calculator GUI by frank bruebach, 20:06 MEZ PM, 16.03.2024
' freebasic
#define UNICODE
#define _WIN32_WINNT &h0602
#INCLUDE ONCE "Afx/CWindow.inc"
#INCLUDE ONCE "Afx/AfxGdiPlus.inc"
#INCLUDE ONCE "Afx/AfxMenu.inc"
USING Afx
' // Menu identifiers
ENUM
IDM_UNDO = 1001 ' Undo
IDM_REDO ' Redo
IDM_HOME ' Home
IDM_SAVE ' Save
IDM_EXIT ' Exit
END ENUM
' Constants for controls
Const IDC_NUM1 = 1001
Const IDC_NUM2 = 1002
Const IDC_RESULT = 1003
Const IDC_ADD = 2001
Const IDC_SUBTRACT = 2002
Const IDC_MULTIPLY = 2003
Const IDC_DIVIDE = 2004
Const IDC_CALCULATE = 2005
DECLARE FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _
BYVAL hPrevInstance AS HINSTANCE, _
BYVAL szCmdLine AS ZSTRING PTR, _
BYVAL nCmdShow AS LONG) AS LONG
END WinMain(GetModuleHandleW(NULL), NULL, COMMAND(), SW_NORMAL)
' // Forward declaration
DECLARE FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT
' ========================================================================================
' Build the menu
' ========================================================================================
FUNCTION BuildMenu () AS HMENU
DIM hMenu AS HMENU
DIM hPopUpMenu AS HMENU
hMenu = CreateMenu
hPopUpMenu = CreatePopUpMenu
AppendMenuW hMenu, MF_POPUP OR MF_ENABLED, CAST(UINT_PTR, hPopUpMenu), "&File"
AppendMenuW hPopUpMenu, MF_ENABLED, IDM_UNDO, "&Undo" & CHR(9) & "Ctrl+U"
AppendMenuW hPopUpMenu, MF_ENABLED, IDM_REDO, "&Redo" & CHR(9) & "Ctrl+R"
AppendMenuW hPopUpMenu, MF_ENABLED, IDM_HOME, "&Home" & CHR(9) & "Ctrl+H"
AppendMenuW hPopUpMenu, MF_ENABLED, IDM_SAVE, "&Save" & CHR(9) & "Ctrl+S"
AppendMenuW hPopUpMenu, MF_ENABLED, IDM_EXIT, "E&xit" & CHR(9) & "Alt+F4"
FUNCTION = hMenu
END FUNCTION
' =================================================================================
FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _
BYVAL hPrevInstance AS HINSTANCE, _
BYVAL szCmdLine AS ZSTRING PTR, _
BYVAL nCmdShow AS LONG) AS LONG
' // Set process DPI aware
AfxSetProcessDPIAware
' // Create the main window
DIM pWindow AS CWindow
pWindow.Create(NULL, "mini Calculator GUI", @WndProc)
pWindow.SetClientSize(400, 350)
pWindow.Center
' // Add a button -> but I needed here some Radiobuttons too ;)
pWindow.AddControl("Button", , IDCANCEL, "&Close", 280, 280, 75, 23)
pWindow.AddControl("Edit",, IDC_NUM1, "&edit", 50, 50, 75, 23)
pWindow.AddControl("Edit",, IDC_NUM2, "&edit", 200, 50, 75, 23)
pWindow.AddControl("Button",, IDC_ADD, "+", 50, 100, 75, 23) 'WS_CHILD Or WS_VISIBLE Or BS_AUTORADIOBUTTON ?
pWindow.AddControl("Button",, IDC_SUBTRACT, "-", 100, 100, 75, 23) 'WS_CHILD Or WS_VISIBLE Or BS_AUTORADIOBUTTON ?
pWindow.AddControl("Button",, IDC_MULTIPLY, "*", 150, 100, 75, 23) 'WS_CHILD Or WS_VISIBLE Or BS_AUTORADIOBUTTON ?
pWindow.AddControl("Button",, IDC_DIVIDE, "/", 200, 100, 75, 23) 'WS_CHILD Or WS_VISIBLE Or BS_AUTORADIOBUTTON ?
pWindow.AddControl("Button",, IDC_CALCULATE, "=", 250, 100, 75, 23) 'WS_CHILD Or WS_VISIBLE Or BS_AUTORADIOBUTTON ?
pWindow.AddControl("Edit",, IDC_RESULT, " ", 50, 150, 75, 23)
'
' ------------------ problem zone ----------------------------- //
' Set default operation to addition
' SendDlgItemMessage(hWnd, IDC_ADD, BM_SETCHECK, BST_CHECKED, 0)
' ------------------ problem zone ----------------------------- //
' // Create the menu
DIM hMenu AS HMENU = BuildMenu
SetMenu pWindow.hWindow, hMenu
' // Add icons to the items of the File menu
DIM hSubMenu AS HMENU = GetSubMenu(hMenu, 0)
AfxAddIconToMenuItem(hSubMenu, 0, TRUE, AfxGdipIconFromRes(hInstance, "IDI_ARROW_LEFT_32"))
AfxAddIconToMenuItem(hSubMenu, 1, TRUE, AfxGdipIconFromRes(hInstance, "IDI_ARROW_RIGHT_32"))
AfxAddIconToMenuItem(hSubMenu, 2, TRUE, AfxGdipIconFromRes(hInstance, "IDI_HOME_32"))
AfxAddIconToMenuItem(hSubMenu, 3, TRUE, AfxGdipIconFromRes(hInstance, "IDI_SAVE_32"))
' // Dispatch Windows messages
FUNCTION = pWindow.DoEvents(nCmdShow)
END FUNCTION
' ========================================================================================
' ========================================================================================
' Main window callback procedure
' ========================================================================================
FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT
dim operation As String
SELECT CASE uMsg
CASE WM_COMMAND
SELECT CASE GET_WM_COMMAND_ID(wParam, lParam)
CASE IDCANCEL
' // If ESC key pressed, close the application sending an WM_CLOSE message
IF GET_WM_COMMAND_CMD(wParam, lParam) = BN_CLICKED THEN
SendMessageW hwnd, WM_CLOSE, 0, 0
EXIT FUNCTION
END IF
'---------------------------------------------- //
Case IDC_ADD
operation = "+"
Case IDC_SUBTRACT
operation = "-"
Case IDC_MULTIPLY
operation = "*"
Case IDC_DIVIDE
operation = "/"
Case IDC_CALCULATE
Dim num1 As Double
Dim num2 As Double
Dim result As Double
dim as string snum1=space(21)
dim as string snum2=space(21)
dim as string sresult=space(21)
'----------- problem zone ------------------------- //
' GetDlgItemText(hWnd, IDC_NUM1, strptr(snum1), 20)
' GetDlgItemText(hWnd, IDC_NUM2, strptr(snum2), 20)
'----------- problem zone ------------------------- //
num1= val(snum1)
num2= val(snum2)
' Perform calculation based on selected operation
Select Case operation
Case "+"
result = num1 + num2
Case "-"
result = num1 - num2
Case "*"
result = num1 * num2
Case "/"
If num2 <> 0 Then
result = num1 / num2
Else
Print "Cannot divide by zero!", , "Error"
Exit Function
End If
case Else
''default addition otherwise result = zero good!
result = num1 + num2
End Select
sresult=str(result) ' good
' Display result
'----------- problem zone ------------------------- //
' SetDlgItemText(hWnd, IDC_RESULT, Strptr(sresult))
End Select
'---------------------------------------------- //
CASE IDM_UNDO
MessageBox hwnd, "Undo option clicked", "Menu", MB_OK
EXIT FUNCTION
CASE IDM_REDO
MessageBox hwnd, "Redo option clicked", "Menu", MB_OK
EXIT FUNCTION
CASE IDM_HOME
MessageBox hwnd, "Home option clicked", "Menu", MB_OK
EXIT FUNCTION
CASE IDM_SAVE
MessageBox hwnd, "Save option clicked", "Menu", MB_OK
EXIT FUNCTION
CASE IDM_EXIT
SendMessageW hwnd, WM_CLOSE, 0, 0
EXIT FUNCTION
CASE WM_DESTROY
' // End the application by sending an WM_QUIT message
PostQuitMessage(0)
EXIT FUNCTION
END SELECT
' // Default processing of Windows messages
FUNCTION = DefWindowProcW(hWnd, uMsg, wParam, lParam)
END FUNCTION
' ========================================================================================
' ends
Btw: its possible to Change the font Size of the WinFBE Editor?
Regards Frank
Hi Frank,
I fixed your code. Hopefully it is easy to understand.
'
' mini calculator GUI by frank bruebach, 20:06 MEZ PM, 16.03.2024
' freebasic
#define UNICODE
#define _WIN32_WINNT &h0602
#INCLUDE ONCE "Afx/CWindow.inc"
#INCLUDE ONCE "Afx/AfxGdiPlus.inc"
#INCLUDE ONCE "Afx/AfxMenu.inc"
USING Afx
' // Menu identifiers
ENUM
IDM_UNDO = 5000 ' Undo
IDM_REDO ' Redo
IDM_HOME ' Home
IDM_SAVE ' Save
IDM_EXIT ' Exit
END ENUM
' Constants for controls
ENUM
IDC_NUM1 = 1000
IDC_NUM2
IDC_RESULT
IDC_ADD
IDC_SUBTRACT
IDC_MULTIPLY
IDC_DIVIDE
IDC_CALCULATE
END ENUM
DECLARE FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _
BYVAL hPrevInstance AS HINSTANCE, _
BYVAL szCmdLine AS ZSTRING PTR, _
BYVAL nCmdShow AS LONG) AS LONG
END WinMain(GetModuleHandleW(NULL), NULL, COMMAND(), SW_NORMAL)
' // Forward declaration
DECLARE FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT
' ========================================================================================
' Build the menu
' ========================================================================================
FUNCTION BuildMenu () AS HMENU
DIM hMenu AS HMENU
DIM hPopUpMenu AS HMENU
hMenu = CreateMenu
hPopUpMenu = CreatePopUpMenu
AppendMenuW hMenu, MF_POPUP OR MF_ENABLED, CAST(UINT_PTR, hPopUpMenu), "&File"
AppendMenuW hPopUpMenu, MF_ENABLED, IDM_UNDO, "&Undo" & CHR(9) & "Ctrl+U"
AppendMenuW hPopUpMenu, MF_ENABLED, IDM_REDO, "&Redo" & CHR(9) & "Ctrl+R"
AppendMenuW hPopUpMenu, MF_ENABLED, IDM_HOME, "&Home" & CHR(9) & "Ctrl+H"
AppendMenuW hPopUpMenu, MF_ENABLED, IDM_SAVE, "&Save" & CHR(9) & "Ctrl+S"
AppendMenuW hPopUpMenu, MF_ENABLED, IDM_EXIT, "E&xit" & CHR(9) & "Alt+F4"
FUNCTION = hMenu
END FUNCTION
' =================================================================================
FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _
BYVAL hPrevInstance AS HINSTANCE, _
BYVAL szCmdLine AS ZSTRING PTR, _
BYVAL nCmdShow AS LONG) AS LONG
' // Set process DPI aware
AfxSetProcessDPIAware
' // Create the main window
DIM pWindow AS CWindow
pWindow.Create(NULL, "mini Calculator GUI", @WndProc)
pWindow.SetClientSize(400, 350)
pWindow.Center
' // Add a button -> but I needed here some Radiobuttons too ;)
pWindow.AddControl("Button", , IDCANCEL, "&Close", 280, 280, 75, 23)
pWindow.AddControl("Edit",, IDC_NUM1, "", 50, 50, 75, 23)
pWindow.AddControl("Edit",, IDC_NUM2, "", 200, 50, 75, 23)
pWindow.AddControl("RADIOBUTTON",, IDC_ADD, "+", 50, 100, 30, 23, WS_GROUP)
pWindow.AddControl("RADIOBUTTON",, IDC_SUBTRACT, "-", 100, 100, 30, 23)
pWindow.AddControl("RADIOBUTTON",, IDC_MULTIPLY, "*", 150, 100, 30, 23)
pWindow.AddControl("RADIOBUTTON",, IDC_DIVIDE, "/", 200, 100, 30, 23)
pWindow.AddControl("BUTTON",, IDC_CALCULATE, "=", 250, 100, 75, 23)
pWindow.AddControl("Edit",, IDC_RESULT, "", 50, 150, 75, 23)
'
' ------------------ problem zone ----------------------------- //
' Set default operation to addition
' SendDlgItemMessage(hWnd, IDC_ADD, BM_SETCHECK, BST_CHECKED, 0)
CheckRadioButton(pWindow.hWindow, IDC_ADD, IDC_DIVIDE, IDC_ADD)
' ------------------ problem zone ----------------------------- //
' // Create the menu
DIM hMenu AS HMENU = BuildMenu
SetMenu pWindow.hWindow, hMenu
' // Add icons to the items of the File menu
DIM hSubMenu AS HMENU = GetSubMenu(hMenu, 0)
AfxAddIconToMenuItem(hSubMenu, 0, TRUE, AfxGdipIconFromRes(hInstance, "IDI_ARROW_LEFT_32"))
AfxAddIconToMenuItem(hSubMenu, 1, TRUE, AfxGdipIconFromRes(hInstance, "IDI_ARROW_RIGHT_32"))
AfxAddIconToMenuItem(hSubMenu, 2, TRUE, AfxGdipIconFromRes(hInstance, "IDI_HOME_32"))
AfxAddIconToMenuItem(hSubMenu, 3, TRUE, AfxGdipIconFromRes(hInstance, "IDI_SAVE_32"))
SetFocus GetDlgItem(pWindow.hWindow, IDC_NUM1)
' // Dispatch Windows messages
FUNCTION = pWindow.DoEvents(nCmdShow)
END FUNCTION
' ========================================================================================
' ========================================================================================
' Main window callback procedure
' ========================================================================================
FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT
SELECT CASE uMsg
CASE WM_COMMAND
IF GET_WM_COMMAND_CMD(wParam, lParam) = BN_CLICKED THEN
SELECT CASE GET_WM_COMMAND_ID(wParam, lParam)
CASE IDCANCEL
' // If ESC key pressed, close the application sending an WM_CLOSE message
SendMessageW hwnd, WM_CLOSE, 0, 0
EXIT FUNCTION
CASE IDC_CALCULATE
dim as double num1 = val(AfxGetWindowText(GetDlgItem(hwnd, IDC_NUM1)))
dim as double num2 = val(AfxGetWindowText(GetDlgItem(hwnd, IDC_NUM2)))
Dim as double result
' Perform calculation based on selected operation
if Button_GetCheck(GetDlgItem(hwnd,IDC_ADD)) = BST_CHECKED then
result = num1 + num2
end if
if Button_GetCheck(GetDlgItem(hwnd,IDC_SUBTRACT)) = BST_CHECKED then
result = num1 - num2
end if
if Button_GetCheck(GetDlgItem(hwnd,IDC_MULTIPLY)) = BST_CHECKED then
result = num1 * num2
end if
if Button_GetCheck(GetDlgItem(hwnd,IDC_DIVIDE)) = BST_CHECKED then
If num2 <> 0 Then
result = num1 / num2
Else
Print "Cannot divide by zero!", , "Error"
Exit Function
End If
end if
AfxSetWindowText(GetDlgItem(hwnd, IDC_RESULT), str(result))
CASE IDM_UNDO
MessageBox hwnd, "Undo option clicked", "Menu", MB_OK
EXIT FUNCTION
CASE IDM_REDO
MessageBox hwnd, "Redo option clicked", "Menu", MB_OK
EXIT FUNCTION
CASE IDM_HOME
MessageBox hwnd, "Home option clicked", "Menu", MB_OK
EXIT FUNCTION
CASE IDM_SAVE
MessageBox hwnd, "Save option clicked", "Menu", MB_OK
EXIT FUNCTION
CASE IDM_EXIT
SendMessageW hwnd, WM_CLOSE, 0, 0
EXIT FUNCTION
END SELECT
END IF
CASE WM_DESTROY
' // End the application by sending an WM_QUIT message
PostQuitMessage(0)
EXIT FUNCTION
END SELECT
' // Default processing of Windows messages
FUNCTION = DefWindowProcW(hWnd, uMsg, wParam, lParam)
END FUNCTION
' ========================================================================================
QuoteBtw: its possible to Change the font Size of the WinFBE Editor?
"File", "Preferences", "Environment Setup" (or simply press F7)
Select "Themes and Fonts"
You can change the font, font size, and the spacing between the lines.
Many thanks Paul !
QuoteI fixed your code. Hopefully it is easy to understand.
I See all Changes and understand new Afx Features... I am Glad its working :)
Thats my First gui SDK example with AFx beside openGl and I Like the WinFBE Editor too ITS a great Job and hard Work I can Imagine...
Nice Weekend Bye
, frank