Page 1 of 1

Posicionar dialogo en el punto 0,0 dentro de window

PostPosted: Sun Jul 11, 2021 7:26 pm
by leandro
Buenas tardes para todos en este momento requiero poder mostrar un dialogo en la posición "0,0" de la ventana principal, que siempre inicie en ese punto, no importando la posición que tenga en ese momento la ventana principal.

Lo que requiero hacer voy a lo intento explicar en la siguiente imagen:

Image

Code: Select all  Expand view

#include "FiveWin.ch"

static oWnd

//----------------------------------------------------------------------------//

function Main()

   DEFINE WINDOW oWnd TITLE "Probando Iniciar Dialogo En Posicion 0,0" ;
      MDI ;
      MENU BuildMenu()

   SET MESSAGE OF oWnd TO "Main Window"

   ACTIVATE WINDOW oWnd VALID MsgYesNo( "Want to End ?" )

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

   local oMenu

   MENU oMenu
      MENUITEM "&Information"
      MENU
         MENUITEM "&UBICAR" ACTION Dlg( oMenu )
         SEPARATOR
         MENUITEM "&End..." ACTION oWnd:End()
      ENDMENU

   ENDMENU

return oMenu

STATIC FUNCTION Dlg()

    Local aPoint
    Local nTopR
    Local nLeftR
    Local oDlg

    nTopR     := oWnd:nTop      
    nLeftR    := oWnd:nLeft

    aPoint := { nTopR, nLeftR }
    aPoint = ClientToScreen( oWND:hWnd, aPoint )

   DEFINE DIALOG oDlg PIXEL TRUEPIXEL STYLE (DS_MODALFRAME|WS_POPUP|WS_BORDER) SIZE 54,70 OF oWND

        oDlg:bStart := { || SetCapture( oDlg:hWnd ),;
                            oDlg:SetPos( aPoint[ 1 ], aPoint[ 2 ] ) }
   
   ACTIVATE DIALOG oDlg

return .t.

 


De antemano gracias

Re: Posicionar dialogo en el punto 0,0 dentro de window

PostPosted: Sun Jul 11, 2021 8:31 pm
by cnavarro
Leandro, prueba esto, aunque lo suyo sería simplemente pintar en el area cliente de la ventana
Code: Select all  Expand view

#include "FiveWin.ch"

static oWnd

//----------------------------------------------------------------------------//

function Main()

   DEFINE WINDOW oWnd TITLE "Probando Iniciar Dialogo En Posicion 0,0" ;
      MDI ;
      MENU BuildMenu()

   SET MESSAGE OF oWnd TO "Main Window"

   ACTIVATE WINDOW oWnd VALID MsgYesNo( "Want to End ?" )

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

   local oMenu

   MENU oMenu
      MENUITEM "&Information"
      MENU
         MENUITEM "&UBICAR" ACTION Dlg( oMenu )
         SEPARATOR
         MENUITEM "&End..." ACTION oWnd:End()
      ENDMENU

   ENDMENU

return oMenu

STATIC FUNCTION Dlg( oMenu )

    Local aPoint
    Local nTopR
    Local nLeftR
    Local oDlg
    //XBrowse( GetClientRect( oWnd:hWnd ) )

    // https://docs.microsoft.com/en-us/window ... temmetrics
    //nTopR     := oWnd:nTop + if( Valtype( oMenu ) = "O", oMenu:nMnuHeight, 0 ) + GetSysMetrics( 4 ) + GetSysMetrics( 33 )
    // o asi tambien
    //                           Menu                  Caption             Border Y
    nTopR     := oWnd:nTop + GetSysMetrics( 15 ) + GetSysMetrics( 4 ) + GetSysMetrics( 33 )
    nLeftR    := oWnd:nLeft + GetSysMetrics( 32 )  // Border X


   DEFINE DIALOG oDlg FROM nTopR, nLeftR TO nTopR + 54, nLeftR + 70 PIXEL TRUEPIXEL STYLE nOr(DS_MODALFRAME,WS_POPUP,WS_BORDER) OF oWND

   ACTIVATE DIALOG oDlg NOWAIT   //quitar para dialog modal

