Menu PopUp automatico al presionar sobre boton Tbar

Post Reply
RSalazarU
Posts: 177
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia
Contact:

Menu PopUp automatico al presionar sobre boton Tbar

Post by RSalazarU »

Hola amigos del foro:

Estoy intentando hacer los siguiente:

"al hacer click sobre un botón de la barra de herramienta, que aparezca el menú PopUp automáticamente y si no se selecciona una opción del menú, que se ejecute la acción del botón"

Para esto modifique la clase TBtnBmp:

Code: Select all

METHOD LButtonDown( nRow, nCol ) CLASS TBtnBmp
   local oWnd

   if ::lDrag .or. ! Empty( ::oDragCursor )
      return Super:LButtonDown( nRow, nCol )
   endif

   ::lWorking = .T.
   ::lBtnUp   = .F.

   SetFocus( ::hWnd )    // To let the main window child control
   SysRefresh()          // process its valid

   //Aca el cambio...
   //copiado de ::LButtonUp() (codigo que muestra PopUp)
   if ::oPopup != nil
      if ::oWnd:oWnd != nil .and. Upper( ::oWnd:oWnd:Classname() ) == "TBAR"
         oWnd := ::oWnd:oWnd
      else
         oWnd := ::oWnd
      endif
      //oWnd:NcMouseMove() // close the tooltip
      oWnd:oPopup = If( ValType( ::oPopup ) == 'B', Eval( ::oPopUp, Self ), ::oPopUp )

      oWnd:oPopup:Activate( ::nTop + ::nHeight(), Max( ::nLeft, 1 ), oWnd, .F. )
      if ValType( ::oPopUp ) == 'B'
         oWnd:oPopUp:End()
      endif
      oWnd:oPopup = nil
      ::Refresh()
   endif
   //...hasta aca

   if GetFocus() == ::hWnd
      ::lCaptured = .T.
      ::lPressed  = .T.
      ::Capture()
      ::Refresh() // .F.
   endif

   ::lWorking = .F.

   if ::lBtnUp
      ::LButtonUp( nRow, nCol )
      ::lBtnUp = .F.
   endif

return 0
 
Este cambio casi logra el efecto deseado, solo falta la parte de:

".... si no se selecciona una opción del menú, que se ejecute la acción del botón"

Alguien habrá realizado algo similar.

De antemano, cualquier ayuda sera bienvenida.

Rolando
Cochabamba, Bolivia.
FWH 13.02, xharbour 121 Rev 6717
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Menu PopUp automatico al presionar sobre boton Tbar

Post by cnavarro »

Rolando, no entiendo bien lo que necesitas, pero para que aparezca un menu popup en un boton ...

Code: Select all


   DEFINE BUTTON ::oBtnSave OF ::oBar RESOURCE "save" ;
      PROMPT "Save" ;
      ACTION ( ::SaveFile( , , , ), ::oActivo:SetFocus() ) ;   //AQUI
      MENU ::MenuSaveAs() ;                                             //AQUI
      TOOLTIP FWString( "Save" )


 
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
RSalazarU
Posts: 177
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia
Contact:

Re: Menu PopUp automatico al presionar sobre boton Tbar

Post by RSalazarU »

Cristobal, gracias por responder.

lo que quiero hacer es los siguiente:

"al hacer click sobre un botón de la barra de herramienta, que aparezca el menú PopUp automáticamente y si no se selecciona una opción del menú, que se ejecute la acción del botón"

Colocar/asignar un menu PopUp a un boton de la barra es sencillo, pero para "mi gusto" no es muy practico.
No es practico porque el usuario tiene que presionar sobre la "flechita" negra que aparece a la derecha del botón; el área de la "flechita" es muy pequeña y a veces el usuario ni se percata que existe.

Seria mas practico que al hacer click sobre el boton aparezca el menu PopUp (automaticamente) y si el usuario NO selecciona, ninguna opcion del menu PopUp entonces "deberia" ejecutarse la accion del boton (por haber hecho click sobre el boton)

Para lograr esto modifique el metodo LButtonDown(..) de la clase TBtnBmp()

Code: Select all

