• Welcome to PlanetSquires Forums.
 

Menu. + Calculator

Started by Frank Bruebach, March 16, 2024, 04:28:15 PM

Previous topic - Next topic

Frank Bruebach

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

Paul Squires

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.
Paul Squires
PlanetSquires Software
WinFBE Editor and Visual Designer

Frank Bruebach

#2
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