return .t.


 

Re: Posicionar dialogo en el punto 0,0 dentro de window

PostPosted: Sun Jul 11, 2021 9:18 pm
by leandro
Amigo como vas?

Gracias por responder....

Lo probé y el problema es que funciona solo si la ventana principal esta maximizada o si esta en su posición inicial, pero si cambio la ventana principal de tamaño y/o de posición, ya no funciona.

En la posición inicial
Image

Ventana Maximizada
Image

En otra posición
Image

Re: Posicionar dialogo en el punto 0,0 dentro de window

PostPosted: Sun Jul 11, 2021 9:48 pm
by leandro
Amigo lo solucione de esta manera:

Code: Select all  Expand view


#include "FiveWin.ch"

static oWnd

//----------------------------------------------------------------------------//

function Main()

   DEFINE WINDOW oWnd TITLE "Probando Iniciar Dialogo En Posicion 0,0" ;
      MDI ;
      MENU BuildMenu()

   SET MESSAGE OF oWnd TO "Main Window"

   ACTIVATE WINDOW oWnd VALID MsgYesNo( "Want to End ?" )

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

   local oMenu

   MENU oMenu
      MENUITEM "&Information"
      MENU
         MENUITEM "&UBICAR" ACTION Dlg( oMenu )
         SEPARATOR
         MENUITEM "&End..." ACTION oWnd:End()
      ENDMENU

   ENDMENU

return oMenu

STATIC FUNCTION Dlg( oMenu )
    Local nTopR := 0
    Local nLeftR := 0
    Local oDlg
    Local aCoor
    aCoor := ClientToScreen( oWnd:hWnd, { nTopR, nLeftR } )

    DEFINE DIALOG oDlg FROM nTopR, nLeftR TO nTopR + 54, nLeftR + 70 PIXEL TRUEPIXEL STYLE nOr(DS_MODALFRAME,WS_POPUP,WS_BORDER) OF oWND

        oDlg:bStart = <||  
                oDlg:setpos(aCoor[1],aCoor[2]) 
            >
       
    ACTIVATE DIALOG oDlg NOWAIT   //quitar para dialog modal

return .t.
 

Re: Posicionar dialogo en el punto 0,0 dentro de window

PostPosted: Mon Jul 12, 2021 12:36 am
by leandro
Gracias Cristobal por responder

Este era el efecto que quería lograr

Image

Code: Select all  Expand view

#include "FiveWin.ch"

static oWnd
static oDlg
static aCoor
static oWndChild, oBrw
static cAlias

//----------------------------------------------------------------------------//

function Main()
    Local oBar

   DEFINE WINDOW oWnd TITLE "Probando Iniciar Dialogo En Posicion 0,0" ;
    MDI ;
    MENU BuildMenu()

    SET MESSAGE OF oWnd TO "Main Window" 2015

    oWnd:bInit = { || CustomerBrowse(),progreso(oWnd,.F.) }

   ACTIVATE WINDOW oWnd

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

   local oMenu

   MENU oMenu
      MENUITEM "&Information"
      MENU
         MENUITEM "Abrir" ACTION progreso(oWnd)
         SEPARATOR
         MENUITEM "Cerrar" ACTION oDlg:End()
      ENDMENU

   ENDMENU

return oMenu

