Posicionar dialogo en el punto 0,0 dentro de window

Posicionar dialogo en el punto 0,0 dentro de window

Postby leandro » Sun Jul 11, 2021 7:26 pm

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
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1484
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

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

Postby cnavarro » Sun Jul 11, 2021 8:31 pm

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.


 
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6501
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

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

Postby leandro » Sun Jul 11, 2021 9:18 pm

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
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1484
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

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

Postby leandro » Sun Jul 11, 2021 9:48 pm

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.
 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1484
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

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

Postby leandro » Mon Jul 12, 2021 12:36 am

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 )

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


 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1484
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

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

Postby cnavarro » Mon Jul 12, 2021 1:19 am

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 ?" )


 
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6501
Joined: Wed Feb 15, 2012 8:25 pm
Location: España


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 37 guests