FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Punteado no dibujado al tomar foco
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Punteado no dibujado al tomar foco
Posted: Fri Oct 14, 2011 07:44 PM
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 (fw): Select all Collapse
METHOD GetDlgCode( nLastKey ) CLASS TGet

聽 聽if Len( ::oWnd:aControls ) == 1
聽 聽 聽 return DLGC_WANTALLKEYS
聽 聽endif

聽 聽::oWnd:nLastKey = nLastKey

return nil // DLGC_WANTALLKEYS
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Punteado no dibujado al tomar foco
Posted: Fri Oct 14, 2011 09:26 PM
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 (fw): Select all Collapse
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
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: Punteado no dibujado al tomar foco
Posted: Fri Oct 14, 2011 10:11 PM

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

____________________

Paco
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Punteado no dibujado al tomar foco
Posted: Sat Oct 15, 2011 07:37 AM

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

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Punteado no dibujado al tomar foco
Posted: Sat Oct 15, 2011 09:25 AM
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#p120948

y el m茅todo GoNextCtrl() de la Clase TWindow queda as铆:
Code (fw): Select all Collapse
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:
Code (fw): Select all Collapse
METHOD GetDlgCode() VIRTUAL
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Re: Punteado no dibujado al tomar foco
Posted: Mon Oct 17, 2011 04:04 PM
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 (fw): Select all Collapse
METHOD GetDlgCode( nLastKey ) CLASS TGet
..
return NIL //DLGC_WANTALLKEYS


http://www.megaupload.com/?d=B4O8JJ7I
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

Continue the discussion