Page 1 of 1
ExtCreatePen
Posted:
Sun Sep 05, 2021 10:18 am
by antolin
Muy buenas a todos. Hace año que no entro en este esplendido foro, pues tenía el FWH un poco olvidado. Tengo una preguntita.
¿Alguien a utilizado alguna vez la función EXTCREATPEN()?. ¿Sabria como implementarla?.
Resulta que cuando dibujo líneas o rectángulos, las esquinas se me dibujan redondeadas, porque utilizo un FWH antiguo y creo que la única forma que tengo de solucionarlo y obtener esquinas cuadradas es con EXTCREATEPEN para aplicar PS_ENDCAP_SQUARE.
Además, por lo que he estudiado, se podrían crear pens con degradados o dibujitos. Muy interesante.
Estoy intentando implemantarlo en C++, pero tengo problemas con la estructura LOGBRUSH.
Muchas gracias
Re: ExtCreatePen
Posted:
Mon Sep 06, 2021 5:04 am
by Antonio Linares
Antolin,
> Estoy intentando implemantarlo en C++, pero tengo problemas con la estructura LOGBRUSH
Copia aqui lo que tengas hecho en C/C++ y te ayudamos a completarlo
Re: ExtCreatePen
Posted:
Mon Sep 06, 2021 12:04 pm
by karinha
Re: ExtCreatePen
Posted:
Mon Sep 06, 2021 12:20 pm
by antolin
Gracias Karinha. Ese es el ejemplo que estaba utilizando. Y funciona:
- Code: Select all Expand view
HB_FUNC( EXTCREATPEN ) // ExtCreatPen( nStyle, nWidth, nRGBColor, nBStyle, nHStyle ) --> hPen
{
LOGBRUSH lgBrush ;
lgBrush.lbStyle = ( UINT ) IF( ISNIL( 4 ) || !_parni( 4 ) , BS_SOLID, _parni( 4 ) ) ;
lgBrush.lbColor = ( COLORREF ) _parnl( 3 ) ;
lgBrush.lbHatch = ( ULONG_PTR ) _parni( 5 ) ;
_retnl( ( LONG ) ExtCreatePen( ( DWORD ) ( PS_GEOMETRIC | _parni(1) ), ( DWORD ) _parni(2), &lgBrush, 0, NULL) );
}
Las esquinas ya me salen cuadradas. El problema que lo tengo diempre con el estilo PS_GEOMETRIC porque no entiendo muy bien lo del estructura LOGBRUSH y en PS_COSMETIC no me coge ni el color ni el ancho de linea.
Re: ExtCreatePen
Posted:
Mon Sep 06, 2021 12:21 pm
by antolin
Re: ExtCreatePen
Posted:
Mon Sep 06, 2021 12:41 pm
by karinha
antolin wrote:
Esto és simplesmente espetacular!!
Regards, saludos.
Re: ExtCreatePen
Posted:
Mon Sep 06, 2021 1:47 pm
by antolin
Gracias.
Tengo un FWH muy antiguo y he tenido que implementar muchas clases propias y funciones gráficas para blending y transparencias
Re: ExtCreatePen
Posted:
Mon Sep 06, 2021 3:54 pm
by Antonio Linares
antolin wrote:Gracias Karinha. Ese es el ejemplo que estaba utilizando. Y funciona:
- Code: Select all Expand view
HB_FUNC( EXTCREATPEN ) // ExtCreatPen( nStyle, nWidth, nRGBColor, nBStyle, nHStyle ) --> hPen
{
LOGBRUSH lgBrush ;
lgBrush.lbStyle = ( UINT ) IF( ISNIL( 4 ) || !_parni( 4 ) , BS_SOLID, _parni( 4 ) ) ;
lgBrush.lbColor = ( COLORREF ) _parnl( 3 ) ;
lgBrush.lbHatch = ( ULONG_PTR ) _parni( 5 ) ;
_retnl( ( LONG ) ExtCreatePen( ( DWORD ) ( PS_GEOMETRIC | _parni(1) ), ( DWORD ) _parni(2), &lgBrush, 0, NULL) );
}
Las esquinas ya me salen cuadradas. El problema que lo tengo diempre con el estilo PS_GEOMETRIC porque no entiendo muy bien lo del estructura LOGBRUSH y en PS_COSMETIC no me coge ni el color ni el ancho de linea.
asumo que usas 32 bits. Para 64 hay que cambiar unas cosas.
Estas usando correctamente el puntero a la estructura LOGBRUSH. Que valor te devuelve la función ?
De haber un error siempre puedes llamar a la función GetErrMsg() que te devuelve la descripción del valor GetLastError() del API de Windows
Re: ExtCreatePen
Posted:
Tue Sep 07, 2021 5:27 pm
by antolin
Hola.
La función así funciona, pero si pongo PS_COSMETIC me devuelve siempre un pen de color negro y ancho 1. No consigo el color y ancho requerido con PS_COSMETIC que por lo visto es más rápido que PS_GEOMETRIC. Pero no te preocupes, para PENS de menos de 3 de ancho utilizaré el PEN de siempre.
Re: ExtCreatePen
Posted:
Wed Sep 08, 2021 5:06 am
by Antonio Linares
A pointer to a LOGBRUSH structure. If dwPenStyle is PS_COSMETIC, the lbColor member specifies the color of the pen and the lpStyle member must be set to BS_SOLID. If dwPenStyle is PS_GEOMETRIC, all members must be used to specify the brush attributes of the pen.
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-extcreatepen
Re: ExtCreatePen
Posted:
Thu Sep 09, 2021 10:36 pm
by antolin
Gracias Antonio. Por lo visto PS_COSMETIC sólo pinta líneas solidas de un pixel de ancho. El color habrá que establecerlo con SetDCPenColor() o algo así porque con ExtCreatePen sólo se pinta en negro (al menos a mi). Pero no es problema que para eso utilizo el CreatePen() de toda la vida.
Muchas gracias.