Problema con DIALOG TRANSPARENT y SAY

Problema con DIALOG TRANSPARENT y SAY

Postby Cgallegoa » Thu Aug 14, 2008 10:53 pm

Hola amigos:

//*******************************
PRG.:

Function Inicio()
LOCAL oDlg, oFont1
DEFINE FONT oFont1 NAME GetSysFont() SIZE 0,-14 BOLD
DEFINE DIALOG oDlg RESOURCE "DIALOG_2" TITLE " Información IP" TRANSPARENT
REDEFINE SAY PROMPT "INGRESE IP" ID 101 OF oDlg FONT oFont1
REDEFINE BUTTON PROMPT "&Ok" ID 201 OF oDlg ACTION (oDlg:End())
oDlg:lHelpIcon:=.F.
ACTIVATE DIALOG oDlg CENTERED
Return(NIL)
//*******************************

RC.:
DIALOG_2 DIALOG 11, 21, 391, 119
STYLE DS_MODALFRAME | 0x4L | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "DIALOG_2"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "OK", 201, 12, 96, 50, 14
LTEXT "Al ingresar el Serial de su Producto Usted habilitará su jodita.", 101, 15, 23, 215, 10
}
//*******************************


El código y RC anteriores, super sencillo, muestra un SAY con el Prompt
"INGRESE IP".

Si a DEFINE DIALOG le adiciono la cláusula TRANSPARENT corta el prompt
del say a "INGRESE". Si le quito el TRANSPARENT pinta el prompt completo.

En dónde está el bug ?

Sin DIALOG TRASPARENT:

Image

Con DIALOG TRASPARENT:

Image
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby Antonio Linares » Fri Aug 15, 2008 12:12 am

Carlos,

Como solución temporal puedes hacerlo asi:
Code: Select all  Expand view  RUN
#include "FiveWin.ch"

Function Inicio()
LOCAL oDlg, oFont1, oSay
DEFINE FONT oFont1 NAME GetSysFont() SIZE 0,-14 BOLD
DEFINE DIALOG oDlg RESOURCE "DIALOG_2" TITLE " Información IP" TRANSPARENT
REDEFINE SAY oSay PROMPT "INGRESE IP" ID 101 OF oDlg FONT oFont1
REDEFINE BUTTON PROMPT "&Ok" ID 201 OF oDlg ACTION (oDlg:End())
oDlg:lHelpIcon:=.F.
ACTIVATE DIALOG oDlg CENTERED ON INIT oSay:SetSize( 120, 20 )
Return(NIL)

El bug proviene de que internamente estamos usando el estilo DT_WORDBREAK y al no tener espacio suficiente, parte la frase en dos líneas
regards, saludos

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

Postby Cgallegoa » Fri Aug 15, 2008 1:45 am

Antonio gracias por tu respuesta.

Me saltan algunas preguntas:

1. El estilo DT_WORDBREAK sólo se activa cuando se asigna la cláusula TRANSPARENT al DIALOG ?

2. Se puede desactivar ese estilo, y si se puede, dónde y cómo lo hago ?

Saludos,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby Antonio Linares » Fri Aug 15, 2008 8:16 am

Carlos,

Anoche era ya tarde y no me dió tiempo a hacer más pruebas :-)

Lo primero sería comprobar que estilo realmente tiene el control al ser definido como LTEXT usando GetWindowLong()

Al usar el estilo TRANSPARENT en el diálogo, desde la función FixSays() de FWH lo que hacemos es cambiarle el procedimiento de ventana a los SAYs, para que usen uno distinto en donde se dibujan los SAYs de forma transparente.

Hacemos una serie de comprobaciones de estilo y puede ser que con LTEXT algo no se esté haciendo bien. FixSays() usa el DT_WORDBREAK
regards, saludos

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

Postby Cgallegoa » Fri Aug 15, 2008 5:45 pm

Maestro, yo pensé que nunca descansabas :wink:

Hice lo siguiente:

ACTIVATE DIALOG oDlg CENTERED ;
ON INIT ( MsgInfo(GetWindowLong(oSay:hWnd,GWL_STYLE)) )

y me devuelve 1342308352. Qué significa ?

Si FixSays() usa DT_WORDBREAK, al reemplazarla por

Function FixSays()
Return nil

no debería reconocer ese estilo. Sin embargo, sigue cortando el prompt.

La neta, no entiendo nada.

Quedo a la espera de tu guía.

Saludos,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby Antonio Linares » Fri Aug 15, 2008 6:18 pm

Carlos,

Este es parte del código de FixSays() para que veas como usa los estilos:
Code: Select all  Expand view  RUN
      if( ( GetWindowLong( hWnd, GWL_STYLE ) & SS_BLACKFRAME ) ==   SS_BLACKFRAME )
      {
         RECT rct;
         
         GetClientRect( hWnd, &rct );      
         WindowBoxBlack( hDC, &rct );
      }         
     
      else if( GetWindowLong( hWnd, GWL_STYLE ) & SS_CENTER   )
         DrawText( hDC, text, lstrlen( text ), &rct, DT_CENTER | DT_WORDBREAK );
         
      else if( GetWindowLong( hWnd, GWL_STYLE ) & SS_RIGHT   )   
         DrawText( hDC, text, lstrlen( text ), &rct, DT_RIGHT | DT_WORDBREAK );
         
      else   
         DrawText( hDC, text, lstrlen( text ), &rct, DT_LEFT | DT_WORDBREAK );

Si quieres reemplazar FixSays(), cambiale su nombre en dialog.prg y llama por ejemplo a MiFixSays(), ó el enlazador seguirá usando la de FWH
regards, saludos

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

Postby Patricio Avalos Aguirre » Mon Aug 18, 2008 2:19 pm

Maestro

Lo otro que he podido ver en los SAY cuando son transparente
que no respeta la alineación (CENTER, RIGHT)
lo deja siempre LEFT

habiendo cambiado en el recurso Estilo ( CENTER O RIGHT )
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
User avatar
Patricio Avalos Aguirre
 
Posts: 1060
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile

Postby Antonio Linares » Mon Aug 18, 2008 5:54 pm

Patricio,

En el código que hemos publicado puedes ver como se tienen en cuenta la alineación en los estilos. Con que versión de FWH has probado ?
regards, saludos

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 39 guests