Thread: WM_COMMAND help

  1. #1
    VA National Guard The Brain's Avatar
    Join Date
    May 2004
    Location
    Manassas, VA USA
    Posts
    903

    WM_COMMAND help

    this code does not appear to be reacting to the WM_COMMAND message.. I even tried placing MessageBox( ) and SendMessage() calls directly in the WM_COMMAND case.. and nothing happens.. what am I doing wrong..?

    Code:
    #include <windows.h>
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "calculator";
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "calculator",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               207,                 /* The programs width */
               282,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    
    class Calculator
    {
     public:       
            
            //Calculator(hwnd);
            void command(WPARAM, LPARAM);
            void create(HWND);
            int destroy();
            
     //private:
             
            HWND hNumbers[10], hOperators[4], 
                 hDecimal, hClear, hStatic;  
                 
            double subtotal;             
            
    };
    
    enum keypad
    {
         ID_Button_0,
         ID_Button_1, ID_Button_2, ID_Button_3,
         ID_Button_4, ID_Button_5, ID_Button_6,
         ID_Button_7, ID_Button_8, ID_Button_9,      
         ID_Button_ADD,   ID_Button_SUB, 
         ID_Button_MULT,  ID_Button_DIV,
         ID_Button_CLEAR, ID_Static
    };
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {   
       
       Calculator MyCalc;
                   
        switch (message)                  /* handle the messages */
        {        
            case WM_CREATE:   MyCalc.create(hwnd);               break;   
            case WM_COMMAND:  MyCalc.command(wParam, lParam);    break;
            case WM_DESTROY:  MyCalc.destroy();                  break;
            
                
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    
    
    //Function Definitions
    
    void Calculator::create(HWND hwnd)
    {
    
       int index = 1;
       TCHAR *numbers[]   = {"1","2","3","4","5","6","7","8","9"};
       
       for(int y=150; y>49; y-=50)
       for(int x=0;  x<101; x+=50)    
       {                 
          hNumbers[index] = CreateWindow("BUTTON", numbers[index-1], 
                            WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
                            x, y, 50, 50, hwnd, (HMENU)index,
                            (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);  
                            index++;                    
       }
       
       index = 0;
       TCHAR *operators[] = {"+","-","*","/"};
       
       int x  = 150, y = 0;
       int ID = ID_Button_ADD;      
       
       for(int i=0; i<4; i++)
       {
          hOperators[i] = CreateWindow("BUTTON", operators[i], 
                          WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
                          x, y+=50, 50, 50, hwnd, (HMENU)ID++,
                          (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
                              
               
       
       hNumbers[0] = CreateWindow("BUTTON", "0", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
                               0, 200, 50, 50, hwnd, (HMENU)ID_Button_0,
                              (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); 
                              
       hDecimal    = CreateWindow("BUTTON", ".", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
                               50, 200, 50, 50, hwnd, (HMENU)ID_Button_0,
                              (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
                              
       hClear      = CreateWindow("BUTTON", "Clear", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
                               100, 200, 50, 50, hwnd, (HMENU)ID_Button_0,
                              (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);  
                              
       hStatic     = CreateWindow("STATIC", "edit" , WS_CHILD|WS_VISIBLE|WS_BORDER,
                               5, 10, 188, 20, hwnd, (HMENU)ID_Static, 
                              (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
                               
                                           
        
    }
    
    
    void Calculator::command(WPARAM wParam, LPARAM lParam)
    {
        WORD msg = LOWORD(wParam);
        TCHAR *numbers[]   = {"1","2","3","4","5","6","7","8","9"};
         
         //if(msg /* >= ID_Button_0 && msg <= ID_Button_9 */)
           
             //Experimenting with using either a static window or an edit box
             //SendMessage(hEditBox, WM_SETTEXT, 0, (LPARAM)numbers[msg]);
             SetWindowText(hStatic, numbers[msg]); 
    }
                               
      
    int Calculator::destroy() 
    {
         PostQuitMessage(0);
         return 0;
    }
    Last edited by The Brain; 02-23-2006 at 02:15 PM.
    • "Problem Solving C++, The Object of Programming" -Walter Savitch
    • "Data Structures and Other Objects using C++" -Walter Savitch
    • "Assembly Language for Intel-Based Computers" -Kip Irvine
    • "Programming Windows, 5th edition" -Charles Petzold
    • "Visual C++ MFC Programming by Example" -John E. Swanke
    • "Network Programming Windows" -Jones/Ohlund
    • "Sams Teach Yourself Game Programming in 24 Hours" -Michael Morrison
    • "Mathmatics for 3D Game Programming & Computer Graphics" -Eric Lengyel

  2. #2
    erstwhile
    Join Date
    Jan 2002
    Posts
    2,227
    Looks fine to me. What behaviour exactly were you looking for and not getting?

    While it's nothing to do with your problem, you might consider changing your message loop slightly to reflect the issues raised under the GetMessage description on msdn.
    CProgramming FAQ
    Caution: this person may be a carrier of the misinformation virus.

  3. #3
    VA National Guard The Brain's Avatar
    Join Date
    May 2004
    Location
    Manassas, VA USA
    Posts
    903
    the program does not respond to button clicks.. when I press any of the numbered buttons, the static window should display the number of the button pressed. I was hoping that by reacting to the WM_COMMAND message... and the LOWORD of the wParam.. I could SetWindowText( ) of the static window to represent the number of the button being pressed.. but nothing happens..
    • "Problem Solving C++, The Object of Programming" -Walter Savitch
    • "Data Structures and Other Objects using C++" -Walter Savitch
    • "Assembly Language for Intel-Based Computers" -Kip Irvine
    • "Programming Windows, 5th edition" -Charles Petzold
    • "Visual C++ MFC Programming by Example" -John E. Swanke
    • "Network Programming Windows" -Jones/Ohlund
    • "Sams Teach Yourself Game Programming in 24 Hours" -Michael Morrison
    • "Mathmatics for 3D Game Programming & Computer Graphics" -Eric Lengyel

  4. #4
    Registered User
    Join Date
    Jul 2005
    Posts
    69
    Code:
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {   
       Calculator MyCalc;
    Now that code is going to give you alot of trouble. It's because MyCalc is being created and going out of scope every time the WindowsProcedure function is called (and that's a ton of times). You could make MyCalc global or leave it where it is and declare it as static:

    static Calculator MyCalc;

    I think that should bring your code to where you can see results and begin debugging.

    Regards,
    Brian

  5. #5
    VA National Guard The Brain's Avatar
    Join Date
    May 2004
    Location
    Manassas, VA USA
    Posts
    903
    oh... #@$%#$ good call..


    -thankssss


    !!!
    • "Problem Solving C++, The Object of Programming" -Walter Savitch
    • "Data Structures and Other Objects using C++" -Walter Savitch
    • "Assembly Language for Intel-Based Computers" -Kip Irvine
    • "Programming Windows, 5th edition" -Charles Petzold
    • "Visual C++ MFC Programming by Example" -John E. Swanke
    • "Network Programming Windows" -Jones/Ohlund
    • "Sams Teach Yourself Game Programming in 24 Hours" -Michael Morrison
    • "Mathmatics for 3D Game Programming & Computer Graphics" -Eric Lengyel

Popular pages Recent additions subscribe to a feed