Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ..:ALT3RD:.. en 25 Agosto 2011, 15:27 pm



Título: Problema con WINAPI
Publicado por: ..:ALT3RD:.. en 25 Agosto 2011, 15:27 pm
Bueno,

pues hoy empeze con la WINAPI (un rollazo por cierto  :xD) y tengo un error al copilar un sencillo menu en CODE::BLOCKS. No se donde esta el error asi que agradecería que me lo dijesen.

Código:
#include <windows.h>
const int MENSAJE = 1000;
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "CodeBlocksWindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    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 colour 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 */
           "Pruebas tranquiiilo",       /* 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 */
    ShowWindow (hwnd, nCmdShow);

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

        HMENU menu1,menu2;

        menu1= CreateMenu();
        menu2= CreateMenu();

        AppendMenu (menu2, MF_STRING, MENSAJE, "mensaje");

        AppendMenu (menu1, MF_STRING | MF_POPUP| (UINT) menu2, "menu");

        SetMenu (hwnd, menu1);

        break;


        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}


Ese es el codigo entero, y la parte donde me falla es esta:ç


Código:
   switch (message)                  /* handle the messages */
    {
        case WM_CREATE:

        HMENU menu1,menu2;

        menu1= CreateMenu();
        menu2= CreateMenu();

        AppendMenu (menu2, MF_STRING, MENSAJE, "mensaje");

        AppendMenu (menu1, MF_STRING | MF_POPUP| (UINT) menu2, "menu");

        SetMenu (hwnd, menu1);

        break;


        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;


Y la verdad no encuentro el error, espero que vosotros me lo digais. Gracias y Un salu2!


Por cierto el error que me da es este:

Código:
C:\Users\Celia\Pictures\iPod Photo Cache\GUI\main.cpp||In function 'LRESULT WindowProcedure(HWND__*, UINT, WPARAM, LPARAM)':|
C:\Users\Celia\Pictures\iPod Photo Cache\GUI\main.cpp|87|error: invalid conversion from 'const char*' to 'UINT_PTR'|
C:\Users\Celia\Pictures\iPod Photo Cache\GUI\main.cpp|87|error: too few arguments to function 'BOOL AppendMenuA(HMENU__*, UINT, UINT_PTR, const CHAR*)'|
c:\mingw\bin\..\lib\gcc\mingw32\4.5.2\..\..\..\..\include\winuser.h|3462|note: declared here|
||=== Build finished: 3 errors, 0 warnings ===|


Título: Re: Problema con WINAPI
Publicado por: Eternal Idol en 26 Agosto 2011, 13:01 pm
Aca parece que cambiaste una coma por un or:

AppendMenu (menu1, MF_STRING | MF_POPUP| (UINT) menu2, "menu");

AppendMenu (menu1, MF_STRING | MF_POPUP, (UINT) menu2, "menu");

PD. Lo dice todo en el output del compilador y eso que no sabia cual era la linea 87.


Título: Re: Problema con WINAPI
Publicado por: ..:ALT3RD:.. en 26 Agosto 2011, 13:13 pm
Vaya error mas tonto, Gracias!  ;D


Título: Re: Problema con WINAPI
Publicado por: Eternal Idol en 26 Agosto 2011, 14:25 pm
De nadas  ::)


Título: Re: Problema con WINAPI
Publicado por: Alien-Z en 26 Agosto 2011, 20:23 pm
Estoy haciendo un ejemplo similar y ami me da error en esta parte (señalo en rojo):

Citar
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
       case WM_CREATE:
            HMENU menu1 = CreateMenu();
            HMENU menu2 = CreateMenu();
            AppendMenu(menu2, MF_STRING, MN_MENSAJE, "&Mensaje");
            AppendMenu(menu2, MF_STRING, MN_SALIR, "&Salir");
            AppendMenu(menu1, MF_STRING | MF_POPUP, (UINT)menu2, "&MiMenu");
            SetMenu (hwnd, menu1);
            break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

Este es el código completo:

