Hola Luis Alfonso,<br><br>
<div class="gmail_quote">2010/11/24 luis alfonso jimenez mejia <span dir="ltr"><<a href="mailto:viejolajimenez@gmail.com" target="_blank">viejolajimenez@gmail.com</a>></span><br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">bueno se que para cambiar insertar dibujos y eso utlizaremos el VM_PAINT me gustaria que me explicaran como </blockquote>
<div> </div>
<div>En primer lugar, el mensaje se llama 'WM_PAINT'.</div>
<div> </div>
<div>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,</div>
<div> </div>
<div><span>int</span> <span>WINAPI WinMain</span>( <span>HINSTANCE</span> hInstance, <span>HINSTANCE</span> nulo, <span>LPSTR</span> lpszCmdParam, <span>int</span> nCmdShow )<br>{</div>
<div> WNDCLASSEX wc;</div>
<div> ...</div>
<div> wc.hbrBackground = CreateSolidBrush( RGB(0,255,0) );</div>
<div> ...</div>
<div>}</div>
<div> </div>
<div>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,</div>
<div> </div>
<div><span>LRESULT</span> <span>CALLBACK WindowProcedure</span>( <span>HWND</span> hwnd, <span>UINT</span> msg, <span>WPARAM</span> wParam, <span>LPARAM</span> lParam )<br>{</div>
<div> static HBRUSH hbrFondo;</div>
<div><br> <span>switch</span>( msg )</div>
<div> {</div>
<div> case WM_CREATE:</div>
<div> hbrFondo = CreateSolidBrush( RGB(0,255,0) ); // Creamos un pincel verde</div>
<div> break;</div>
<div> </div>
<div>
<div> case WM_DESTROY:</div>
<div> DeleteObject( hbrFondo ); // Liberamos el pincel</div>
<div> PostQuitMessage( 0 );</div>
<div> break;</div>
<div> </div></div>
<div>
<div> case WM_ERASEBKGND:<br> {<br> HDC hdc = (HDC) wParam;<br> RECT rect;<br> GetClientRect( hwnd, &rect ); // 'rect' es el área del cliente de esta ventana<br> FillRect( hdc, &rect, hbrFondo ); // Rellenamos con el pincel tal rectángulo<br>
return 1; // Algo diferente a 0 => se ha dibujado el fondo<br> }<br></div> }</div>
<div> ...</div>
<div> return 0;</div>
<div>}</div>
<div> </div>
<div>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,</div>
<div> </div>
<div>
<div><span>LRESULT</span> <span>CALLBACK WindowProcedure</span>( <span>HWND</span> hwnd, <span>UINT</span> msg, <span>WPARAM</span> wParam, <span>LPARAM</span> lParam )<br>{</div>
<div> static HBRUSH hbrFondo;</div>
<div><br> <span>switch</span>( msg )</div>
<div> {</div>
<div> case WM_CREATE:</div>
<div> {</div>
<div> ULONG_PTR ret = SetClassLongPtr( hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)CreateSolidBrush( RGB(0,255,0) );</div>
<div> if( ret != 0 ) DeleteObject( (HBRUSH)ret ); // Liberamos el pincel previamente establecido</div>
<div> break;</div>
<div> }</div>
<div> }</div>
<div> ...</div>
<div> return 0;</div>
<div>}</div></div>
<div> </div>
<div>Aquí no procesamos 'WM_ERASEBKGND', ya que se hace automáticamente usando el pincel en el miembro 'hbrBackground' de la clase de la ventana.</div>
<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">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</blockquote>
<div> </div>
<div>Los mensajes de la ventana tienen el prefijo WM, por lo que los nombres de estos mensajes son: WM_COMMAND y WM_CREATE.</div>
<div> </div>
<div>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()'.</div>
<div> </div>
<div>Para una introducción al mensaje 'WM_COMMAND', consulta el capítulo 5 de nuestro curso del API de MS-Windows. El enlace es: <a href="http://winapi.conclase.net/curso/index.php?cap=005b#C5_COMMAND">http://winapi.conclase.net/curso/index.php?cap=005b#C5_COMMAND</a> Para una referencia de este mensaje, dirígite a: <a href="http://winapi.conclase.net/curso/?winmsg=WM_COMMAND#inicio">http://winapi.conclase.net/curso/?winmsg=WM_COMMAND#inicio</a></div>
<div> </div>
<div>Para el mensaje 'WM_CREATE', consulta la referencia yendo a: <a href="http://winapi.conclase.net/curso/?winmsg=WM_CREATE#inicio">http://winapi.conclase.net/curso/?winmsg=WM_CREATE#inicio</a></div>
<div> </div>
<div> </div>
<div>Espero que todo esto te sirva.</div>
<div> </div>
<div>Steven</div>
<div> </div></div>