[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