Page 1 of 1

ExtCreatePen

PostPosted: 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

PostPosted: 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

PostPosted: Mon Sep 06, 2021 12:04 pm
by karinha

Re: ExtCreatePen

PostPosted: 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

PostPosted: Mon Sep 06, 2021 12:21 pm
by antolin
Image

Re: ExtCreatePen

PostPosted: Mon Sep 06, 2021 12:41 pm
by karinha
antolin wrote:Image


Esto és simplesmente espetacular!!

Regards, saludos.

Re: ExtCreatePen

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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.