Autor
|
Tema: Alguien sabe como conseguir esto (Leído 12,377 veces)
|
Fran1946
Desconectado
Mensajes: 56
|
Te preguntaba en mi mensaje anterior, por la funcionalidad, simplemente para sugerirte opciones más amplias, sencillas (de usar) y válidas, si se tratara (por ejemplo) de algo como girar una imagen cambiar brillo, guardar una imagen, etc, pués ofrecerte ejemplos de código, si fueran demasiadas cosas o bien más complejas sugerirte alguna librería... pero si prefieres no dar explicaciones en tu "proceso bastante complicado, que es irrelevante", entonces sigue con el camino que llevas... [/quote]
Hola NEBIRE:
Lamento si te ha molestado mi respuesta, no es mi intención, simplemente no doy detalles de el tipo de procesos que hago con las imágenes por que es irrelevante y no guarda relación con mi consulta y tampoco tiene nada que ver con cambios de color, brillo, girar o comprimir, amén de que sería muy largo de explicar y haría mas difícil que alguien se interesara por responder. Pero si debo de explicar, debido a tu interés por ayudar, por que he decidido utilizar el visor de Windows. Yo utilizaba para ver la comparación un PictureBox, que sería más logico utilizar, pero este control tiene muchos problemas de errores al cargar ciertas imágenes con nombres muy raros, como estos ejemplos que son reales:
!B,wfDHgBGk~$(KGrHgoOKj!EjlLmZDmvBKs6y)CFe!~~_3.jpg 鋼拉絲Steel Brushed Stainless.jpg MATI BELEN, COVA Y ROSANA, CON ADRIANA, Y JOSE ANTONIO.jpg
Ninguno de estos archivos los carga PictureBox sin dar error, y por supuesto no los visualiza. Y además no puedo evitar ni sortear el error, si se produce, sin que se cierre el programa. También necesitaba, que al comparar las imágenes originales y procesadas, pudiera hacer zoom para apreciar mejor ciertas diferencias, también esto ya lo tenía resuelto con barras scroll, que no me gustan nada. Y todo esto y alguna cosilla más, lo tengo resuelto utilizando el visor de Windows, por las siguientes razones: Los archivos raros los carga sin problema y sin error Tengo el zoom, mejor del mundo, con la rueda del ratón, nada que ver con 2 scrollV y H Mover la imagen, con cursor de icono de mano incluido, por muy grande que esta sea de forma perfecta, poder redimensionar el visor o maximizarlo, minimizarlo. Y todo esto manejando simplemente 10 Hwnd's del visor de Windows, 35 líneas de código.
|
|
|
En línea
|
|
|
|
Fran1946
Desconectado
Mensajes: 56
|
En realidad te equivocas respecto al árbol. Por esta razón no encuentras Photos_commandbar. No has entendido el concepto de ventanas Parents y Childs. Realmente el árbol sería así: Photo_Lightweight_Viewer - Photos_CommandBar - Photos_ButtonEx (Arc&hivo) - Photos_ButtonEx (&Imprimir) - Photos_ButtonEx (Correo &electrónico) - Photos_ButtonEx (&Grabar) - Photos_ButtonEx (&Abrir) - Photos_ButtonEx ("") objeto oculto - Photos_ButtonEx ("") objeto oculto - Photos_PhotoCanvas - ATL:568ED690 - Photos_ButtonEx ("") objeto oculto - Photos_ButtonEx ("") objeto oculto - Photos_ButtonEx ("") objeto oculto - Photos_NavigationPane - Photos_NavigationBar - Photos_ButtonEx (control de navegación) - Photos_ButtonEx (control de navegación) - Photos_ButtonEx (control de navegación) - Photos_ButtonEx (control de navegación) - Photos_ButtonEx (control de navegación) - Photos_ButtonEx (control de navegación) - Photos_ButtonEx (control de navegación) - Photos_ButtonEx (control de navegación)
Entonces, Photo_Lightweight_Viewer tiene cuatro hijos que son Photos_CommandBar, Photos_PhotoCanvas, ATL:568ED690 (no se lo que es) y Photos_NavigationPaneCon mi código lo que hice fue encontrar primero Photo_Lightweight_Viewer y luego el hijo Photos_NavigationPane mediante éste encuentro su hijo Photos_NavigationBar y despues los botones. Para encontrar Photos_CommandBar necesito el handle (hwnd) del padre que es Photo_Lightweight_Viewer. Por lo tanto para encontrarlo primero encuentras el padre que es hPhoto_Lightweight_Viewer = FindWindow("Photo_Lightweight_Viewer", TITULODELAVENTANA) y después uno de sus hijos que en este caso te interesa Photos_CommandBarhPhotos_commandbar = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_commandbar", vbNullString) Demostración: Dim TITULODELAVENTANA As String Dim hPhoto_Lightweight_Viewer As Long Dim hPhotos_commandbar As Long TITULODELAVENTANA = "demo.jpg - Visualizador de fotos de Windows" hPhoto_Lightweight_Viewer = FindWindow("Photo_Lightweight_Viewer", TITULODELAVENTANA) hPhotos_commandbar = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_commandbar", vbNullString) MsgBox "barra = " & Hex(hPhotos_commandbar)
Por si te sirve te dejo este código para ajustar colores (brillo, contraste, escala de grises, etc) https://mega.nz/#!fBlyUCpQ!Kemdm1iZ52dScMcYy6cfak2VzEV4jZ8pBlByvkrLK_0demostración: Hola de nuevo: He llegado tarde.. Ya lo había resuelto, después de estudiar tu código, no funcionaba por que tenía la variable de clase nueva 'Photos_commandbar' escrita como 'hPhotos_commandbar' y el resultado era 0. Y como todos estos hijos: - Photos_ButtonEx (Arc&hivo) - Photos_ButtonEx (&Imprimir) - Photos_ButtonEx (Correo &electrónico) - Photos_ButtonEx (&Grabar) - Photos_ButtonEx (&Abrir) - Photos_ButtonEx ("") objeto oculto - Photos_ButtonEx ("") objeto oculto Tienen que estar prohibidos utilizarlos, simplemente cierro la ventana padre: - Photos_CommandBar Y de nuevo muchas gracias por el SetColorAdjustment.zip, este yo lo tenía yo. Hay un cierto problemilla: Después de cargar la imagen en el visor, llamo al Call de leer los Hwnd's Y después se cierran las ventanas que no quiero, pero no siempre devuelve el Hwnd de algunas ventanas retorna = 0, pero si intercalo un delay de algunos milisegundos (tengo que probar cantos para que no retrase mucho) entre lecturas si devuelve valores correctos. Alguna sugerencia a este respecto?. Gracias de nuevo.
|
|
|
En línea
|
|
|
|
FJDA
Desconectado
Mensajes: 323
|
Después de cargar la imagen en el visor, llamo al Call de leer los Hwnd's Y después se cierran las ventanas que no quiero, pero no siempre devuelve el Hwnd de algunas ventanas retorna = 0, pero si intercalo un delay de algunos milisegundos (tengo que probar cantos para que no retrase mucho) entre lecturas si devuelve valores correctos. Alguna sugerencia a este respecto?.
usa un do While Do While HWNDParent = 0 HWNDParent = [Buscar handle visualizador de windows] DoEvents '//esto es para evitar que la apliación se quede pillada Loop 'Do While hwnd = 0 '[Abrir imagen en el visualizador de windows correspondiente] 'DoEvents 'Loop
Y como todos estos hijos: - Photos_ButtonEx (Arc&hivo) - Photos_ButtonEx (&Imprimir) - Photos_ButtonEx (Correo &electrónico) - Photos_ButtonEx (&Grabar) - Photos_ButtonEx (&Abrir) - Photos_ButtonEx ("") objeto oculto - Photos_ButtonEx ("") objeto oculto Tienen que estar prohibidos utilizarlos, simplemente cierro la ventana padre:
- Photos_CommandBar
pues no se que habrás hecho Usa ShowWindow y el comando HIDE_WINDOW = 0. Si lo has usado no funciona es que no lo harás bien digo yo. miratelo Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _ (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" _ (ByVal hwnd As Long, ByVal wFlag As Long) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long Const HIDE_WINDOW = 0 Const SHOW_OPENWINDOW = 1 Const GW_HWNDNEXT = 2 Const GW_CHILD = 5 Dim TITULODELAVENTANA As String Dim hPhoto_Lightweight_Viewer As Long Dim hPhotos_NavigationPane As Long Dim hPhotos_NavigationBar As Long Dim hPhotos_ButtonEx_1 As Long Dim hPhotos_ButtonEx_2 As Long Dim hPhotos_ButtonEx_3 As Long Dim hPhotos_ButtonEx_4 As Long Dim hPhotos_ButtonEx_5 As Long Private Sub Command1_Click() TITULODELAVENTANA = "Desierto.jpg - Visualizador de fotos de Windows" 'Orden de padre a hijos '1.Photo_Lightweight_Viewer '-----Photos_NavigationPane '------------Photos_NavigationBar '----------------------Photos_ButtonEx '//handle de la ventana hPhoto_Lightweight_Viewer = FindWindow("Photo_Lightweight_Viewer", TITULODELAVENTANA) '//handle del panel 'handle de Photo_Lightweight_Viewer handlePhotos_NavigationPane = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_NavigationPane", vbNullString) '//Handle del control de botones 'handle de hPhotos_NavigationBar handlePhotos_NavigationBar = FindWindowEx(handlePhotos_NavigationPane, ByVal 0&, "Photos_NavigationBar", vbNullString) '//BOTONES '//Como Photos_ButtonEx no tiene hijos a partir de aquí se usa GW_HWNDNEXT '//para obtener el handle del siguiente botón (ventana) 'handle de Photos_ButtonEx (la lupa) hPhotos_ButtonEx_1 = FindWindowEx(handlePhotos_NavigationBar, ByVal 0&, "Photos_ButtonEx", vbNullString) 'handle de Photos_ButtonEx (botón maximizar) hPhotos_ButtonEx_2 = GetWindow(hPhotos_ButtonEx_1, GW_HWNDNEXT) 'handle de Photos_ButtonEx (botón "izquierda") hPhotos_ButtonEx_3 = GetWindow(hPhotos_ButtonEx_2, GW_HWNDNEXT) 'handle de Photos_ButtonEx (botón diapositivas) hPhotos_ButtonEx_4 = GetWindow(hPhotos_ButtonEx_3, GW_HWNDNEXT) 'handle de Photos_ButtonEx (botón "derecha") hPhotos_ButtonEx_5 = GetWindow(hPhotos_ButtonEx_4, GW_HWNDNEXT) 'quitar hPhotos_ButtonEx_1 Call ShowWindow(hPhotos_ButtonEx_1, HIDE_WINDOW) 'quitar hPhotos_ButtonEx_2 Call ShowWindow(hPhotos_ButtonEx_2, HIDE_WINDOW) 'quitar hPhotos_ButtonEx_5 Call ShowWindow(hPhotos_ButtonEx_5, HIDE_WINDOW) End Sub Private Sub Command2_Click() 'mostrar hPhotos_ButtonEx_1 Call ShowWindow(hPhotos_ButtonEx_1, SHOW_OPENWINDOW) 'mostrar hPhotos_ButtonEx_2 Call ShowWindow(hPhotos_ButtonEx_2, SHOW_OPENWINDOW) 'mostrar hPhotos_ButtonEx_5 Call ShowWindow(hPhotos_ButtonEx_5, SHOW_OPENWINDOW) End Sub
|
|
« Última modificación: 5 Febrero 2020, 18:58 pm por FJDA »
|
En línea
|
|
|
|
Fran1946
Desconectado
Mensajes: 56
|
usa un do While Do While HWNDParent = 0 HWNDParent = [Buscar handle visualizador de windows] DoEvents '//esto es para evitar que la apliación se quede pillada Loop 'Do While hwnd = 0 '[Abrir imagen en el visualizador de windows correspondiente] 'DoEvents 'Loop
Hola de nuevo: Si yo tengo algo parecido, esto: Public Function EjecutaShell(file As String) As Boolean Shell ("explorer.exe " & file) HwndOrg = 0 tm = 0 Timer2.Interval = 1 Timer2.Enabled = True Do While HwndOrg = 0 HwndOrg = FindWindow("photo_lightweight_viewer", vbNullString) ' consigo el hwnd DoEvents If tm = 100 And HwndOrg = 0 Then 'si no obtiene HwndOrg, sale a los 100 ms GoTo sal End If Loop sal: Timer2.Interval = 0 Timer2.Enabled = False End Function
Y una cosa que se me olvidó... Tampoco he conseguido, que no salgan los menues del visor, al pulsar botón dcho del ratón Se puede hacer?.
|
|
|
En línea
|
|
|
|
FJDA
Desconectado
Mensajes: 323
|
pues tengo una ligera idea de que quizás si se pueda. Espera a que pruebe.
|
|
« Última modificación: 5 Febrero 2020, 19:22 pm por FJDA »
|
En línea
|
|
|
|
Fran1946
Desconectado
Mensajes: 56
|
Usa ShowWindow y el comando HIDE_WINDOW = 0. Si lo has usado no funciona es que no lo harás bien digo yo. miratelo
Esto está resuelto y funciona perfecto.
Gracias.
|
|
|
En línea
|
|
|
|
FJDA
Desconectado
Mensajes: 323
|
a ver, esto lo que hace es inhabilitar la ventana Photos_PhotoCanvas que contiene la imagen. De este modo no se puede usar el ratón (solo en Photos_PhotoCanvas) Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function EnableWindow Lib "user32" _ (ByVal hwnd As Long, ByVal fEnable As Long) As Long Private Sub Command1_Click() Dim hPhotos_PhotoCanvas As Long Dim hPhoto_Lightweight_Viewer As Long TITULODELAVENTANA = "Desierto.jpg - Visualizador de fotos de Windows" '//handle de la ventana hPhoto_Lightweight_Viewer = FindWindow("Photo_Lightweight_Viewer", TITULODELAVENTANA) '//handle del Photos_PhotoCanvas hPhotos_PhotoCanvas = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_PhotoCanvas", vbNullString) Call EnableWindow(hPhotos_PhotoCanvas, vbFalse) End Sub
|
|
|
En línea
|
|
|
|
Fran1946
Desconectado
Mensajes: 56
|
Fantástico, es perfecto. Tu ayuda ha sido extraordinaria, todo funciona como un reloj. Que opinas sobre los argumentos que le respondí a NEBIRE. Crees que un PictureBox puede hacer lo que hago con el visor, me refiero a que no sea capaz de cargar y visualizar archivos de jpg, son los únicos que maneja mi programa, con nombres largo, con caracteres raros y/o símbolos que no acepta?. Y tampoco entiendo que después de muchas horas buscando en Internet, no he conseguido la info que tu me has dado, buscando específicamente lo referente a Ventanas padre e hijos. Me reitero, mil gracias. Un saludo.
|
|
|
En línea
|
|
|
|
FJDA
Desconectado
Mensajes: 323
|
Fantástico, es perfecto. Tu ayuda ha sido extraordinaria, todo funciona como un reloj. Que opinas sobre los argumentos que le respondí a NEBIRE. Crees que un PictureBox puede hacer lo que hago con el visor, me refiero a que no sea capaz de cargar y visualizar archivos de jpg, son los únicos que maneja mi programa, con nombres largo, con caracteres raros y/o símbolos que no acepta?. Y tampoco entiendo que después de muchas horas buscando en Internet, no he conseguido la info que tu me has dado, buscando específicamente lo referente a Ventanas padre e hijos. Me reitero, mil gracias. Un saludo. Con los rifirafes que tengas con otro usuario yo ahí no me meto, menos si es del staff de este foro que no se si será, que aquí son muy susceptibles. En cuanto a lo del picture el error se produce porque para cargar una imagen debes hacer uso de LoadPicture() para la propiedad Picture de la imagen. Al cargar un nombre extraño no entiende determinados carácteres y se reemplazan por interrogantes, por ejemplo [C:\directorio\鋼拉絲Steel Brushed Stainless.jpg] queda como [C:\directorio\???Steel Brushed Stainless.jpg]. Dado que el archivo ???Steel Brushed Stainless.jpg no existe da error. Da igual el cuadro de diálogo que uses al final debes meterlo en la propiedad la cual va a recibir un directorio que no existe. Por no hablar que no cargar algunos tipos de imagen como imágenes PNG. Abría que investigar un poco el tema, ahora mismo no se me ocurre nada al respeto para solucionarlo. Aquí tienes la explicación, realmente no es un problema del Picture si no de VB6: http://www.cyberactivex.com/UnicodeTutorialVb.htmAunque Visual Basic 6.0 almacena cadenas internamente como Unicode (UTF-16), tiene varias limitaciones:
- Se envía con controles solo ANSI (Etiqueta, Cuadro de texto, etc.). - La ventana de propiedades en IDE es solo ANSI. Las cadenas Unicode se muestran como '????' - PropertyBag convierte automáticamente cadenas Unicode a ANSI. - Las funciones del portapapeles son solo ANSI. - Los menús son solo ANSI.
|
|
« Última modificación: 5 Febrero 2020, 20:18 pm por FJDA »
|
En línea
|
|
|
|
Serapis
|
...Yo utilizaba para ver la comparación un PictureBox, que sería más logico utilizar, pero este control tiene muchos problemas de errores al cargar ciertas imágenes con nombres muy raros, como estos ejemplos que son reales:
!B,wfDHgBGk~$(KGrHgoOKj!EjlLmZDmvBKs6y)CFe!~~_3.jpg 鋼拉絲Steel Brushed Stainless.jpg MATI BELEN, COVA Y ROSANA, CON ADRIANA, Y JOSE ANTONIO.jpg
Ninguno de estos archivos los carga PictureBox sin dar error, y por supuesto no los visualiza. Y además no puedo evitar ni sortear el error, si se produce, sin que se cierre el programa.
Bueno, en efecto, VB6 no se las lleva bien cuando en un nombre se colocan caracteres ANSI y UNICODE... Lo cual no quiere decir que no tenga solución. Te pongo un código de ejemplo que soluciona el caso, mediante una simple API... Y luego una imagen... nota que la imagen es una captura de tu mensaje, pero el nombre d ela imagen es el mismo que tu tienes ahí arriba y nota como la imagen se carga perfectamente con este modo... Private Const INVALID_HANDLE_VALUE As Long = -1 Private Const MAX_PATH As Long = 260 Private Const SHORT_PATH As Long = 14 Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Private Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * SHORT_PATH End Type Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long ' Código dle botón que carga la imagen: Private Sub Command1_Click() Dim Ruta As String cdlg.ShowOpen ' Cdlg, es un control CommonDialog... If (Len(cdlg.FileName) > 0) Then Ruta = ResuelveRuta(cdlg.FileName) if (len(ruta)>0) then Set Picture1.Picture = LoadPicture(Ruta) end if End If End Sub ' Función que resuelve el problema de los nombres con caracteres Unicode dentro del nombre... Private Function ResuelveRuta(ByVal Ruta As String) As String Dim j As Long, k As Long, WFD As WIN32_FIND_DATA j = FindFirstFile(Ruta, WFD) If (j <> INVALID_HANDLE_VALUE) Then k = InStrRev(Ruta, "\") If (Left$(WFD.cAlternate, 1) <> Chr(0)) Then ResuelveRuta = Left$(Ruta, k) & WFD.cAlternate Else ResuelveRuta = Left$(Ruta, k) & WFD.cFileName End If Else ResuelveRuta = "" End If End Function Private Sub Form_Load() cdlg.InitDir = App.Path End Sub
Otros problemas que tengas con los picturebox, se pueden ir viendo, si describes el problema en cuestión.
|
|
« Última modificación: 6 Febrero 2020, 02:50 am por NEBIRE »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
¿Alguien sabe como descifrar esto?
Criptografía
|
Tzdah
|
6
|
5,996
|
7 Febrero 2013, 05:26 am
por Tzdah
|
|
|
Alguien sabe como se llama esto¿?
PHP
|
Roboto
|
8
|
3,665
|
25 Marzo 2013, 17:10 pm
por 1mpuls0
|
|
|
Alguien sabe como ocultar esto?
Dudas Generales
|
Leandro3562
|
2
|
2,747
|
11 Diciembre 2015, 19:21 pm
por Leandro3562
|
|
|
Saben como puedo conseguir esto?
« 1 2 »
Foro Libre
|
Panic0
|
11
|
5,182
|
13 Febrero 2021, 11:59 am
por Machacador
|
|
|
Alguien sabe como hacer esto con for??
Programación C/C++
|
Julia13
|
3
|
3,170
|
14 Mayo 2021, 20:51 pm
por engel lex
|
|