13 de julio de 2015

Formularios transparentes

Una forma de hacer transparentes nuestros formularios de nivel superior (ShowWindow = 2).

PUBLIC goform
m.goform = NEWOBJECT("MiFormTopLevel")
m.goform.SHOW(1)
RETURN

DEFINE CLASS MiFormTopLevel AS FORM

  SHOWWINDOW = 2 && Formulario de nivel superior
  AUTOCENTER = .T.
  CAPTION = "Mi Formulario Transparente"
  NAME = "frmMiForm"

  ADD OBJECT lblOpac AS LABEL WITH ;
    FONTBOLD = .T., ;
    FONTSIZE = 20, ;
    LEFT = 50, ;
    TOP = 45, ;
    CAPTION = "Opacidad:", ;
    AUTOSIZE = .T., ;
    NAME = "lblOpac"

  ADD OBJECT sprOpac AS SPINNER WITH ;
    FONTBOLD = .T., ;
    FONTSIZE = 20, ;
    HEIGHT = 40, ;
    LEFT = 200, ;
    TOP = 40, ;
    WIDTH = 80, ;
    VALUE = 75, ;
    INCREMENT =   5, ;
    KEYBOARDHIGHVALUE = 100, ;
    KEYBOARDLOWVALUE = 10, ;
    SPINNERHIGHVALUE = 100, ;
    SPINNERLOWVALUE =  10, ;
    NAME = "sprOpac"

  PROCEDURE LOAD
    IF VAL(OS(3)) >= 5  && Windows 2000 o superior
      LOCAL lnOpacidad

      m.lnOpacidad = 75 && Porcentaje de opacidad
      m.lnOpacidad = 255 * MIN(MAX(m.lnOpacidad,0),100) / 100

      DECLARE SetWindowLong ;
        IN WIN32API ;
        AS __SetWindowLong ;
        INTEGER, ;
        INTEGER, ;
        INTEGER

      DECLARE SetLayeredWindowAttributes ;
        IN WIN32API ;
        AS __SetLayeredWindowAttributes ;
        INTEGER, ;
        STRING, ;
        INTEGER, ;
        INTEGER

      __SetWindowLong(THISFORM.HWND, -20, 0x00080000)
      __SetLayeredWindowAttributes(THISFORM.HWND, 0, m.lnOpacidad, 2)

    ENDIF
  ENDPROC

  PROCEDURE sprOpac.INTERACTIVECHANGE
    IF VAL(OS(3)) >= 5  && Windows 2000 o superior
      LOCAL lnOpacidad
      m.lnOpacidad = THIS.VALUE
      m.lnOpacidad = 255 * MIN(MAX(m.lnOpacidad,0),100) / 100
      __SetLayeredWindowAttributes(THISFORM.HWND, 0, m.lnOpacidad, 2)
    ENDIF
  ENDPROC

ENDDEFINE

Luis María Guayán

1 comentario :