ExtCreatePen

ExtCreatePen

Postby antolin » Sun Sep 05, 2021 10:18 am

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
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: ExtCreatePen

Postby Antonio Linares » Mon Sep 06, 2021 5:04 am

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 :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: ExtCreatePen

Postby karinha » Mon Sep 06, 2021 12:04 pm

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: ExtCreatePen

Postby antolin » Mon Sep 06, 2021 12:20 pm

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.
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: ExtCreatePen

Postby antolin » Mon Sep 06, 2021 12:21 pm

Image
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: ExtCreatePen

Postby karinha » Mon Sep 06, 2021 12:41 pm

antolin wrote:Image


Esto és simplesmente espetacular!!

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: ExtCreatePen

Postby antolin » Mon Sep 06, 2021 1:47 pm

Gracias.

Tengo un FWH muy antiguo y he tenido que implementar muchas clases propias y funciones gráficas para blending y transparencias
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: ExtCreatePen

Postby Antonio Linares » Mon Sep 06, 2021 3:54 pm

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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: ExtCreatePen

Postby antolin » Tue Sep 07, 2021 5:27 pm

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.
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: ExtCreatePen

Postby Antonio Linares » Wed Sep 08, 2021 5:06 am

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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: ExtCreatePen

Postby antolin » Thu Sep 09, 2021 10:36 pm

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.
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 105 guests