Ay que tener en claro que las aplicaciones realizadas con la API de win32 solo funcionan en plataformas Windows.
Si el ejemplo no funciona es por el compilador de C++ la siguiente aplicación esta echa en Dev-C++, no entonos los compiladores funciona ya que cada una esta modificado por el fabricante, para que tengas cuidado. Aunque la idea es la misma.
Al final puedes descargar muchos ejemplos creados incluyendo este para que los puedas analizar.
Para comenzar crearemos la función principal en donde se hace la ventana en la cual trabajaremos.
Primero tenemos que registrar en el sistema una clase ventana, estilos, cursor, iconos, etc.
Después creamos la ventana con CreateWindowEx, le pasamos parámetros de posición, tamaño, titulo clase ventana, etc.
Por ultimo lo mas importante el bucle de mensajes, es por donde pasan todos los mensajes producidos en la ventana, este los obtiene y los manda el WndProc donde son procesados para realizar alguna acción.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc; //clase estructura de la ventana
HWND hwnd; //var de la ventana
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "El registro de windows fallo!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"Tablas de multiplicar",
WS_SYSMENU ,
CW_USEDEFAULT, CW_USEDEFAULT, 500, 500,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "No se creo el windows!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
updateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
En nuestro WndProc le decimos que es lo que queremos que haga nuestra ventana, primero le decimos que haga los controles de nuestra ventana, después en WM_COMMAND le estamos diciendo que las acciones entren y se comparan para hacer la multiplicación de las tablas y las asigna al listbox.
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HWND mosButton=0,borButton=0,salButton=0,tEdit=0,mListbox,tStatic=0;
switch(msg)
{
case WM_CREATE:
{
mosButton = CreateWindow (
"button",/*class del boton*/
"Mostrar",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, /*style del boton*/
300, 100, (10*8), (10*2),
hwnd,/*id del windows*/
(HMENU) 1,/*id del control*/
((LPCREATESTRUCT) lParam)->hInstance,
NULL
);
mosButton = CreateWindow (
"button",
"Borrar",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
300, 150, (10*8), (10*2),
hwnd,
(HMENU) 2,
((LPCREATESTRUCT) lParam)->hInstance,
NULL
);
mosButton = CreateWindow (
"button",
"Salir",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
0, 0, (10*8), (10*2),
hwnd,
(HMENU) 3,
((LPCREATESTRUCT) lParam)->hInstance,
NULL
);
tStatic = CreateWindow (
"static",/*class del boton*/
"No de la tabla:",
WS_CHILD | WS_VISIBLE, /*style de la etiqueta*/
50, 80, (10*10), (10*2),
hwnd,/*id del windows*/
(HMENU) 6,/*id del control*/
((LPCREATESTRUCT) lParam)->hInstance,
NULL
);
tEdit = CreateWindow (
"edit",/*class del boton*/
"1",
WS_CHILD | WS_BORDER | WS_VISIBLE, /*style de la caja de txt*/
150, 80, (10*5), (10*2),
hwnd,/*id del windows*/
(HMENU) 4,/*id del control*/
((LPCREATESTRUCT) lParam)->hInstance,
NULL
);
mListbox = CreateWindow (
"listbox",/*class del boton*/
"",
WS_CHILD | WS_VSCROLL | WS_BORDER | WS_VISIBLE, /*style de la lista*/
50, 100, (10*25), (10*20),
hwnd,/*id del windows*/
(HMENU) 5,/*id del control*/
((LPCREATESTRUCT) lParam)->hInstance,
NULL
);
return 0;
break;
}
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 1: //Mostrar
{
BOOL bSuccess;
int nTimes = GetDlgItemInt(hwnd, 4, &bSuccess, false);
if(bSuccess)
{
int i;
char text[35],nu[3];
char* buf;
for(i = 0;i < 10; i++)
{
gcvt(nTimes,5,nu);
strcpy(text,nu);
strncat(text," X ",3);
gcvt(i+1,5,nu);
strncat(text,nu,strlen(nu)-1);
strncat(text," = ",3);
gcvt((i+1)*nTimes,5,nu);
strncat(text,nu,strlen(nu)-1);
int index = SendDlgItemMessage(hwnd, 5, LB_ADDSTRING,
0, (LPARAM)text);
SendDlgItemMessage(hwnd, 5, LB_SETITEMDATA,
(WPARAM)index, (LPARAM)i);
}
GlobalFree((HANDLE)text);
}
else
{
MessageBox(hwnd, "Escribe el No de tabla:",
"Warning", MB_OK);
}
}
break;
case 2: //borrar
{
SendDlgItemMessage(hwnd, 5, LB_RESETCONTENT, 0, 0);
}
break;
case 3: //salir
{
SendMessage(hwnd,WM_CLOSE,0,0);
}
break;
}
return 0;
break;
case WM_LBUTTONDOWN:
{
char szFileName[MAX_PATH];
HINSTANCE hInstance = GetModuleHandle(NULL);
GetModuleFileName(hInstance, szFileName, MAX_PATH);
MessageBox(hwnd, szFileName, "Este programa es:
", MB_OK | MB_ICONINFORMATION);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}