Instru: Gracias por tomarte las molestias con esa explicación, ya lo veo más claro :)
Munire: Asi que la declaración y definición de los botones/edit va fuera del Switch, mientras que la declaración de los menus va fuera y la definición en WM_CREATE; ya veo como se organiza.
Sobre poner un texto me funciona a la perfección, basándome en tu ejemplo he hecho uno sencillo:
Código C++:
Ver originalLRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR texto[] = _T("Hello, World!");
switch (message) /* handle the messages */
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 200, 200, texto, _tcslen(texto));
EndPaint(hwnd, &ps);
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;
}
El
PAINTSTRUCT ps puedo suponer que es para crear un objeto (ps) de la estructura "PAINTSTRUCT", el
HDC hdc será lo mismo pero no tengo ni idea de para qué sirve
y el
TCHAR está claro que es el texto en si.
Luego abajo
hdc = BeginPaint(hwnd, &ps); me hago una idea por encima pero no lo tengo claro aunque he comprobado que puedo hacer lo siguiente:
Cita: LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR texto[] = _T("Hello, World!");
TCHAR texto2[] = _T("Otro texto");
switch (message) /* handle the messages */
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 200, 200, texto, _tcslen(texto));
TextOut(hdc, 300, 300, texto2, _tcslen(texto2));
EndPaint(hwnd, &ps);
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;
}
Puedo crear varios textos sin necesidad de crear más "hdc" ni "paintstruct", es mas, he eliminido el
EndPaint (hwnd, &ps) y no he encontrado ningún problema (¿por qué se debe finalizar la impresión?).
Ahora, aun poniendo la declaracón/definición del botón antes del switch no me deja crearle un evento, he probado 4583 cosas pero nada, puedo crear un evento a los menus y me va perfectamente pero no a los botones/edit. Cuando le doy clic al botón no consigo que realice ninguna acción ni cuando escribo un texto en los edit no me lo guarda en una variable. Aqui te dejo el código del mejor resultado que he conseguido creandole un evento a un botón:
Código C++:
Ver original#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
HINSTANCE miinstance;
/* 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 */
miinstance = hThisInstance;
/* 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)
{
HWND boton1 = CreateWindowEx (0,"BUTTON", "Texto", WS_CHILD|WS_VISIBLE|WS_TABSTOP, 100, 100, 100, 20, hwnd, 0, miinstance, NULL);
switch (message) /* handle the messages */
{
case WM_COMMAND:
if((HWND)lParam==boton1)
{
MessageBox (NULL, "Esto es un texto", "Título", MB_OK | MB_ICONEXCLAMATION);
}
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;
}
Se me queda pillada la ventana completamente vacia y al rato aparece el botón pero aunque le doy no hace nada. En fin no se me ocurren más cosas que probar y me he recorrido medio internet asi que vuelvo a recurrir a vosotros a ver si podéis decime cómo se hace.
Sientos las molestias, gracias por adelantado. Saludos.