Buenos días para todos,
En esta ocasión me surge la necesidad de saber, si el ultimo punto (parte inferior derecha) de un dialogo se encuentra fuera de pantalla. Como se muestra en la imagen.
De antemano gracias,
LEANDRO AREVALO
nTopR := oDlg:nTop
nLeftR := oDlg:nLeft
nAltura := oDlg:nHeight
Nota 2 : Igual me he explicado fatal.
METHOD dibujaDialogo(oDlg,oGet) CLASS cBusc
Local vGbus := space(100)
local nTopR, nLeftR, nAltura
local aPoint,nWidth:=0
nTopR := oGet:nTop
nLeftR := oGet:nLeft
nAltura := oGet:nHeight
aPoint := { nTopR+nAltura, nLeftR }
aPoint = ClientToScreen( oDlg:hWnd, aPoint )
::variables()
::consulta()
Define Font oFont Name "Calibri" Size 0,-12 Bold
Define Font oFont1 Name "Calibri" Size 0,-13
DEFINE DIALOG oDlgBar RESOURCE "ORFACT3" OF oDlg
REDEFINE GET oGbus VAR vGbus ID 4002 OF oDlgBar UPDATE VALID (::hacefiltro(cBrw,vGbus),.T.)
cBrw := TXBrowse():New( oDlgBar )
cBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
cBrw:nRowDividerStyle := LINESTYLE_LIGHTGRAY
cBrw:nColDividerStyle := LINESTYLE_LIGHTGRAY
cBrw:nHeaderLines := 1
cBrw:lColDividerComplete := .t.
cBrw:lRecordSelector := .t.
cBrw:nStretchCol := STRETCHCOL_LAST
cBrw:l2007 := .f.
cBrw:oFont := oFont1
cBrw:bKeyDown := {|nKey|iif(nKey == 13,oDlgBar:end(),)}
cBrw:blDblClick := {|| oDlgBar:end()}
oCol = cBrw:AddCol()
oCol:bStrData = { || If( ::oRsBar:Eof, Space( nWidth ), ::oRsBar:Fields( ::hCampos["codigo"] ):Value ) }
oCol:cHeader = ::hCabecera["codigo"]
oCol:nWidth = 90
oCol:nHeadStrAlign = AL_LEFT
oCol:nDataStrAlign = AL_LEFT
oCol:oHeaderFont = oFont
oCol:bLClickHeader := {|r,c,f,o| ::organiza(::hCampos["codigo"]) }
oCol = cBrw:AddCol()
oCol:bStrData = { || If( ::oRsBar:Eof, Space( nWidth ), alltrim( ::oRsBar:Fields( ::hCampos["nombre"] ):Value ) ) }
oCol:cHeader = ::hCabecera["nombre"]
oCol:nWidth = 250
oCol:nHeadStrAlign = AL_LEFT
oCol:nDataStrAlign = AL_LEFT
oCol:oHeaderFont = oFont
oCol:bLClickHeader := {|r,c,f,o| ::organiza(::hCampos["nombre"]) }
cBrw:SetADO( ::oRsBar )
cBrw:CreateFromResource( 102 )
oDlgBar:cTitle := "Buscar Artículo"
oDlgBar:bPostEnd := { || ::oRsBar:Close() }
oDlgBar:nOpacity := 240
oDlgBar:bStart := { || SetCapture( oDlgBar:hWnd ) }
ACTIVATE DIALOG oDlgBar ON INIT (oDlgBar:SetPos( aPoint[ 1 ], aPoint[ 2 ] ) )
::retorna()
return nil
STATIC FUNCTION PRUEBA_DIALOGO()
LOCAL oWnd
DEFINE WINDOW oWnd FROM 100,100 TO 600,1200 PIXEL TITLE "POSICION DIALOGO" COLOR CLR_BLACK, CLR_GRAY
@100,100 BUTTON "CREA UN DIALOGO EN 100" SIZE 200,20 OF oWnd PIXEL ACTION Prueba2(oWnd,100) // de tamaño 500,500
@300,100 BUTTON "CREA UN DIALOGO EN 300" SIZE 200,20 OF oWnd PIXEL ACTION Prueba2(oWnd,300) // de tamaño 500,500
@500,100 BUTTON "CREA UN DIALOGO EN 500" SIZE 200,20 OF oWnd PIXEL ACTION Prueba2(oWnd,500) // de tamaño 500,500
ACTIVATE WINDOW oWnd MAXIMIZED
RETURN(NIL)
static function prueba2(oWnd,nVerticalPos)
local odlg
DEFINE DIALOG oDlg FROM nVerticalPos,305 TO 500,nVerticalPos+500 TITLE "Posicion oDlg" PIXEL OF OWND
oDlg:nTop:=nVerticalPos
oDlg:nLeft:=305
oDlg:nBottom:=nVerticalPos+500
oDlg:nRight:=305+500
@10,10 BUTTON "DIME" OF oDlg size 100,20 PIXEL ACTION msgalert(str(oDlg:nTop)+"-"+str(oDlg:nBottom))
IF MeCabe(oDlg)
ACTIVATE DIALOG oDlg
ELSE
ACTIVATE DIALOG oDlg CENTER
ENDIF
return(nil)
STATIC FUNCTION MeCabe(oDlg)
IF oDlg:nBottom>GetSysMetrics(1)
msgalert("el dialogo no cabe de alto")
RETURN(.F.)
ENDIF
RETURN(.T.)
// Para comprobar el ancho usa GetSysMetrics(0)
// Debes tener en cuenta que el valor de oDlg:nTop cambia segun su ventana contenedora, si tiene menu, etc...
// Para rizar el rizo, en vez de centrar el dialogo, pues calcular cuanto espacio libre te queda y dimensionar el dialogo
// Tambien puedes hacer que en vez de mostrarse hacia abajo y hacia la derecha, se muestre hacia arriba y/o hacia la izquierda
STATIC FUNCTION PRUEBA_DIALOGO()
LOCAL oWnd
LOCAL oMenu
MENU oMenu //FONT oFont
MENUITEM "&Sistema"
MENU
MENUITEM "&Especificar impresora" ACTION PrinterSetup()
SEPARATOR
MENUITEM "&Salir" ACTION oWnd:End()
ENDMENU
ENDMENU
DEFINE WINDOW oWnd FROM 100,100 TO 600,1200 PIXEL TITLE "POSICION DIALOGO - MAXIMA ALTURA "+STR(GetSysMetrics(1)) COLOR CLR_BLACK, CLR_GRAY //MENU oMenu
@100,100 BUTTON "CREA UN DIALOGO EN 100" SIZE 200,20 OF oWnd PIXEL ACTION Prueba2(oWnd,100) // de tamaño 500,500
@200,100 BUTTON "CREA UN DIALOGO EN 200" SIZE 200,20 OF oWnd PIXEL ACTION Prueba2(oWnd,200) // de tamaño 500,500
@500,100 BUTTON "CREA UN DIALOGO EN 500" SIZE 200,20 OF oWnd PIXEL ACTION Prueba2(oWnd,500) // de tamaño 500,500
ACTIVATE WINDOW oWnd MAXIMIZED
RETURN(NIL)
static function prueba2(oWnd,nVerticalPos)
local odlg
LOCAL nAjustar:=CuantoAjustar(oWnd)
DEFINE DIALOG oDlg FROM nVerticalPos+nAjustar,305 TO nVerticalPos+nAjustar+500,305+500 TITLE "Posicion oDlg" PIXEL OF OWND
oDlg:nTop:=nVerticalPos+nAjustar
oDlg:nLeft:=305
msgalert("nTop vale "+str(oDlg:nTop))
oDlg:nBottom:=nVerticalPos+500-8 //-8 que crea el dialogo
oDlg:nRight:=305+500
@10,10 BUTTON "DIME" OF oDlg size 100,20 PIXEL ACTION msgalert(str(oDlg:nTop)+"-"+str(oDlg:nBottom))
IF MeCabe(oDlg)
ACTIVATE DIALOG oDlg
ELSE
ACTIVATE DIALOG oDlg CENTER
ENDIF
return(nil)
STATIC FUNCTION MeCabe(oDlg)
IF oDlg:nBottom>GetSysMetrics(1)-25-50 // pongo 25 de margen y 50 barra inferior de windows
* msgalert("el dialogo no cabe de alto")
RETURN(.F.)
ENDIF
RETURN(.T.)
// Para comprobar el ancho usa GetSysMetrics(0)
// Debes tener en cuenta que el valor de oDlg:nTop cambia segun su ventana contenedora, si tiene menu, etc...
// Para rizar el rizo, en vez de centrar el dialogo, pues calcular cuanto espacio libre te queda y dimensionar el dialogo
// Tambien puedes hacer que en vez de mostrarse hacia abajo y hacia la derecha, se muestre hacia arriba y/o hacia la izquierda
STATIC FUNCTION CuantoAjustar(oWnd)
local nAjuste:=0
local oDlg
DEFINE DIALOG oDlg FROM 100,100 TO 200,200 TITLE "Cuanto tengo que ajustar" PIXEL OF OWND
ACTIVATE DIALOG oDlg ON INIT (nAjuste:=100-oDlg:nTop, oDlg:End() )
return(nAjuste)
msginfo(oDlg:nBottom) // Retorna 151
msginfo(GetSysMetrics(1)) // Retorna 768
METHOD dibujaDialogo(oDlg,oGet) CLASS cBusc
Local vGbus := space(100)
local nTopR, nLeftR, nAltura
local aPoint,nWidth:=0
local oDlgBar
nTopR := oGet:nTop
nLeftR := oGet:nLeft
nAltura := oGet:nHeight
aPoint := { nTopR+nAltura, nLeftR }
aPoint = ClientToScreen( oDlg:hWnd, aPoint )
::variables()
::consulta()
Define Font oFont Name "Calibri" Size 0,-12 Bold
Define Font oFont1 Name "Calibri" Size 0,-13
DEFINE DIALOG oDlgBar RESOURCE "ORFACT3" OF oDlg
REDEFINE GET oGbus VAR vGbus ID 4002 OF oDlgBar UPDATE VALID (::hacefiltro(cBrw,vGbus),.T.)
cBrw := TXBrowse():New( oDlgBar )
cBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
cBrw:nRowDividerStyle := LINESTYLE_LIGHTGRAY
cBrw:nColDividerStyle := LINESTYLE_LIGHTGRAY
cBrw:nHeaderLines := 1
cBrw:lColDividerComplete := .t.
cBrw:lRecordSelector := .t.
cBrw:nStretchCol := STRETCHCOL_LAST
cBrw:l2007 := .f.
cBrw:oFont := oFont1
cBrw:bKeyDown := {|nKey|iif(nKey == 13,oDlgBar:end(),)}
cBrw:blDblClick := {|| oDlgBar:end()}
oCol = cBrw:AddCol()
oCol:bStrData = { || If( ::oRsBar:Eof, Space( nWidth ), ::oRsBar:Fields( ::hCampos["codigo"] ):Value ) }
oCol:cHeader = ::hCabecera["codigo"]
oCol:nWidth = 90
oCol:nHeadStrAlign = AL_LEFT
oCol:nDataStrAlign = AL_LEFT
oCol:oHeaderFont = oFont
oCol:bLClickHeader := {|r,c,f,o| ::organiza(::hCampos["codigo"]) }
oCol = cBrw:AddCol()
oCol:bStrData = { || If( ::oRsBar:Eof, Space( nWidth ), alltrim( ::oRsBar:Fields( ::hCampos["nombre"] ):Value ) ) }
oCol:cHeader = ::hCabecera["nombre"]
oCol:nWidth = 250
oCol:nHeadStrAlign = AL_LEFT
oCol:nDataStrAlign = AL_LEFT
oCol:oHeaderFont = oFont
oCol:bLClickHeader := {|r,c,f,o| ::organiza(::hCampos["nombre"]) }
cBrw:SetADO( ::oRsBar )
cBrw:CreateFromResource( 102 )
oDlgBar:cTitle := "Buscar Artículo"
oDlgBar:bPostEnd := { || ::oRsBar:Close() }
oDlgBar:nOpacity := 240
oDlgBar:bStart := { || SetCapture( oDlgBar:hWnd ) }
IF MeCabe(oDlgBar)
ACTIVATE DIALOG oDlgBar ON INIT (oDlgBar:SetPos( aPoint[ 1 ], aPoint[ 2 ] ) )
ELSE
ACTIVATE DIALOG oDlgBar CENTER
ENDIF
::retorna()
return nil
FUNCTION MeCabe(oDlg)
msginfo(oDlg:nBottom)
msginfo(GetSysMetrics(1))
IF oDlg:nBottom>GetSysMetrics(1)
msgalert("el dialogo no cabe de alto")
RETURN(.F.)
ENDIF
RETURN(.T.)
STATIC FUNCTION PRUEBA_DIALOGO()
LOCAL oWnd
LOCAL oMenu
LOCAL N:=1
MENU oMenu
MENUITEM "&Sistema"
MENU
MENUITEM "&Especificar impresora" ACTION PrinterSetup()
SEPARATOR
MENUITEM "&Salir" ACTION oWnd:End()
ENDMENU
ENDMENU
DEFINE WINDOW oWnd MDI FROM 100,100 TO 600,1200 PIXEL TITLE "TEST POSICION DIALOGO" COLOR CLR_BLACK, CLR_GRAY MENU oMenu
ACTIVATE WINDOW oWnd MAXIMIZED ON INIT CreaChild(oWnd)
RETURN(NIL)
static function CreaChild(oWnd)
local oWndChild
local oGroup
LOCAL oBtn
DEFINE WINDOW oWndChild MDICHILD OF oWnd FROM 200,500 TO 600,1000 PIXEL TITLE "oWndChild" COLOR CLR_BLACK, CLR_WHITE
@10,10 GROUP oGroup TO 110,200 PROMPT "GRUPO" OF oWndChild PIXEL
@25,10 BUTTON oBtn PROMPT "CREA" SIZE 100,20 OF oGroup PIXEL ACTION Prueba2(oBtn)
ACTIVATE WINDOW oWndChild
RETURN(NIL)
///////////////////////////////////////////////////////////////////////////////
static function prueba2(oBtn)
local odlg
LOCAL oWnd:=oBtn:oWnd
LOCAL nVerticalPos:=oBtn:nTop
LOCAL nAjustar:=CuantoAjustar(oWnd)
LOCAL nNTOP, nNLEFT, nNBOTTOM, nNRIGHT
nnTop:=nVerticalPos+nAjustar+30 // al crear el dialogo se me sube siempre 30, los añado
nnLeft:=GetRight(oBtn)
nnBottom:=nVerticalPos+nAjustar+30+100 //100 es el tamaño del dialogo, pon tu el tuyo
nnRight:=nnLeft+100 // 100 idem
DEFINE DIALOG oDlg FROM nnTop, nnLeft TO nnBottom, nnRight TITLE "oDLG POSICIONADO" PIXEL OF oWnd
IF oDlg:nBottom>GetSysMetrics(1)-40-30 // pongo 40 barra inferior de windows y 30 de ajuste manual
ACTIVATE DIALOG oDlg CENTER // aqui puedes utilizar aPos := GetCoors( FindWindow( "Shell_TrayWnd", "" ) )
ELSE // para saber donde esta la barra de windows
ACTIVATE DIALOG oDlg
ENDIF
// Recuerda que puedes rizar el rizo.
// En vez de centrar el dialogo, puedes pensar (si no te cabe por abajo), ponerlo hacia arriba.
// Si tampoco te cabe hacia arriba, centrarlo verticalmente.
// Lo mismo a derecha e izquierda.
// Y si no cabe en ninguna de las 4 posiciones, entonces lo centras.
return(nil)
///////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION CuantoAjustar(oWnd)
local nAjuste:=0
local oDlg
local n:=1
local nLocalAjuste:=0
local aRect
DO WHILE .T.
IF oWnd:ClassName()="TMDIFRAME"
EXIT
ENDIF
// aqui tienes que desarrollar mas posibles casos TDIALOG, ETC...
// Yo he hecho el TGROUP y el TMDICHILD
IF oWnd:ClassName()="TGROUP"
nAjuste:=nAjuste+oWnd:nTop
ENDIF
IF oWnd:ClassName()="TMDICHILD"
nLocalAjuste:=0
DEFINE DIALOG oDlg FROM 100,100 TO 200,200 TITLE "Cuanto tengo que ajustar" PIXEL OF OWND
ACTIVATE DIALOG oDlg ON INIT (nLocalAjuste:=100-oDlg:nTop, oDlg:End() )
nAjuste:=nAjuste+nLocalAjuste
aRect := GetCoors( oWnd:hWnd ) // esto me dice donde esta ahora la ventana
nAjuste:=nAjuste+aRect[1]
ENDIF
oWnd:=oWnd:oWnd
ENDDO
RETURN(nAjuste)
////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION GetRight(objeto) // Devuelve el punto derecha absoluto del objeto pasado, en este caso un boton, prueba con un get
LOCAL oWnd:=objeto:oWnd
LOCAL nRight:=0
LOCAL aRect
DO WHILE .T.
IF oWnd:ClassName()="NIL"
EXIT
ENDIF
// aqui tienes que desarrollar mas posibles casos TDIALOG, ETC...
// Yo he hecho el TGROUP, TMDICHILD Y TMDIFRAME
IF oWnd:ClassName()="TGROUP"
nRight:=nRight+oWnd:nLeft
ENDIF
IF oWnd:ClassName()="TMDICHILD" .or. oWnd:ClassName()="TMDIFRAME"
aRect := GetCoors( oWnd:hWnd )
nRight:=nRight+aRect[2]
ENDIF
oWnd:=oWnd:oWnd
ENDDO
nRight:=nRight+objeto:nLeft+objeto:nWidth+13
return(nRight)
Return to FiveWin para Harbour/xHarbour
Users browsing this forum: Google [Bot] and 11 guests