Win Api - obsługa kliknięcia

Z góry zaznaczam ze dopiero zaczynam zabawę z WinApi,korzystam z kursów online i już na początku mały ZONK, mianowicie mam coś takiego :?

#include 


/* Declare Windows procedure */

LRESULT CALLBACK WindowProcedure (HWND , UINT , WPARAM, LPARAM);


/* Make the class name into a global variable */

char szClassName[] = "WindowsApp";


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 */

           "Glowne okno programu", /* Title Text */

           WS_OVERLAPPEDWINDOW, /* default window */

           CW_USEDEFAULT, /* Windows decides the position */

           CW_USEDEFAULT, /* where the window ends up on the screen */

           544, /* The programs width */

           375, /* 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 */


   HWND a = CreateWindowEx(0, "BUTTON", "Click me", WS_CHILD | WS_VISIBLE, 10, 10, 150, 30 ,hwnd, NULL, hThisInstance, NULL);

  HWND b = CreateWindowEx(0, "BUTTON", "Ckeckbox", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 100, 100, 150, 30, hwnd, NULL, hThisInstance, NULL);

   HWND c = CreateWindowEx(0, "BUTTON", "Ckeckbox", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 100, 200, 150, 30, hwnd, NULL, hThisInstance, NULL);

   HWND d = CreateWindowEx(0, "BUTTON", "Ckeckbox", WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON, 300, 300, 150, 30, hwnd, NULL, hThisInstance, NULL);






    ShowWindow (hwnd, nFunsterStil);

     UpdateWindow(hwnd);


    /* 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;

}



/* This function is called by the Windows function DispatchMessage() */


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    switch (message) /* handle the messages */

    {

        case WM_DESTROY:

            PostQuitMessage (0); /* send a WM_QUIT to the message queue */

            break;


case WM_KEYDOWN:

     PostQuitMessage (0); /* send a WM_QUIT to the message queue */

            break;


            case WM_COMMAND:

// if((HWND)lParam == a)

{

  MessageBox(hwnd, "Nacisnąłeś przycisk!", "Ha!", MB_ICONINFORMATION);

}

break;





        default: /* for messages that we don't deal with */

            return DefWindowProc (hwnd, message, wParam, lParam);

    }


    return 0;

}

moje pytanie dlaczego za komentowana linijka

// if((HWND)lParam == a)

wywala błąd

:roll:

Jeśli po zakomentowaniu wywala ten błąd to coś jest dziwnego.

Jeśli po odkomentowaniu wywala ten błąd, to jest to normalne. “a” nie jest zdefiniowane w danym zakresie(jest zdefiniowane w main, nie w WindowProcedure). Wstaw przed main() deklarację a i usuń deklarację z maina. Wtedy zadziała tak jak napisałeś.

Zmienne:

HWND hwnd,a,b,c,d;

z funkcji WinMain() zrób globalnymi.

W funkcji WindowProcedure() i pewnie nie tylko będziesz je używać.

Zauważ że hwnd z WinMain(), nie zawsze jest to samo co hwnd z WindowProcedure().

nie no sorry źle się wyraziłem po za komentowaniu oczywiście kompiluje się i działa jednak po od komentowaniu nie kompilowało się, ale poradziłem sobie - dzienx Fiołek naprowadziłeś mnie na błąd: