Página 1 de 1

Pintar dentro o en borde de un control TEdit

Publicado: Dom Feb 13, 2011 2:24 am
por Juan Jose
Hola a todos
Intento hacer una marca en los edit obligatorios con parte de la rutina de
Jose Ramon publicada aqui
pero me sale un efecto raro al cambiar de ventana,pestaña,ect...
Estaria bien consegir un efecto de triangulo en una esquina, pero me
conformo con las lineas del borde
alguien me puede ayudar
#pragma BEGINDUMP
#include "windows.h"
#include "xailer.h"
#include "colors.ch"
#include <commctrl.h>
HB_FUNC_STATIC( TEDIT_WMNCPAINT )
{
PHB_ITEM Self = hb_stackSelfItem();
HWND hWnd = GetHandleOf( Self );
if( XA_ObjGetL( Self, "lObligado" ) )
{
HDC hdc = GetWindowDC( hWnd );
RECT rect;
HPEN hbr = CreatePen( PS_SOLID, 1, clRed );
HPEN hOldPen = SelectObject( hdc, (HPEN) hbr );
GetWindowRect( hWnd, &rect );
rect.right -= rect.left; // Ancho
rect.bottom -= rect.top; // Alto
rect.left = 0;
rect.top = 0;
// arriba // izquierda
MoveToEx( hdc, 0, rect.bottom -= rect.top+1, NULL );
// horizontal // vertical
LineTo( hdc, rect.right -= rect.left+1, rect.bottom -=
rect.top );
LineTo( hdc, rect.right -= rect.left, rect.top);
//MoveToEx( hdc, 0, 0 , NULL );
SelectObject( hdc, (HPEN) hOldPen );
DeleteObject( hbr );
}
else
PrevWindowProc( hWnd, WM_NCPAINT, hb_parnl( 1 ), 0 );
hb_retnl( 0 );
}


Attached files ATT01133.txt (197 B)Â

Pintar dentro o en borde de un control TEdit

Publicado: Dom Feb 13, 2011 6:28 am
por Carlos Ortiz
Algo mas sencillo y que no necesita incluír ningún código adicional es
cambiar el color de nClrPane para los campos que són obligatorios. No será
lo más bonito pero no queda mal.
"Juan Jose Lopez Garcia" <correo@jjlopezg.jazztel.es> escribió en el mensaje
news:4d5732e0$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Hola a todos
>
> Intento hacer una marca en los edit obligatorios con parte de la rutina de
> Jose Ramon publicada aqui
> pero me sale un efecto raro al cambiar de ventana,pestaña,ect...
> Estaria bien consegir un efecto de triangulo en una esquina, pero me
> conformo con las lineas del borde
>
> alguien me puede ayudar
>
>
> #pragma BEGINDUMP
>
> #include "windows.h"
> #include "xailer.h"
> #include "colors.ch"
> #include <commctrl.h>
>
> HB_FUNC_STATIC( TEDIT_WMNCPAINT )
> {
> PHB_ITEM Self = hb_stackSelfItem();
> HWND hWnd = GetHandleOf( Self );
>
> if( XA_ObjGetL( Self, "lObligado" ) )
> {
> HDC hdc = GetWindowDC( hWnd );
> RECT rect;
> HPEN hbr = CreatePen( PS_SOLID, 1, clRed );
> HPEN hOldPen = SelectObject( hdc, (HPEN) hbr );
>
> GetWindowRect( hWnd, &rect );
> rect.right -= rect.left; // Ancho
> rect.bottom -= rect.top; // Alto
> rect.left = 0;
> rect.top = 0;
> // arriba // izquierda
> MoveToEx( hdc, 0, rect.bottom -= rect.top+1, NULL );
> // horizontal // vertical
> LineTo( hdc, rect.right -= rect.left+1, rect.bottom -=
> rect.top );
> LineTo( hdc, rect.right -= rect.left, rect.top);
> //MoveToEx( hdc, 0, 0 , NULL );
>
>
> SelectObject( hdc, (HPEN) hOldPen );
> DeleteObject( hbr );
> }
> else
> PrevWindowProc( hWnd, WM_NCPAINT, hb_parnl( 1 ), 0 );
>
> hb_retnl( 0 );
> }
>
>
>
>

Pintar dentro o en borde de un control TEdit

Publicado: Dom Feb 13, 2011 11:26 am
por jlalin
Juan Jose,
supongo que el error de pintado que tienes es por que se están perdiendo
recursos. Tienes que eliminar el hDC después de utilizarlo, así­ que después
de DeleteObject( ... ) añade ReleaseDC( hWnd );
Saludos,
José Lalí­n

Pintar dentro o en borde de un control TEdit

Publicado: Dom Feb 13, 2011 4:45 pm
por Juan Jose
Perdon no me di cuenta que publicaba en englis
Carlos, si no consigo que se vea correcto tendre que hacer algo asi
Jose, he probado a añadir el ReleaseDC pero no a resultado cuando cabio de
pestaña en un folder con un browse
sige saliedo ese efecto.
Gracias por su tiempo
Saludos
"Juan Jose Lopez Garcia" <correo@jjlopezg.jazztel.es> escribió en el mensaje
news:4d5732e0$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Hola a todos
>
> Intento hacer una marca en los edit obligatorios con parte de la rutina de
> Jose Ramon publicada aqui
> pero me sale un efecto raro al cambiar de ventana,pestaña,ect...
> Estaria bien consegir un efecto de triangulo en una esquina, pero me
> conformo con las lineas del borde
>
> alguien me puede ayudar
>
>
> #pragma BEGINDUMP
>
> #include "windows.h"
> #include "xailer.h"
> #include "colors.ch"
> #include <commctrl.h>
>
> HB_FUNC_STATIC( TEDIT_WMNCPAINT )
> {
> PHB_ITEM Self = hb_stackSelfItem();
> HWND hWnd = GetHandleOf( Self );
>
> if( XA_ObjGetL( Self, "lObligado" ) )
> {
> HDC hdc = GetWindowDC( hWnd );
> RECT rect;
> HPEN hbr = CreatePen( PS_SOLID, 1, clRed );
> HPEN hOldPen = SelectObject( hdc, (HPEN) hbr );
>
> GetWindowRect( hWnd, &rect );
> rect.right -= rect.left; // Ancho
> rect.bottom -= rect.top; // Alto
> rect.left = 0;
> rect.top = 0;
> // arriba // izquierda
> MoveToEx( hdc, 0, rect.bottom -= rect.top+1, NULL );
> // horizontal // vertical
> LineTo( hdc, rect.right -= rect.left+1, rect.bottom -=
> rect.top );
> LineTo( hdc, rect.right -= rect.left, rect.top);
> //MoveToEx( hdc, 0, 0 , NULL );
>
>
> SelectObject( hdc, (HPEN) hOldPen );
> DeleteObject( hbr );
> }
> else
> PrevWindowProc( hWnd, WM_NCPAINT, hb_parnl( 1 ), 0 );
>
> hb_retnl( 0 );
> }
>
>
>
>
------------------------------------------------------------ --------------------
>
>
> __________ Información de ESET NOD32 Antivirus, versión de la base de
> firmas de virus 5869 (20110213) __________
>
> ESET NOD32 Antivirus ha comprobado este mensaje.
>
> http://www.eset.com
>
>
>
__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 5869 (20110213) __________
ESET NOD32 Antivirus ha comprobado este mensaje.
http://www.eset.com

Pintar dentro o en borde de un control TEdit

Publicado: Dom Feb 13, 2011 7:34 pm
por ignacio
Juan Jose escribió el dom, 13 febrero 2011 02:24Hola a todos
Intento hacer una marca en los edit obligatorios con parte de la rutina de ...

1) No hace falta destruir el DC por estar dentro de un evento OnPaint
2) Cuando quieras pintar algo, deberás primero llamar PrevWindowProc y luego tu pintar encima.
Si te fijas lo estás haciendo mal. Llamas a PrevWindowProc cuando no pintas nada, cuando realmente no hace falta, sólo has de retornar NIl. Sin embargo cuando quieres pintar tu algo, deberás esperar a que el control se pinte con PrevWindowProc y luego pintar lo que quieras encima.
Espero que así­ te funcione.
Un saludo

