Page 1 of 1

Alternando Menubar y TRibbonbar

Posted: Wed Mar 30, 2016 8:18 pm
by compubrion
Saludos !
Haciendo pruebas en una ventana MDI usando un Menubar y una Toolbar / alternando con una Ribbonbar al ir y venir de un estilo a otro se quedan congelados los botones prodrian indicarmen qcual seria la forma correcta de hacer esta operacion, adjunto el codigo que estoy utilizadno para hacer esta prueba.

Code: Select all

#include "fivewin.ch"
#include "ribbon.ch"
*--
REQUEST HB_LANG_ES
REQUEST HB_LANG_ESWIN
REQUEST HB_CODEPAGE_ES850C
*--
#define COLOR_WINDOW     5
#define COLOR_WINDOWTEXT 8
*--
#define TRUE  .T.
#define FALSE .F.
*--
PROCEDURE Main()
*--

   LOCAL oApp
   LOCAL bOldError
   *--
   oApp := TAplication():New()
   *--
   BEGIN SEQUENCE
      bOldError = ErrorBlock( { | o | DoBreak( o ) } )
      oApp:Activate()
   END SEQUENCE
   
   ErrorBlock( bOldError )

RETURN
*--
*
*--
CLASS TAplication
*--

    DATA oWndMain
    DATA oRibBonb
    DATA oMenuBar
    DATA oToolBar
    *--
    VAR oGroup1, oBoton1, oBoton2
    VAR oGroup2, oBoton3
    *--
    VAR oQck, oQbtn1, oQbtn2, oQbtn3, oQbtn4
    VAR nMenuwin AS NUMERIC INIT 2
    *--
    METHOD New() INLINE Self
    METHOD Activate()
    *--
    METHOD MenuRibBon()
    METHOD MenuClasic()
    METHOD ButtomBar()
    *--
    METHOD CambiaMenu()
    
    
ENDCLASS
*--
*
*--
METHOD Activate() CLASS TAplication
*--

    LOCAL oIcon
   ::oMenuBar := TMenu():New(NIL)
   *--
   DEFINE ICON oIcon FILE "\fwh\icons\fivetech.ico"
   *--
   DEFINE WINDOW ::oWndMain ;
      COLOR GETSYSCOLOR( COLOR_WINDOWTEXT ), GETSYSCOLOR( COLOR_WINDOW ); 
      TITLE "Alternando Menubar y Ribbon en MDI" ;
      MENU ::oMenuBar  ;
      ICON oIcon  ;
      MDI PIXEL
   *--
   ::MenuRibbon()
   *--
   DEFINE MESSAGE OF ::oWndMain  PROMPT "PRESIONE LA TECLA (F8) PARA CAMBIAR EL MENU" ;
      CENTER KEYBOARD DATE CLOCK 2007
   *--
   ::oWndMain:bKeyDown := {|nKey| IIF( nKey == VK_F8, ::CambiaMenu(),) }
   ACTIVATE WINDOW ::oWndMain MAXIMIZED VALID MsgYesNo( "Do you want to quit ?" )

