Problema con WINAPI

Iniciado por ..:ALT3RD:.., 25 Agosto 2011, 15:27 PM

0 Miembros y 1 Visitante están viendo este tema.

..:ALT3RD:..

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.

#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:ç


   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:\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 ===|
"Mañana sabrás que hoy no sabes nada"

Eternal Idol

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

..:ALT3RD:..

Vaya error mas tonto, Gracias!  ;D
"Mañana sabrás que hoy no sabes nada"

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Alien-Z

#4
Estoy haciendo un ejemplo similar y ami me da error en esta parte (señalo en rojo):

CitarLRESULT 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 (cpp) [Seleccionar]
#include <windows.h>

const int MN_MENSAJE=1025;
const int MN_SALIR=1026;
//poner el nombre que quieran
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

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

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 */
          "Code::Blocks Template Windows App",       /* 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 = 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;
}



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

Queta

#5
Código (cpp) [Seleccionar]
switch(message)
{
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);      
       
break;

default:                      
return DefWindowProc(hwnd, message, wParam, lParam);
}


Haz esto.
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

Alien-Z

#6
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.

Queta

De nada. Realmente, switch no necesita llaves, pero sí en este caso en particular.
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.