STATIC FUNCTION progreso(oVnt,lMod,lInde)

    Local nTopR := 0
    Local nLeftR := 0
    Local nGris :=  rgb(25,25,25)
    Local nActual := 0, nTotal := 255
    Local oMeter,oText,oTxt
    Local cbInicia
    Local cbAjusta
    Local cTxt := "Procesando ..."
   
    DEFAULT lMod := .F.
    DEFAULT lInde := .T.

    DEFINE FONT oText NAME "Calibri" SIZE 0,-22 BOLD

    DEFINE DIALOG oDlg FROM nTopR, nLeftR TO nTopR + 54, nLeftR + 70 PIXEL TRUEPIXEL ;
            STYLE nOr(WS_POPUP,WS_BORDER) OF oVnt COLORS CLR_WHITE,nGris

    @ 140, 240 WHEELMETER oMeter SIZE 200,200 PIXEL OF oDlg ;
        POS nActual RANGE 0, nTotal ;
        ANIMACOLOR CLR_WHITE ;
        BACKCOLOR  nGris ;
        INNERCOLOR nGris ;
        INNERDIA 0.7 ;
        FONT oText

    @ 60 , 0 SAY oTxt VAR cTxt SIZE 20 , 22 PIXEL OF oDlg UPDATE FONT oText COLORS CLR_WHITE,nGris CENTER

    cbInicia  := <||
            Local nTopR := 0
            Local nLeftR := 0
            aCoor := ClientToScreen( oVnt:hWnd, { nTopR, nLeftR } )
            oDlg:nWidth := oVnt:nWidth - ( GetSysMetrics( 32 ) * 2 )
            oDlg:nHeight := oVnt:nHeight - ( GetSysMetrics( 15 ) + GetSysMetrics( 4 ) + ( GetSysMetrics( 33 ) * 2 ) + oVnt:oMsgBar:nHeight )
            oDlg:setpos(aCoor[1],aCoor[2]) 
            oMeter:nLeft := ( oDlg:nWidth - oMeter:nWidth ) / 2
            oTxt:nWidth := oDlg:nWidth
            return nil
        >
   
    oDlg:bStart = { || EVAL(cbInicia) }

    if lInde
        oDlg:bInit  := <||
            oMeter:Indefinite(.T.)
          >
    endif

    oDlg:nOpacity    := 400
    oDlg:lModal := lMod
   
    cbAjusta := <||
            Local nTopR := oDlg:nTop
            Local nLeftR := oDlg:nLeft
            aCoor := ClientToScreen( oVnt:hWnd, { nTopR, nLeftR } ) 
            oDlg:nWidth := oVnt:nWidth - ( GetSysMetrics( 32 ) * 2 )
            oDlg:nHeight := oVnt:nHeight - ( GetSysMetrics( 15 ) + GetSysMetrics( 4 ) + ( GetSysMetrics( 33 ) * 2 ) + oVnt:oMsgBar:nHeight )
            oDlg:setpos(aCoor[1],aCoor[2]) 
            oMeter:nLeft := ( oDlg:nWidth - oMeter:nWidth ) / 2
            oTxt:nWidth := oDlg:nWidth
            return nil
    >
   
    oVnt:bMoved  := <||
            EVAL(cbAjusta)
        >  
   
    oVnt:bResized  := <||
            EVAL(cbAjusta)
        >   
       
    ACTIVATE DIALOG oDlg

return .t.

//----------------------------------------------------------------------------//

function CustomerBrowse()
   USE Customer NEW ALIAS ( cAlias := GetNewAlias( "CUST" ) ) SHARED

   DEFINE WINDOW oWndChild MDICHILD TITLE Alias()
   
    SET MESSAGE OF oWndChild TO "Child Window" 2015  

   @ 0, 0 LISTBOX oBrw ;
      FIELDS  ( cAlias )->First, ( cAlias )->Last ;
      HEADERS "First",           "Last"

   oWndChild:SetControl( oBrw )

   ACTIVATE WINDOW oWndChild MAXIMIZED;
      VALID oBrw:lCloseArea()

return nil

//----------------------------------------------------------------------------//

function GetNewAlias( cDbfName )

   static n := 0

return cDbfName + StrZero( ++n, 2 )

//----------------------------------------------------------------------------//


 

Re: Posicionar dialogo en el punto 0,0 dentro de window

PostPosted: Mon Jul 12, 2021 1:19 am
by cnavarro
Efectivamente Leandro, faltaba esto a mi código

Code: Select all  Expand view

   DEFINE WINDOW oWnd TITLE "Probando Iniciar Dialogo En Posicion 0,0" ;
      MDI ;
      MENU BuildMenu()

   // Añadir
   oWnd:bResized  := oWnd:bMoved := { || oWnd:CoorsUpdate() }

   SET MESSAGE OF oWnd TO "Main Window"

   ACTIVATE WINDOW oWnd VALID MsgYesNo( "Want to End ?" )