Pintar dentro o en borde de un control TEdit

Publicado: Lun Feb 14, 2011 1:43 am
por Juan Jose
Gracias Ignacio por la ayuda, con este codigo pinta bien
tengo que poner el PrevWindowProc con el else del if sino no pinta los
border de los otros controles, pero..
con siempre falta algo ya que al entrar a la pestaña del folder solo los
pinta cuando pasa el raton por encima
o han recibido el foco
Gracias a todos por las respuestas
HB_FUNC_STATIC( TEDIT_WMNCPAINT )
{
PHB_ITEM Self = hb_stackSelfItem();
HWND hWnd = GetHandleOf( Self );
if( XA_ObjGetL( Self, "lObligado" ) )
{
HDC hdc = GetWindowDC( hWnd );
RECT rect;
HPEN hbr = CreatePen( PS_SOLID, 1, clRed );
HPEN hOldPen = SelectObject( hdc, (HPEN) hbr );
PrevWindowProc( hWnd, WM_NCPAINT, hb_parnl( 1 ), 0 );
GetWindowRect( hWnd, &rect );
rect.right -= rect.left; // Ancho
rect.bottom -= rect.top; // Alto
rect.left = 0;
rect.top = 0;
MoveToEx( hdc, 0, rect.bottom -= rect.top+1, NULL );
LineTo( hdc, rect.right -= rect.left+1, rect.bottom -=
rect.top );
LineTo( hdc, rect.right -= rect.left, rect.top);
SelectObject( hdc, (HPEN) hOldPen );
DeleteObject( hbr );
ReleaseDC(hWnd,hdc);
}
else
PrevWindowProc( hWnd, WM_NCPAINT, hb_parnl( 1 ), 0 );
hb_retnl( 0 );
}
"Juan Jose Lopez Garcia" <correo@jjlopezg.jazztel.es> escribió en el mensaje
news:4d5732e0$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Hola a todos
>
> Intento hacer una marca en los edit obligatorios con parte de la rutina de
> Jose Ramon publicada aqui
> pero me sale un efecto raro al cambiar de ventana,pestaña,ect...
> Estaria bien consegir un efecto de triangulo en una esquina, pero me
> conformo con las lineas del borde
>
> alguien me puede ayudar
>
>
> #pragma BEGINDUMP
>
> #include "windows.h"
> #include "xailer.h"
> #include "colors.ch"
> #include <commctrl.h>
>
> HB_FUNC_STATIC( TEDIT_WMNCPAINT )
> {
> PHB_ITEM Self = hb_stackSelfItem();
> HWND hWnd = GetHandleOf( Self );
>
> if( XA_ObjGetL( Self, "lObligado" ) )
> {
> HDC hdc = GetWindowDC( hWnd );
> RECT rect;
> HPEN hbr = CreatePen( PS_SOLID, 1, clRed );
> HPEN hOldPen = SelectObject( hdc, (HPEN) hbr );
>
> GetWindowRect( hWnd, &rect );
> rect.right -= rect.left; // Ancho
> rect.bottom -= rect.top; // Alto
> rect.left = 0;
> rect.top = 0;
> // arriba // izquierda
> MoveToEx( hdc, 0, rect.bottom -= rect.top+1, NULL );
> // horizontal // vertical
> LineTo( hdc, rect.right -= rect.left+1, rect.bottom -=
> rect.top );
> LineTo( hdc, rect.right -= rect.left, rect.top);
> //MoveToEx( hdc, 0, 0 , NULL );
>
>
> SelectObject( hdc, (HPEN) hOldPen );
> DeleteObject( hbr );
> }
> else
> PrevWindowProc( hWnd, WM_NCPAINT, hb_parnl( 1 ), 0 );
>
> hb_retnl( 0 );
> }
>
>
>
>
------------------------------------------------------------ --------------------
>
>
> __________ Información de ESET NOD32 Antivirus, versión de la base de
> firmas de virus 5869 (20110213) __________
>
> ESET NOD32 Antivirus ha comprobado este mensaje.
>
> http://www.eset.com
>
>
>
__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 5871 (20110213) __________
ESET NOD32 Antivirus ha comprobado este mensaje.
http://www.eset.com