METHOD LButtonDown( nRow, nCol ) CLASS TBtnBmp
   local oWnd

   if ::lDrag .or. ! Empty( ::oDragCursor )
      return Super:LButtonDown( nRow, nCol )
   endif

   ::lWorking = .T.
   ::lBtnUp   = .F.

   SetFocus( ::hWnd )    // To let the main window child control
   SysRefresh()          // process its valid

   //Aca el cambio...
   //copiado de ::LButtonUp() (codigo que muestra PopUp)
   if ::oPopup != nil
      if ::oWnd:oWnd != nil .and. Upper( ::oWnd:oWnd:Classname() ) == "TBAR"
         oWnd := ::oWnd:oWnd
      else
         oWnd := ::oWnd
      endif
      //oWnd:NcMouseMove() // close the tooltip
      oWnd:oPopup = If( ValType( ::oPopup ) == 'B', Eval( ::oPopUp, Self ), ::oPopUp )

      oWnd:oPopup:Activate( ::nTop + ::nHeight(), Max( ::nLeft, 1 ), oWnd, .F. )
      if ValType( ::oPopUp ) == 'B'
         oWnd:oPopUp:End()
      endif
      oWnd:oPopup = nil
      ::Refresh()
   endif
   //...hasta aca

   if GetFocus() == ::hWnd
      ::lCaptured = .T.
      ::lPressed  = .T.
      ::Capture()
      ::Refresh() // .F.
   endif

   ::lWorking = .F.

   if ::lBtnUp
      ::LButtonUp( nRow, nCol )
      ::lBtnUp = .F.
   endif

return 0
 
Espero haberme hecho entender.
User avatar
Giovany Vecchi
Posts: 129
Joined: Mon Jun 05, 2006 9:39 pm
Location: Brasil

Re: Menu PopUp automatico al presionar sobre boton Tbar

Post by Giovany Vecchi »

Talvez seja isto
Invoque o method ShowPopUp()

Code: Select all

  DEFINE BUTTON ::oBtnImpressoes of ::oBar          ;
    RESOURCE "B32_PRINTER"  noborder             ;
    TOOLTIP {"Impressões validas do atual Título Posicionado","Impressões - F9"}    ;
        ACTION (  ::oBtnImpressoes:ShowPopUp(),;
                  ::oBrwProtesto:SetFocus()) ;
        MENU ::oMenuPrns          
 
RSalazarU
Posts: 177
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia
Contact:

Re: Menu PopUp automatico al presionar sobre boton Tbar

Post by RSalazarU »

Giovany, gracias por contestar.

Tu código muestra el PopUp, pero no logra cumplir la ultima parte del enunciado:

".... si no se selecciona una opción del menú, que se ejecute la acción del botón"
rubenfernandez01
Posts: 23
Joined: Sun Sep 20, 2015 1:41 am

Re: Menu PopUp automatico al presionar sobre boton Tbar

Post by rubenfernandez01 »

Hola Rsalazar.
Al dar click en el botón que muestra el menú popup, deberías colocar un timer de x segundos y si nadie seleccionó una opción popup largas una acción.

Saludos
Ruben Dario Fernandez

Gracias y saludos cordiales.
Rubén Dario Fernández
Fwh 16.08 - Bcc 7.2 - Synwrite
rubenfernandez01
Posts: 23
Joined: Sun Sep 20, 2015 1:41 am

Re: Menu PopUp automatico al presionar sobre boton Tbar

Post by rubenfernandez01 »

RSalazar, lo mejor sería una ribbonbar. El botín muestra una flechita, si quiere el menú, acciona la flechita, sino es click en el botón y listo.
Saludos

Gracias y saludos cordiales.
Rubén Dario Fernández
Fwh 16.08 - Bcc 7.2 - Synwrite
RSalazarU
Posts: 177
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia
Contact:

Re: Menu PopUp automatico al presionar sobre boton Tbar

Post by RSalazarU »

Ruben, gracias por responder.

El problema en la solución del timer es poder indicar el tiempo, cuanto tiempo.

la Ribbonbar es una mejor solución, el "botin" indica que hay mas opciones, sin embargo no tiene el efecto que busco.

De todas maneras, gracias.
Post Reply