RETURN( NIL )
*--
*
*--
METHOD MenuRibbon() CLASS TAplication
*--

   LOCAL nWidth   := ::oWndMain:nWidth
   LOCAL aPrompts := { "Archivos","Ayuda"}
   *--
   ::oRibBonb := TRibbonBar():New( ::oWndMain, aPrompts, {|| NIL }, 1, nWidth, 140, 55 )
   ::oRibBonb:nLeftMargin := 50
   ::oRibBonb:nGroupSeparation = 1
   *--
   ::oGroup1  := ::oRibBonb:AddGroup( 200, "Grupo 1", 1 )
   ::oboton1 := ::oGroup1:AddButton( 10,10, 50, 80, "Programación", {|| MsgInfo( FWDESCRIPTION,FWVERSION ) },,,"\fwh\bitmaps\32x32\app.bmp" )
   ::oGroup1:AddSeparator(100)
   ::oboton2 := ::oGroup1:AddButton( 10,110, 50, 80, "Usuarios", {|| MsgInfo( FWDESCRIPTION,FWVERSION ) },,,"\fwh\bitmaps\32x32\users.bmp" )
   *--
   ::oGroup2  := ::oRibBonb:AddGroup( 200, "Grupo 2", 2 )
   ::oboton3 := ::oGroup2:AddButton( 10,10, 50, 80, "Terminar", {|| ::oWndMain:End() },,,"\fwh\bitmaps\32x32\Exit.bmp" )   
   DEFINE QUICKBUTTON OF ::oRibBonb ;
          BITMAP "\Fwh\bitmaps\16x16\fivetech.bmp",;
                 "\Fwh\Bitmaps\btnqcka.bmp",;
                 "\Fwh\Bitmaps\btnqckb.bmp",;
                 "\Fwh\Bitmaps\btnqckc.bmp" ;
          ACTION MsgInfo( FWDESCRIPTION,FWVERSION )
   *--
   DEFINE QUICKACCESS ::oQck OF ::oRibBonb
   
   ADD BUTTON ::oQbtn1 QUICKACCESS ::oQck BITMAP "\Fwh\bitmaps\16x16\floppy.bmp"  ACTION MsgInfo("1")
       
   ADD BUTTON ::oQbtn2 QUICKACCESS ::oQck BITMAP "\Fwh\bitmaps\16x16\closeall.bmp"  ACTION MsgInfo("2")
       
   ADD BUTTON ::oQbtn3 QUICKACCESS ::oQck BITMAP "\Fwh\bitmaps\16x16\additem.bmp" ACTION MsgInfo("3")

   ADD BUTTON ::oQbtn3 QUICKACCESS ::oQck BITMAP "\Fwh\bitmaps\16x16\adddbf.bmp" ACTION MsgInfo("4")

RETURN( NIL )
*--
*
*--
METHOD MenuClasic() CLASS TAplication
*--

   LOCAL oMenu
   *--
   MENU oMenu 
      MenuItem "&Archivos"
        MENU
            MenuItem "&Finalizar" ACTION ::oWndMain:End()
        ENDMENU
      MenuItem "Ay&uda"
   ENDMENU

RETURN( oMenu )
*--
*
*--
METHOD ButtomBar() CLASS TAplication
*--

   ::oToolBar := TBar():New( ::oWndMain, 40, 40, .T. )
   *--
   DEFINE BUTTON OF ::oToolBar FILE "\fwh\bitmaps\32x32\exit.bmp";
         GROUP ACTION ( ::oWndMain:End() )  NOBORDER TOOLTIP " Salir "
         
RETURN( NIL )
*--
*
*--
METHOD CambiaMenu() CLASS TAplication
*--

   LOCAL nDialogo
   LOCAL aOpciones := {" Clasico "," Ribbon "}
   LOCAL nOption   := MsgList( aOpciones, "Tipo de Menu",,,08,20," &Aceptar ",::nMenuwin, TRUE, " &Cancelar " )
   *--
   If nOption > 0

      If nOption # ::nMenuwin
      
         ::oWndMain:Hide()

         If nOption == 1
            
            For nDialogo = 1 TO Len( ::oRibBonb:aDialogs )
               AEval( ::oRibBonb:aDialogs[ nDialogo ]:aControls,{ |nCtrl| nCtrl:Super:End() } )
            Next
            *--
            ::oRibBonb:End(); ::oMenuBar := ::MenuClasic()
            ::oWndMain:SetMenu( ::oMenuBar, 7 ); ::ButtomBar()
            AEval( ::oToolBar:aControls,{|oButton| oButton:Refresh  () } )          

         Else

            AEval( ::oToolBar:aControls,{|oButton| oButton:End() } )
            
            ::oMenuBar:End(); ::oMenuBar := TMenu():New( NIL )
            ::oToolBar:End(); ::oWndMain:oMenu := ::oMenuBar
            ::MenuRibbon()
            
         EndIf

         ::oWndMain:Refresh(); ::nMenuwin := nOption; ::oWndMain:Show()
         SysRefresh()

      Endif

   EndIf

RETURN( NIL )
*--
*
*--
STATIC PROCEDURE DoBreak( oError )
*--

   LOCAL nArgs
   LOCAL cInfo := oError:Operation
   *--
   If ValType( oError:Args ) == "A"

      cInfo += "   Args:" + CRLF

      For nArgs = 1 TO Len( oError:Args )

         MsgInfo( oError:Args[ nArgs ] )

         cInfo += "[" + Str( nArgs, 4 ) + "] = " + ValType( oError:Args[ nArgs ] ) + ;
                   "   " + cValToChar( oError:Args[ nArgs ] ) + CRLF
      Next

   EndIf

   MsgStop( oError:Description + CRLF + cInfo,;
            "Script error at line: " + AllTrim( Str( ProcLine( 2 ) ) ) )

   BREAK

RETURN
*--
*
*--
INIT PROCEDURE StartUp()
*--

   SET DATE BRITISH
   SET CENTURY ON
   SET DATE FORMAT TO "DD-MM-YYYY"
   *--
   set( _SET_CODEPAGE, "ESWIN" )
   *--
   HB_LangSelect("ES","ESWIN")
   hb_cdpSelect( "ESWIN" )
   HB_SetCodePage("ESWIN")

RETURN
*--
*

 

Re: Alternando Menubar y TRibbonbar

Posted: Thu Mar 31, 2016 8:32 am
by Antonio Linares
Prueba a ocultar la ribbon y a mostrarla luego nuevamente, en vez de destruirla

Re: Alternando Menubar y TRibbonbar

Posted: Thu Mar 31, 2016 8:38 am
by Antonio Linares
Se comporta igual si la ocultamos

Vamos a intentar solucionarlo

Re: Alternando Menubar y TRibbonbar

Posted: Thu Mar 31, 2016 9:06 am
by Antonio Linares
Lo que ocurre es que la ventana oWndMain:oWndClient solapa a la Ribbon

Hay que modificar la coordenada superior de oWndMain:oWndClient

A ver si encontramos una forma sencilla de hacerlo

Re: Alternando Menubar y TRibbonbar

Posted: Thu Mar 31, 2016 9:14 am
by Antonio Linares
Con _ ya funciona bien. Creo que es mejor no destruir la Ribbon sino ocultarla y mostrarla, pero
en _ debe funcionar bien

Muy bueno tu código. Me ha gustado mucho, enhorabuena :-)

Es espectacular que una aplicación ofrezca ambos tipos de opciones. Excelente!

Code: Select all

METHOD CambiaMenu() CLASS TAplication
*--

   LOCAL nDialogo
   LOCAL aOpciones := {" Clasico "," Ribbon "}
   LOCAL nOption   := MsgList( aOpciones, "Tipo de Menu",,,08,20," &Aceptar ",::nMenuwin, TRUE, " &Cancelar " )
   *--
   If nOption > 0

      If nOption # ::nMenuwin
      
         // ::oWndMain:Hide()

         If nOption == 1
            
            // For nDialogo = 1 TO Len( ::oRibBonb:aDialogs )
            //    AEval( ::oRibBonb:aDialogs[ nDialogo ]:aControls,{ |nCtrl| nCtrl:Super:End() } )
            // Next
            *--
            ::oRibbonb:Super:Hide() 
            // ::oRibBonb:End()

            ::oMenuBar := ::MenuClasic()
            ::oWndMain:SetMenu( ::oMenuBar, 7 ); ::ButtomBar()

         Else

            AEval( ::oToolBar:aControls,{|oButton| oButton:End() } )
            
            ::oMenuBar:End(); ::oMenuBar := TMenu():New( NIL )
            ::oToolBar:End(); ::oWndMain:oMenu := ::oMenuBar
            // ::MenuRibbon()
            ::oWndMain:oTop = ::oRibbonb
            ::oWndMain:oBar = nil
            ::oWndMain:Resize()  
            ::oRibbonb:Super:Show() 
         EndIf

         ::oWndMain:Refresh(); ::nMenuwin := nOption; ::oWndMain:Show()
         SysRefresh()

      Endif

   EndIf

RETURN( NIL )

Re: Alternando Menubar y TRibbonbar

Posted: Thu Mar 31, 2016 9:17 am
by Antonio Linares
Estas líneas son las que hacen que la ventana cliente de la MDI se redimensione correctamente:

::oWndMain:oTop = ::oRibbonb
::oWndMain:oBar = nil
::oWndMain:Resize()

Re: Alternando Menubar y TRibbonbar

Posted: Thu Mar 31, 2016 4:10 pm
by compubrion
Antonio ! gracias por tu colaboración, con estas lineas

::oWndMain:oBar = nil
::oWndMain:Resize()

he solucionado el congelamiento de los botonos al ir y venir de un estio a otro, hay que destruir la ribbon ya que si se presiona la tecla alt o la F10, aparace la ribbon cuando estas con el menu tradicional

Cuando se pulsa la tecla Alt
Image

Cuando se pulsa F10
Image

Re: Alternando Menubar y TRibbonbar

Posted: Thu Mar 31, 2016 4:14 pm
by Antonio Linares
Muy bien :-)