Código
  1. #include <windows.h>
  2.  
  3. const int MN_MENSAJE=1025;
  4. const int MN_SALIR=1026;
  5. //poner el nombre que quieran
  6. /*  Declare Windows procedure  */
  7. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
  8.  
  9. /*  Make the class name into a global variable  */
  10. char szClassName[ ] = "CodeBlocksWindowsAp p";
  11.  
  12. int WINAPI WinMain (HINSTANCE hThisInstance,
  13.                     HINSTANCE hPrevInstance,
  14.                     LPSTR lpszArgument,
  15.                     int nCmdShow)
  16. {
  17.    HWND hwnd;               /* This is the handle for our window */
  18.    MSG messages;            /* Here messages to the application are saved */
  19.    WNDCLASSEX wincl;        /* Data structure for the windowclass */
  20.  
  21.    /* The Window structure */
  22.    wincl.hInstance = hThisInstance;
  23.    wincl.lpszClassName = szClassName;
  24.    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
  25.    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
  26.    wincl.cbSize = sizeof (WNDCLASSEX);
  27.  
  28.    /* Use default icon and mouse-pointer */
  29.    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  30.    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  31.    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  32.    wincl.lpszMenuName = NULL;                 /* No menu */
  33.    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
  34.    wincl.cbWndExtra = 0;                      /* structure or the window instance */
  35.    /* Use Windows's default colour as the background of the window */
  36.    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
  37.  
  38.    /* Register the window class, and if it fails quit the program */
  39.    if (!RegisterClassEx (&wincl))
  40.        return 0;
  41.  
  42.    /* The class is registered, let's create the program*/
  43.    hwnd = CreateWindowEx (
  44.           0,                   /* Extended possibilites for variation */
  45.           szClassName,         /* Classname */
  46.           "Code::Blocks Template Windows App",       /* Title Text */
  47.           WS_OVERLAPPEDWINDOW, /* default window */
  48.           CW_USEDEFAULT,       /* Windows decides the position */
  49.           CW_USEDEFAULT,       /* where the window ends up on the screen */
  50.           544,                 /* The programs width */
  51.           375,                 /* and height in pixels */
  52.           HWND_DESKTOP,        /* The window is a child-window to desktop */
  53.           NULL,                /* No menu */
  54.           hThisInstance,       /* Program Instance handler */
  55.           NULL                 /* No Window Creation data */
  56.           );
  57.  
  58.    /* Make the window visible on the screen */
  59.    ShowWindow (hwnd, nCmdShow);
  60.  
  61.    /* Run the message loop. It will run until GetMessage() returns 0 */
  62.    while (GetMessage (&messages, NULL, 0, 0))
  63.    {
  64.        /* Translate virtual-key messages into character messages */
  65.        TranslateMessage(&messages);
  66.        /* Send message to WindowProcedure */
  67.        DispatchMessage(&messages);
  68.    }
  69.  
  70.    /* The program return-value is 0 - The value that PostQuitMessage() gave */
  71.    return messages.wParam;
  72. }
  73.  
  74.  
  75. /*  This function is called by the Windows function DispatchMessage()  */
  76.  
  77. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  78. {
  79.    switch (message)                  /* handle the messages */
  80.    {
  81.       case WM_CREATE:
  82.            HMENU menu1 = CreateMenu();
  83.            HMENU menu2 = CreateMenu();
  84.            AppendMenu(menu2, MF_STRING, MN_MENSAJE, "&Mensaje");
  85.            AppendMenu(menu2, MF_STRING, MN_SALIR, "&Salir");
  86.            AppendMenu(menu1, MF_STRING | MF_POPUP, (UINT)menu2, "&MiMenu");
  87.            SetMenu (hwnd, menu1);
  88.            break;
  89.        case WM_DESTROY:
  90.            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
  91.            break;
  92.        default:                      /* for messages that we don't deal with */
  93.            return DefWindowProc (hwnd, message, wParam, lParam);
  94.    }
  95.  
  96.    return 0;
  97. }
  98.  


A ver si alguien puede decirme dónde está el fallo. Saludos.


Título: Re: Problema con WINAPI
Publicado por: Queta en 26 Agosto 2011, 20:55 pm
Código
  1. switch(message)
  2. {
  3. case WM_CREATE:
  4. {
  5. HMENU menu1 = CreateMenu();
  6. HMENU menu2 = CreateMenu();
  7.  
  8. AppendMenu(menu2, MF_STRING, MN_MENSAJE, "&Mensaje");
  9.  
  10. AppendMenu(menu2, MF_STRING, MN_SALIR, "&Salir");
  11.  
  12. AppendMenu(menu1, MF_STRING | MF_POPUP, (UINT)menu2, "&MiMenu");
  13.  
  14. SetMenu(hwnd, menu1);
  15.  
  16. break;
  17. }
  18.  
  19. case WM_DESTROY:
  20. PostQuitMessage(0);      
  21.  
  22. break;
  23.  
  24. default:                      
  25. return DefWindowProc(hwnd, message, wParam, lParam);
  26. }

Haz esto.


Título: Re: Problema con WINAPI
Publicado por: Alien-Z en 26 Agosto 2011, 21:00 pm
Vaya la leche! las llaves! Es lo que tiene estar concentrado en comprender los nuevos códigos, te acabas olvidando de detalles tontos que has usado 4543 veces.

Gracias Queta. Saludos.


Título: Re: Problema con WINAPI
Publicado por: Queta en 26 Agosto 2011, 21:35 pm
De nada. Realmente, switch no necesita llaves, pero sí en este caso en particular.