Programación General > Visual Basic 6.0 e inferiores
TransOCX (Frames Transparentes)
juanfosaiz:
Hola a todos, me llamo Juan Fran, soy nuevo en el foro y lo primero que deseo, después de presentarme, es agradecer la existencia de este sitio de ayuda y donde se comparten
conocimietos. También quiero disculparme por si el primer tema que expongo tiene un texto demasiado largo.
Estoy cambiando la imágen gráfica de un formulario, y después de buscar sobre cómo evitar que objetos Frame se interpongan en el fondo del formulario (jpg) por no tener propiedades de transparencia o BackStyle, he encontrado el complemento (OCX) llamado "TransOCX", que convierte Frames en transparentes. El tema funciona, se trata poner el control TransOCX encima del propio Frame para que se haga transparente, y lo que pasa es que para que funcione tienes que, en vista diseño, "Enviar al fondo" todos los controles TransOCX, pero cuando vuelvo a cambiar algo en el formulario y lo vuelvo a ejecutar, vuelve a verse el fondo tapado por los colores de fondo de los frames, por lo que tengo que volver a la vista de diseño del ejercicio y volver a "Enviar al fondo" cada control TransOCX a mano, para que no interfieran los frames en el fondo del formulario.
Bueno pues he buscado y probado algunas cosas, como la propiedad ZOrder ("Transparent1.ZOrder (1)" para enviar al fondo (SendToBack)), pero no me ha funcionado, sigo teniendo que cambiar todos los TransOCX en vista de diseño cada vez que hago algún cambio en el módulo que sea del proyecto, y no digo ya el rollo que será cuando tenga 30 en vez de 5 que tengo ahora colocados. Tiene que haber algo que se pueda hacer en vista de código que sea definitivo. El "SendToBack" no me lo reconoce por la versión del VB (VB6 SP6).
Por favor, ¿existe algún truco o código para no tener que andar haciendo "Enviar al fondo" en vista de diseño cada control TransOCX cada vez que modifique el proyecto?
En la figura 1 muestro la colocación de los controles TransOCX en vista diseño en el formulario original (flechas rojas), en la figura 2 muestro el diseño que he hecho con el potochop para el fondo del formulario, y en la figura 3 se ve como queda en tiempo de ejecución la aplicación con el fondo nuevo. El cambio es radical.
Fig. 1: (por favor, poner tres 'w' antes de los nombres de las figuras y ponerlos en un navegador para verlas, ya que todavía no tengo autorización para poner enlaces en el foro)
cesol.es/Fig1.jpg
Fig. 2:
cesol.es/Fig2.jpg
Fig. 3:
cesol.es/Fig3.jpg
Las dos zonas naranjas de la Fig.3 es otra cosa que quería preguntar, ya que debe ser que al ser frames anidados dentro del frame que les rodea, ni siquiera haciendo "Enviar al fondo" en vista diseño de sus controles TransOCX respectivos, soy capaz de hacer que no se vea el color del fondo el frame original, y me tapa ciertos controles de los Frames y el fondo del formulario.
A ver si alguien me puede hechar una manilla o dar algún consejo, cualquier cometario será de agradecer.
Muchas gracias de antemano y saludos.
juanFran.
Nebire:
Hola.
Intenta lo siguiente:
Cuando se inicie la aplicación en el evento 'load' recorres toda la colección de controles del formulario, preguntandopor su tipo, si el control es del tipo transparente, invocas su método 'zorder 1'
ç
algo así...
--- Código: Visual Basic --- dim c as controlon local error resume next for each c in form1.Controls if typename(c)= "NombreControlDeseado" then ' el nombre de la librería, no la propiedad name del control. c.zorder 1 end ifnext
Debería funcionar salvo que haya un control que realice alteraciones en el orden z.
Si esto sucediera, entonces tras cada intervención de ese suceso, se debería ejecutar una rutina que ejecute de nuevo el proceso de enviarlos al fondo.
Para el caso no tiene cuenta volver a recorrer la colección controls del formulario, basta recorrerla una vez al principio, se añaden a un objeto dictionary y luego cuando se precise se reinvoca la función que los envía a todos al fondo. Un ejemplo... Nota que en ejemplo se usan textbox, sustituyelo por el tipo de objetos que es el control deseado.
--- Código: Visual Basic --- ' a nivel del formulario, añade una referencia a microsoft scripting runtimeDim Trans As Scripting.Dictionary Private Sub Form_Load() Dim c As Control, k As Long Set Trans = New Scripting.Dictionary For Each c In Form1.Controls If TypeName(c) = "TextBox" Then ' el nombre de la librería, no la propiedad name del control. k = k + 1 Call Trans.Add(CStr(k), c) End If Next Call EnviarAlfondoEnd Sub ' cada vez que se requiera se llama a este métdo, para reenciar los objetos deseados al fondo.Private Sub EnviarAlfondo() Dim c As Object, k As Long For k = 1 To Trans.Count Set c = Trans.Item(CStr(k)) c.ZOrder 1 c.BackColor = vbRed ' como el orden no se aprecia visualmente, cambiamos el color del fondo... sólo vale para controles con una propiedad backcolor, por supuesto, si no dará error. NextEnd Sub
...ya nos cuentas si te funcionó o no...
juanfosaiz:
Hola de nuevo a todos y muchas gracias, Nebire, me ha parecido una respuesta de lo más competente, te lo aseguro. En cuanto pueda lo pruebo y comento resultados.
Gracias de nuevo y un saludo.
juanfosaiz:
Hola de nuevo, ya probé las opciones que me has dado, pero pese a la lógica aplastante de tu respuesta, de momento sigo con el mismo problema, no consigo llevar al fondo los controles "Transparent" desde el código. Debe ser que estos controles "Transparent" están limitados en cuanto a ciertas propiedades, aunque la propiedad ZOrder sale en el desplegable de opciones al dar al punto después del nombre (name) del control. He investigado más sobre este control "Transparent", como sus propiedades "ShowClient" y "ShowNonClient" porque no sé muy bien de que van, pero no he visto nada. Bueno creo que lo he hecho bien, pero por si acaso te paso los códigos que me has pasado interpretados en mi ejercicio.
Éste es el 1º:
--- Citar ---2.Dim c as Control
3.On Local Error Resume Next
4.For Each c In DatosSoldador.Controls ' ó Me.Controls
5. If TypeName(c)= "Transparent" Then
6. c.ZOrder (1)
7. End If
8.Next
--- Fin de la cita ---
Y el 2º:
--- Citar ----------------------arriba, en la declaración general
Dim Trans As Scripting.Dictionary
------------------------------------en el load
Dim c As Control, k As Long
Set Trans = New Scripting.Dictionary
For Each c In DatosSoldador.Controls ' ó Me.Controls
If TypeName(c) = "Transparent" Then
k = k + 1
Call Trans.Add(CStr(k), c)
End If
Next
Call EnviarAlfondo
-----------------------------------y el Sub EnviarAlFondo
Private Sub EnviarAlfondo()
Dim c As Object, k As Long
For k = 1 To Trans.Count
Set c = Trans.Item(CStr(k))
c.ZOrder (1)
' c.BackColor = vbRed ' he comentado la línea por que efectivamente da error.
Next
End Sub
--- Fin de la cita ---
Con lo que sea, de verdad te doy las gracias por ayudarme, por lo menos lo estamos intentando.
Nebire:
Puedes subir el control a algún sitio donde pueda descargarlo y probarlo ?.
Dado que no es un control de VB si falla es necesario verificar el propio control...
Navegación
[#] Página Siguiente
Ir a la versión completa