[C con Clase] dudassobre como crear formulario en la api de windows
Steven Davidson
srd4121 en njit.edu
Mar Nov 30 17:44:27 CET 2010
Hola Luis Alfonso,
2010/11/24 luis alfonso jimenez mejia <viejolajimenez en gmail.com>
> bueno se que para cambiar insertar dibujos y eso utlizaremos el
> VM_PAINT me gustaria que me explicaran como
En primer lugar, el mensaje se llama 'WM_PAINT'.
Para establecer el color del área del cliente de una ventana - el color de
fondo - podemos registrar un pincel con la clase de la ventana. El miembro
'hbrBackground' de la estructura 'WNDCLASSEX' guarda susodicho pincel. Por
ejemplo,
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE nulo, LPSTR lpszCmdParam,
int nCmdShow )
{
WNDCLASSEX wc;
...
wc.hbrBackground = CreateSolidBrush( RGB(0,255,0) );
...
}
Si este miembro es NULL, entonces la aplicación debe redibujar el fondo
explícitamente. Para esto, procesamos el mensaje 'WM_ERASEBKGND' y usamos un
pincel para rellenar un rectángulo que cubra toda el área del cliente de la
ventana. Si quieres establecer un color conocido, entonces puedes crear el
pincel al procesar el mensaje 'WM_CREATE' para que se haga una sola vez. Por
ejemplo,
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT msg, WPARAM wParam,
LPARAMlParam )
{
static HBRUSH hbrFondo;
switch( msg )
{
case WM_CREATE:
hbrFondo = CreateSolidBrush( RGB(0,255,0) ); // Creamos un pincel
verde
break;
case WM_DESTROY:
DeleteObject( hbrFondo ); // Liberamos el pincel
PostQuitMessage( 0 );
break;
case WM_ERASEBKGND:
{
HDC hdc = (HDC) wParam;
RECT rect;
GetClientRect( hwnd, &rect ); // 'rect' es el área del cliente de
esta ventana
FillRect( hdc, &rect, hbrFondo ); // Rellenamos con el pincel tal
rectángulo
return 1; // Algo diferente a 0 => se ha dibujado el fondo
}
}
...
return 0;
}
La otra solución es reestableciendo el pincel de fondo del miembro
'hbrBackground' de la clase de la ventana, en la estructura 'WNDCLASSEX'.
Esto se puede hacer dinámicamente invocando la función 'SetClassLongPtr()'.
Por ejemplo,
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam )
{
static HBRUSH hbrFondo;
switch( msg )
{
case WM_CREATE:
{
ULONG_PTR ret = SetClassLongPtr( hwnd, GCLP_HBRBACKGROUND,
(LONG_PTR)CreateSolidBrush( RGB(0,255,0) );
if( ret != 0 ) DeleteObject( (HBRUSH)ret ); // Liberamos el pincel
previamente establecido
break;
}
}
...
return 0;
}
Aquí no procesamos 'WM_ERASEBKGND', ya que se hace automáticamente usando el
pincel en el miembro 'hbrBackground' de la clase de la ventana.
> cambiarel color de la ventana de negro a gris y como agregar
> botones a ese fichero que le anexo en el comprimido expliqueeme para
> que se sirme el VM_COMMAND, VM_CREATE para que sirve todo eso y
> como lo aprovecho
Los mensajes de la ventana tienen el prefijo WM, por lo que los nombres de
estos mensajes son: WM_COMMAND y WM_CREATE.
Brevemente diré que 'WM_COMMAND' sirve para procesar mensajes que proceden
de ciertos elementos de la ventana: menúes, aceleradores (atajos del
teclado), y controles como botones, cuadros de edición, cuadros de listados,
etc.. El mensaje 'WM_CREATE' se envía una sola vez al crear la ventana
cuando se invoca 'CreateWindowEx()'. Te sirve para realizar cualesquier
tareas de inicio; típicamente, hacemos asignaciones de las variables locales
estáticas dentro de la función, 'WindowProcedure()'.
Para una introducción al mensaje 'WM_COMMAND', consulta el capítulo 5 de
nuestro curso del API de MS-Windows. El enlace es:
http://winapi.conclase.net/curso/index.php?cap=005b#C5_COMMAND Para una
referencia de este mensaje, dirígite a:
http://winapi.conclase.net/curso/?winmsg=WM_COMMAND#inicio
Para el mensaje 'WM_CREATE', consulta la referencia yendo a:
http://winapi.conclase.net/curso/?winmsg=WM_CREATE#inicio
Espero que todo esto te sirva.
Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20101130/c6ffc77c/attachment-0001.html>
Más información sobre la lista de distribución Cconclase