Page 1 of 1
Punteado no dibujado al tomar foco
Posted: Fri Oct 14, 2011 7:44 pm
by Antonio Linares
Este es un bug buscado por mucho tiempo que finalmente ha sido localizado y arreglado

Si hay un GET justo antes de un ComboBox, podeis observar que al presionar TAB el combobox no muestra su foco punteado la primera vez, aunque si lo muestra bien las siguientes veces. También ocurría con un GET antes de un Button.
Este comportamiento erróneo se debe a que el GET devuelve DLGC_WANTALLKEYS como respuesta al mensaje de Windows WM_GETDLGCODE. Algo que está permitido por Windows pero sin embargo causa ese efecto no deseado. Simplemente con modificar el Método GetDlgCode() de esta forma el punteado se mostrará bien:
Code: Select all | Expand
METHOD GetDlgCode( nLastKey ) CLASS TGet
if Len( ::oWnd:aControls ) == 1
return DLGC_WANTALLKEYS
endif
::oWnd:nLastKey = nLastKey
return nil // DLGC_WANTALLKEYS
Re: Punteado no dibujado al tomar foco
Posted: Fri Oct 14, 2011 9:26 pm
by carlos vargas
Mil gracias Antonio, finalmente cayo ese bug.

solo falta dilucidar por que con xhb.com y fwh en algunas condiciones, ciertos recursos incluidos en el EXE no son accesibles por tbrush y tbitmap.
en este caso las funciones palbmpload y LoadBitmap fallan.
si los recursos estan incluidos en una dll las funciones no fallan.
( he trabajado los recursos ya con rc.exe, brc.exe y xrc.exe asi que los tiros no van por ahi )
( he validado que los recursos que fallan existan en el exe)
con xharbour y harbour para borland no falla.
le he metido tiempo a encontrar las condiciones para que el fallo se manifieste, pero nada.

Code: Select all | Expand
en brush falla:
case cBmpRes != nil
::hBitmap = LoadBitmap( GetResources(), cBmpRes ) /*aca ::hbitmap=0*/
en bitmap falla:
if ! Empty( cResName )
aBmpPal = PalBmpLoad( cResName )
::hBitmap = aBmpPal[ 1 ] /*aca ::hbitmap=0*/
::hPalette = aBmpPal[ 2 ]
salu2
carlos vargas
Re: Punteado no dibujado al tomar foco
Posted: Fri Oct 14, 2011 10:11 pm
by Francisco Horta
Antonio,
efectivamente se corrige el problema cuando usamos TAB, estoy probando con "ENTER" y no puntea los controles en la primera pasada, hasta la segunda los muestra
saludos
paco
Re: Punteado no dibujado al tomar foco
Posted: Sat Oct 15, 2011 7:37 am
by Antonio Linares
Paco,
El problema con Enter es que no es un comportamiento estandard de Windows. Es algo que se ha implementado para simular la funcionalidad de las aplicaciones en MsDos pero Windows no lo soporta de forma estandard y por eso vuelve a aparecer ese efecto.
Estamos viendo la forma de simular la pulsación de Tab al pulsar Enter, pues parece que la solución es dejar a Windows que haga su trabajo estandard

Re: Punteado no dibujado al tomar foco
Posted: Sat Oct 15, 2011 9:25 am
by Antonio Linares
Paco,
Solucionado el problema al usar Enter

Hemos implementado una nueva función SendKey() basada en la función SendInput() del API de Windows:
viewtopic.php?f=6&t=22664&p=120948#p120948y el método GoNextCtrl() de la Clase TWindow queda así:
Code: Select all | Expand
METHOD GoNextCtrl( hCtrl ) CLASS TWindow
local hCtlNext, nAt
if Upper( ::ClassName() ) != "TDIALOG"
nAt = AScan( ::aControls, { | o | o:hWnd == hCtrl } )
if nAt != 0
if nAt < Len( ::aControls )
hCtlNext = ::aControls[ nAt + 1 ]:hWnd
else
hCtlNext = ::aControls[ 1 ]:hWnd
endif
if lAnd( GetWindowLong( hCtlNext, GWL_STYLE ), WS_TABSTOP )
SetFocus( hCtlNext )
endif
return nil
endif
endif
if ! Empty( ::aControls ) .and. hCtrl == ::LastActiveCtrl():hWnd
if ! Empty( ::oWnd ) .and. ;
( ( Upper( ::oWnd:ClassName() ) $ "TFOLDER;TPAGES;TFOLDEREX" ) )
hCtlNext = NextDlgTab( ::oWnd:oWnd:hWnd, ::oWnd:hWnd )
::hCtlFocus = hCtrl
SetFocus( hCtlNext )
endif
else
SendKey( VK_TAB )
endif
return nil
Tambien hemos implementado el Método GetDlgCode() en la Clase TComboBox como VIRTUAL:
Re: Punteado no dibujado al tomar foco
Posted: Mon Oct 17, 2011 4:04 pm
by Patricio Avalos Aguirre
Antonio.
Envio un ejemplo en folderX,
el archivo do.bat compila el fuente
ademas en la carpeta dbf\ hay 2 archivos
wcta1.exe que es sin modificaciones
wcta2.exe que esta con modificaciones solamente en tGET en el metodo
Code: Select all | Expand
METHOD GetDlgCode( nLastKey ) CLASS TGet
..
return NIL //DLGC_WANTALLKEYS
http://www.megaupload.com/?d=B4O8JJ7I