Título: Alguien sabe como conseguir esto Publicado por: Fran1946 en 4 Febrero 2020, 13:39 pm (https://i.postimg.cc/3xnLdz2z/Classname-Explorer.jpg) (https://postimages.org/)
Hola a todos; Estoy haciendo un programa que carga imágenes, las salva en una carpeta, y luego las procesa. Después visualiza, utilizando el Visualizador de fotos de Windows, las originales y las procesadas para poder compararlas, conmutando las 2 imágenes pulsando los botones 3 o 5, en la imagen del Visualizador de fotos de Windows, o pulsando las teclas Dcha o Izq del teclado. Pero hay que cerrar las ventanas que enumero mas abajo, para que el usuario no pueda utilizar los menúes, ni los botones 1, 2, 4, 6, 7 y 8 de la imagen. Se como obtener los Hwnd de las ventanas del Visualizador de fotos de Windows de estas clases, que se ven en la imagen: photos_navigationpane photos_navigationbar photos_commandbar photos_buttonex Pero dentro de la ventana photos_buttonex (color naranja en la imagen) Hay 8 button numerados del 1 al 8 en la imagen, que en realidad tambien son ventanas, por que tienen Hwnd cada uno. Y necesito obtener el Hwnd de cada uno, y no veo la forma de hacerlo. Por que con el código que utilizo para obtener los Hwnd de las clases(ventanas) photos_navigationpane, photos_navigationbar, photos_commandbar, y photos_buttonex, no me sirve por que no detecta los 8 botones. El código es este: Código: Public Sub EnumChildProc(ByVal hWnd As Long) Pero con un timer y este código: Código: 'Obtiene la coordenada del Mouse Al pasar el cursor del ratón encima del área de los botones 1, 2, 4, 6, 7 y 8, se cierran, por que solo de esta forma consigo obtener los Hwnd de cada uno, en la variable Handle del código. Alguien sabe como conseguir los Hwnd de los botones 1, 2, 4, 6, 7 y 8 con código, sin tener que pasar el cursor del ratón encima de cada uno. Y en el caso de que no se pueda o nadie lo sepa: Alguien puede sugerirme el código para que el programa ponga el cursor del ratón encima del centro de cada uno de estos botones del Visualizador de fotos de Windows(tengo las coordenadas X,Y de cada uno), para poder obtener el Handle, y así poder cerrarlos con Call SendMessage(Handle,WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) Por que no he conseguido nada que funcione. Espero que me podáis ayudar a conseguirlo. Gracias y un saludo. Título: Re: Alguien sabe como conseguir esto Publicado por: fary en 4 Febrero 2020, 14:23 pm Subclassing?
Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 5 Febrero 2020, 02:21 am hola
has tenido suerte porque hace, no si más de diez años que no toco VB. El caso es que me he puesto a ayudar a un compañero y recién he instalado vB6 y he hecho un programa con él. No puedes encontrar en handle (hwnd) porque tienes que obtenerlo de forma descendente, primero el padre que es la ventana, luego el panel que contiene el objeto, luego el objeto y luego sus botones y todo a partir del primero. Es decir con el primero obtienes el segundo, con el segundo el tercero, con el tercero el cuarto. Código
luego a partir de Photos_ButtonEx debes buscar el siguiente porque Photos_ButtonEx es el classname de todos los botones Había otra manera para conseguir todos los handles de una ventan pero no me acuerdo, voy a ver si tengo algún snippet por ahí Otra cosa, no necesitas ese código del timer para ver los handles, VB6 viene tine SPY++ con el que puedes encontrar los handles e información de las ventanas e hijos. Deberías ver una acceso directo en el menú incio\programas, en"Herramientas de Microsoft Visual Studio 6.0" y si no en "C:\Program Files\Microsoft Visual Studio\Common\Tools\SPYXX.EXE" (https://i.stack.imgur.com/XP6lu.png) (http://) y te digo otra cosa, no te lo puedo asegurar pero creo que si importas los botones por separado no te van a hacer nada, ya me contarás. Título: Re: Alguien sabe como conseguir esto Publicado por: @XSStringManolo en 5 Febrero 2020, 03:00 am Para comparar las imágenes puedes usar ImageMagik para vb.net, he visto por ahí códigos simples de 20 líneas que lo hacen. También hay apis online a las que les envías las imágenes y te devuelven el resultado de la comparación.
Título: Re: Alguien sabe como conseguir esto Publicado por: Serapis en 5 Febrero 2020, 03:24 am ...Después visualiza, utilizando el Visualizador de fotos de Windows, las originales y las procesadas para poder compararlas... Me temo que estás cazando moscas a cañonazos...Define adecuadamente eso de: "...procesarlas para compararlas..." Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 5 Febrero 2020, 09:34 am Me temo que estás cazando moscas a cañonazos... Define adecuadamente eso de: "...procesarlas para compararlas..." yo entiendo que se refiere con procesarlas a editarlas, cambiar brillo, contraste y estas cosas, puede que incluso el formato o compresión. Después compara una imagen "procesada" con otra original que no ha recibido cambios. ¿para qué? pues él sabrá. de momento a mi eso me parece irrelevante, me he limitado a centrarme en el tema de la programación, ¿quiere obtener el handle de los botones pero no los consigue? pues ahí está, aunque recuerdo un código que tenía que lo hacía de forma escalonada hasta obtener todos los handles y classname de una ventana, pero no lo encuentro, eran como 6 u 8 líneas y lo hacía. Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 5 Febrero 2020, 12:07 pm Hola FJDA:
;-) ;-) ;-) Tienes razón he tenido mucha suerte con tu respuesta. Es excelente, exactamente lo que necesitaba saber. Y también por SPY++ , nunca lo había utilizado. Pero tengo una duda, que te explico. Este es el árbol, he añadido las clases que tu no mencionas. 'Orden de padre a hijos '1.Photo_Lightweight_Viewer '-----Photos_commandbar '-----Photos_photocanvas Este handle no lo necesito '-----Photos_NavigationPane '---------Photos_NavigationBar '--------------Photos_ButtonEx Yo supongo que de la ventana padre '1.Photo_Lightweight_Viewer' ... sale estas 3: Photos_commandbar este handle no se como conseguirlo, con tu código Photos_photocanvas Este handle no lo necesito, es la imagen Photos_NavigationPane, este y sus hijos está claro Me podrías decir como conseguir Photos_commandbar, por que esta ventana alberga los menúes que no puede utilizar el usuario, y esta ventana el programa tiene que cerrarla. Muchísimas gracias por tu ayuda. Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 5 Febrero 2020, 12:14 pm yo entiendo que se refiere con procesarlas a editarlas, cambiar brillo, contraste y estas cosas, puede que incluso el formato o compresión. Después compara una imagen "procesada" con otra original que no ha recibido cambios. ¿para qué? pues él sabrá. Una vez más has acertado, hago un proceso bastante complicado, que es irrelevante. Y por cierto NEBIRE, yo no mato moscas a cañonazos, mi pregunta está muy clara, al menos para FJDA. Título: Re: Alguien sabe como conseguir esto Publicado por: Serapis en 5 Febrero 2020, 14:19 pm Pués si, matas moscas a cañonazos.... te guste o no aceptarlo.
Querer controlar mediante programación la interfaz de usuario de otra aplicación, es matar moscas a cañonazos. La interfaz de usuario, como su nombre indica está pensada para ser utilizada por personas... para aplicaciones hay multitud de librerías que permiten invocar su funcionalidad, para hacer lo que pretendas hacer (modificar brillo, contraste, saturación, girar imagen, etc...), con sus respectivos parámetros... sin complicaciones estúpidas que uno se impone como una barrera... Entiendo que uno no quiera implementar determinada funcionalidad, porque o bien no sabe como hacerlo o bien no quiere perder demasiado tiempo en hacerlo, pero perderlo en pretender controlar la interfaz de otro programa además tan limitado... es lo que es. 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... Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 5 Febrero 2020, 15:20 pm 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í: Código: Photo_Lightweight_Viewer Entonces, Photo_Lightweight_Viewer tiene cuatro hijos que son Photos_CommandBar, Photos_PhotoCanvas, ATL:568ED690 (no se lo que es) y Photos_NavigationPane Con 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 Código: hPhoto_Lightweight_Viewer = FindWindow("Photo_Lightweight_Viewer", TITULODELAVENTANA) y después uno de sus hijos que en este caso te interesa Photos_CommandBar Código: hPhotos_commandbar = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_commandbar", vbNullString) Demostración: Código
Por si te sirve te dejo este código para ajustar colores (brillo, contraste, escala de grises, etc) https://mega.nz/#!fBlyUCpQ!Kemdm1iZ52dScMcYy6cfak2VzEV4jZ8pBlByvkrLK_0 (https://mega.nz/#!fBlyUCpQ!Kemdm1iZ52dScMcYy6cfak2VzEV4jZ8pBlByvkrLK_0) demostración: (https://i.postimg.cc/B6n9Qx3r/Demo-Set-Color-Adjustment.jpg) Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 5 Febrero 2020, 17:14 pm 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. Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 5 Febrero 2020, 17:35 pm 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í: Código: Photo_Lightweight_Viewer Entonces, Photo_Lightweight_Viewer tiene cuatro hijos que son Photos_CommandBar, Photos_PhotoCanvas, ATL:568ED690 (no se lo que es) y Photos_NavigationPane Con 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 Código: hPhoto_Lightweight_Viewer = FindWindow("Photo_Lightweight_Viewer", TITULODELAVENTANA) y después uno de sus hijos que en este caso te interesa Photos_CommandBar Código: hPhotos_commandbar = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_commandbar", vbNullString) Demostración: Código
Por si te sirve te dejo este código para ajustar colores (brillo, contraste, escala de grises, etc) https://mega.nz/#!fBlyUCpQ!Kemdm1iZ52dScMcYy6cfak2VzEV4jZ8pBlByvkrLK_0 (https://mega.nz/#!fBlyUCpQ!Kemdm1iZ52dScMcYy6cfak2VzEV4jZ8pBlByvkrLK_0) demostración: (https://i.postimg.cc/B6n9Qx3r/Demo-Set-Color-Adjustment.jpg) 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. Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 5 Febrero 2020, 17:48 pm 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 Código
Y como todos estos hijos: :huh: pues no se que habrás hecho :xD- 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 Usa ShowWindow y el comando HIDE_WINDOW = 0. Si lo has usado no funciona es que no lo harás bien digo yo. miratelo Código
(https://i.postimg.cc/Rh5F0bWq/demobuttons.gif) Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 5 Febrero 2020, 18:54 pm usa un do While Código
Hola de nuevo: Si yo tengo algo parecido, esto: Código: Public Function EjecutaShell(file As String) As Boolean 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 (https://i.postimg.cc/W4QwZ7PZ/Menu.jpg) (https://postimages.org/) Se puede hacer?. Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 5 Febrero 2020, 18:57 pm pues tengo una ligera idea de que quizás si se pueda. Espera a que pruebe.
Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 5 Febrero 2020, 19:20 pm 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. Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 5 Febrero 2020, 19:22 pm 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)
Código
Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 5 Febrero 2020, 19:43 pm 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. Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 5 Febrero 2020, 20:06 pm 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.htm Cita de: http://www.cyberactivex.com/UnicodeTutorialVb.htm Aunque 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. Título: Re: Alguien sabe como conseguir esto Publicado por: Serapis en 6 Febrero 2020, 02:48 am ...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: Bueno, en efecto, VB6 no se las lleva bien cuando en un nombre se colocan caracteres ANSI y UNICODE...!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. 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... Código
(https://i.imgur.com/QKsFApT.png) Otros problemas que tengas con los picturebox, se pueden ir viendo, si describes el problema en cuestión. Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 6 Febrero 2020, 10:42 am Citar 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 de la imagen es el mismo que tu tienes ahí arriba y nota como la imagen se carga perfectamente con este modo... Otros problemas que tengas con los picturebox, se pueden ir viendo, si describes el problema en cuestión. Hola NEBIRE: Gracias por tu ayuda. Efectivamente este código soluciona el problema. Y esto me sugiere que podría volver a utilizar un PictureBox como visor... Pero necesito un código para poder hacer zoom con la rueda del ratón, y poder mover la imagen con zoom pulsando el botón Iqdo del ratón y mover. Tengo código para mover imagen pero con scroll H-V, y esto no me gusta nada, es muy limitado e incómodo. Y tengo código de Lupa pero en una ventana externa, no ampliando imagen en el Picture. Puedes ayudarme en esto, sería perfecto. Por que con esta solución solucionaría el problema de que el usuario pueda pulsar botón dcho y acceder a los menues que permiten hacer lo mismo que yo inhabilito. Por que la solución que me dio FJDA de inhabilitar la ventana de la imagen Código: Call EnableWindow(hPhotos_PhotoCanvas, vbFalse) Funciona, pero inutiliza poder hacer zoom y mover la imagen, es lógico, pero esto no me sirve. Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 6 Febrero 2020, 10:44 am 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) Pues lo siento pero inutiliza poder hacer zoom y mover la imagen, es lógico, pero esto no me sirve. Gracias. Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 6 Febrero 2020, 11:07 am Escribe "mouse wheel picturebox vb6" en google.
Acostúmbrate a buscar info en inglés porque la mayoría de las cosas están en inglés https://www.recursosvisualbasic.com.ar/htm/listado-api/215-usar-rueda-del-mouse-en-flexgrid-datagrid.htm (https://www.recursosvisualbasic.com.ar/htm/listado-api/215-usar-rueda-del-mouse-en-flexgrid-datagrid.htm) Mírate la sección: "Ejemplo 4 - Ejemplo para usar la rueda del mouse en controles Scrollbar" puedes descargar el código en la página (https://www.recursosvisualbasic.com.ar/htm/listado-api/img/usar-rueda-de-mouse-en-scrollbar-2.jpg) Nota: No te va a hacer zoom pero cambiando los parámentros puedes hacer que te haga zoom. En cualquier buscador puedes encontrar un buen montón de ejemplos, es una de las cosas más demandadas, por principiantes; hacer zoom, redimiensonar, mover el scrolll, voltear, usar el wheel etc. Aquí tienes para el zoom https://www.recursosvisualbasic.com.ar/htm/listado-api/71-zoom-imagen-stretchbit.htm (https://www.recursosvisualbasic.com.ar/htm/listado-api/71-zoom-imagen-stretchbit.htm) (https://www.recursosvisualbasic.com.ar/htm/listado-api/img/zoom-imagen.gif) mas cosas aquí como hacer una lupa Código
https://mega.nz/#!6N0lAQDJ!dkAZKkUnQxmX9xS7ZF6Kz-fnQdb1O1-TES9kaB3w9so (https://i.postimg.cc/gjPfVGTh/demolupa.gif) 62 - Redimensionar imágenes en un PictureBox al estilo Vista previa de imagen (https://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/62.htm) (https://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/imagenes/thumbnail-imagen-en-picturebox.gif) En este enlace un buen montón de códigos para tratamiento de imágenes. https://onedrive.live.com/?authkey=%21AGLMrn20g0JGtX0&id=C9DBA2BC5A16373B%21115&cid=C9DBA2BC5A16373B (https://onedrive.live.com/?authkey=%21AGLMrn20g0JGtX0&id=C9DBA2BC5A16373B%21115&cid=C9DBA2BC5A16373B) Título: Re: Alguien sabe como conseguir esto Publicado por: Serapis en 6 Febrero 2020, 16:30 pm ...Efectivamente este código soluciona el problema. Y esto me sugiere que podría volver a utilizar un PictureBox como visor... Pero necesito un código para poder hacer zoom con la rueda del ratón, y poder mover la imagen con zoom pulsando el botón Iqdo del ratón y mover. Y tengo código de Lupa pero en una ventana externa, no ampliando imagen en el Picture. Puedes ayudarme en esto, sería perfecto. Vayamos por partes... Para el zoom, basta una lupa... He desempolvado un viejo control de usuario, le he retirado cosas que lo harían complicado (otros controles que no vienen al caso), hasta dejarlo en su más simple expresión... y puesto en un proyecto de prueba, para que trastees las propiedades y veas que tal va y si te satisface así. (nota que el proyecto a falta de conocer donde tienes imágenes las toma de %windir% \web\wallpaper\*.jpg tu podrías suplirlo con una ruta alternativa si te place o no tienes localizada dicha ruta) Las propiedades básicamente son: - Aumento: 0'04 hasta 4'00 (admite dos decimales). - AnchoExplora: Píxeles de ancho captura - AltoExplora: Píxeles de alto que captura (las medidas de la lupa resultan de la multiplicación de estos valores por el zoom). - ModoRastreo: Normal/Invertido (invertido es en negativo). El resto de funcionalidad ya la ves sobre el propio proyecto.... Basta una lupa para múltiples ventanas, si fuera el caso. Se incluye un segundo form, sin controles que 'toma prestado la lupa' del primario, para examinar el asunto. Descarga del control y el proyecto de prueba: https://workupload.com/file/8jaeBw22 Y una simple captura de pantalla (dado que la lupa si no se mueve en una imagen estática puede pasar desapercibida, he activado el modo inverso, antes de hace rla captura): (https://i.imgur.com/QdsgNMp.png) Si no termina de gustarte, hay muchas lupas por la red que puedas probar y usar... seguramente en foros como: -www.planet-source-code.com -www.vbforums.com -www.freevbcode.com -forums.codeguru.com -www.recursosvisualbasic.com.ar -www.vb-helper.com -etc, etc... Solventa lo de la lupa, y luego expones el siguiente problema que tengas... Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 6 Febrero 2020, 19:43 pm (https://i.postimg.cc/zGzkb4kR/No-vale.jpg) (https://postimages.org/)
(https://i.postimg.cc/SsC9tGrh/Raros.jpg) (https://postimages.org/) Hola NEBIRE: Pues yo da daba por supuesto que el código que me pasaste, solucionaba el asunto de los nombres raros, pero como yo parece que tengo archivos jpg con nombres que nadie tiene, pues las pruebas hasta ahora me reconocía todos, pues recorriendo las carpetas escaneadas por el programa, me encuentro una que no tiene archivos jpg, pero si los tiene, solo que el programa al encontrarlos (son 3) no los añade a la lista dcha azul, por que los nombres no son válidos, tu código devuelve "" vacío. Pero estos 3 jpg se visualizan perfectamente en el visor de Win clicados en su carpeta. Mira las imágenes del programa y de la ruta de los 3 archivos. Estos nombre son estos: Výstřižek1.JPG Výstřižek3.JPG Výstřižek4l.JPG Y nombres chinos si los acepta, no lo entiendo. Posiblemente me encuentre otros, es muy dificil chequearlso todos, tengo mas de 65000 imágenes jpg a procesar. Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 6 Febrero 2020, 19:46 pm Gracias tengo un código de lupa que usaba con el Picture, pero este me gusta, creo que es el mismo que me ha pasado FJDA
Título: Re: Alguien sabe como conseguir esto Publicado por: Serapis en 7 Febrero 2020, 01:14 am OK... les hecho un vistazo a esos nombres parecen caracteres cirílicos...
He notado también que hay ficheros que pueden tener uno o más null al final del mismo, y si aparece al final, no los retira, ya que VB considera los BString que acaban en null, no considera el último en tanto sea 1 byte por carácter (ANSI)... así que aprovecho de darle un repaso ambos casos. La lupa que he subido es totalmente hecho por mí, y salvo a mi sobrino que fue quien me lo pidió hace 10 o 12 años, no recuerdo haberlo compartido antes, luego debe tratarse de otra lupa distinta. De todos modos son códigos muy sencillos, pués básicamente son APIs BitBlt, copiando y pegando constantemente... pero que requiere sus líneas de código y no es plan copiar y pegar en cada proyecto... Los controles de usuario resultan cómodos, porque una vez los compilas, los registras y usas y reutilizas donde haga falta con pocas líneas... Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 7 Febrero 2020, 09:54 am La lupa que he subido es totalmente hecho por mí, y salvo a mi sobrino que fue quien me lo pidió hace 10 o 12 años, no recuerdo haberlo compartido antes, luego debe tratarse de otra lupa distinta. aaah amigo tienes razón no son la misma lupa, la mía le da mil vueltas a la tuya :xDTítulo: Re: Alguien sabe como conseguir esto Publicado por: Serapis en 7 Febrero 2020, 18:03 pm Mira las imágenes del programa y de la ruta de los 3 archivos. Esa r, definitivamente es un carácter checo...Estos nombre son estos: Výstřižek1.JPG Výstřižek3.JPG Výstřižek4l.JPG Y nombres chinos si los acepta, no lo entiendo. Tienen solución, básicamente es la misma presentada... solicitar el 'shortname' del fichero, esto es, los antiguos nombres MS-DOS: "8.3" Piensa que el modo de solventar problemas con caracteres es dejarlos aparte en lo posible y hacer referencia ello con algo ajeno a los caracteres explícitos, por ejemplo: un handle (una dirección de memoria), un índice en un array... así el contenido de dicho string, puede ser lo que sea, mientras no se 'toque' no hay conversión (errónea por truncamiento), que luego falle su referencia en una búsqueda posterior. Aún así he crerado una función que analiza los caracteres aún siendo disitntos en origen... es complicado explicar por qué funciona sin tener una base profunda del fundamento de los caracteres, codificación, la plataforma y el lenguaje de programación usado... de hecho mucha gente habrá tratado múltiples ideas y modificaciones sin resultados. ...pero como digo tiene solución, el caso previo se puede alojar en el nuevo sin distinción de cual de ellos se da, son pocas líneas más de código, sin embargo como dices que tienes varios miles de imágenes en la carpeta, no es muy eficiente que cada vez que se localice un fichero con un nombre así, deba recorrerse todo un array para tomar su shortname (el 8.3). Esto exige 3 cosas... La primera repensarlo todo y rehacer una especie de 'fileCommonDialog' que al leer el contenido de una carpeta, tome el array de dichos ficheros, así luego puede referenciarse el mismo por su índice en el array... La segunda cuestión es que dado que esos nombres 'raros', ralentizan innecesariamente su procesado una y otra vez, lo ideal es que cada vez que localice uno, lo renombre ... si lleva caracteres del 'primer tipo', eliminandolos, si lleva caracteres Unicode 'del segundo tipo', truncarlos, lógicamente antes de ese renombrado se debería comprobar si el nombre a asignar existe ya o no, para decidir otro si ese está ocupado y que no falle el renombrado. Y por supuesto dicho renombrado sería un parámetro opcional. Aunque pueda parecer no necesario, ese renombrado posibilitaría que otros programas que tuvieren problemas con tales ficheros en tu equipo quedara resuelto (hacelro manulamente cuando son muchos es tedioso, claro). Y también habría que considerar que no todos los ficheros deben ser renombrables, los de librerías y aplicaciones podrían inutilizar la aplicación de la que son parte, por lo que debería limitarse a los 'documentos de usuarios' y eso cada uno sabe cuales son conforme a las carpetas que los mantiene en su equipo. En fin crear un fileCommonDialog, son algo más que 4 líneas, y se sale un poco del tiempo que uno puede dedicar a ayudar a otros (otra cosa es cuando ya tienes uno montado de tiempo atrás)... Si no te basta con la solución que te aporto a continación, pués con dicho código y el resto demis comentarios, tú mismo podrías montarte un FileCommonDialog para la ocasión... la clave para lograr todo esto es recurrir a al objeto FileSystemObject... que hay que añadirlo al proyecto como una referencia: Y ahora el código: (nota que excepto la función del mismo nombre el resto es añadido (a lo que ya te dí), la función 'ResuelveRuta' remplaza a la existente)... Código
...puedes tirar con esto, o basarte en esto y mis comentarios previos para montarte tú mismo un FileCommonDialog, que use precisamente el FilesystemObject como el eje de la solución... de todos modos aún con miles de ficheros en una carpeta, con la potencia d elos equipos de hoy, no debería notarse lentitud apreciable en el tratamiento, aunque claramente ese bucle es preferible que se hicera una única vez (cuando se accede a la carpeta y no con cada fichero que tenga caracteres Unicode del 'segundo tipo'... Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 7 Febrero 2020, 18:51 pm está bien como investigación y creo que muchísisma gente ya ha intentado algún hack para que VB6 no pase de Unicode a ANSI, como trabajar con bytes para evitar la conversión. Pero ¿no sería mejor que renombraras por lotes los archivos JPG que tienes? Si esas fotos son de porno o algo así, hay programas de terceros como XnView (gratuito) con el que puedes renombrar por lotes.
En cuanto a lo del ratón que no puedes ampliar y eso, tendrías que hacer Hook a la ventana de la imagen, a la ventana Photos_PhotoCanvas y bloquear el mensaje de pulsación del ratón con el botón derecho, o inhabilitar el botón en esa ventana. Pero para eso hay que usar mucha API, y me llevaría un rato, la verdad no tengo ganas. https://www.recursosvisualbasic.com.ar/htm/listado-api/217-subclasificar-combobox-eventos-de-mouse.htm (https://www.recursosvisualbasic.com.ar/htm/listado-api/217-subclasificar-combobox-eventos-de-mouse.htm) http://www.vbforums.com/showthread.php?677868-RESOLVED-VB6-about-Hook-windows-api-procedure (http://www.vbforums.com/showthread.php?677868-RESOLVED-VB6-about-Hook-windows-api-procedure) Parece que ya sabes programar así que no te vamos a hacer todo el trabajo, investiga un poco. Otra cosa es que pongas un código y digas, esto no me funciona o me da error aquí y no se por qué. Saludos edito: y añado en mi caso, que no soy programador y me refiero que no me dedico a ello, solo pasaba por aquí vi tu pregunta y te contesté gustosamente. Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 13 Febrero 2020, 19:19 pm He tardado un poco en responder por que he estado estudiando y probando el código que me habéis suministrado.
Ante todo muchísimas gracias, por vuestra ayuda. NEBIRE: El código nuevo (ampliado) tampoco funciona con los malditos nombres raros, pero el anterior si funciona para nombres chinos y alguno mas, así que utilizo este, y en los casos de archivos que no los pueda reconocer, pues simplemente no los añade a la lista, en mi caso solo tengo esos 3 archivos que son checos. FJDA: La opción que sugieres de renombrar archivos es inviable, tienen que conservar sus nombres originales, por que algunas imágenes jpg se utilizan en alguna aplicación y si cambian el nombre las consecuencias pueden ser desastrosas. Ya tengo todo resuelto excepto este código que pongo aquí (Solo hay una línea de código que no consigo que funcione), y es la que tiene este comentario: 'Aquí necesito obtener Hwnd de los MenuID, para añadirlos a List1 El código: Código: Private Sub Command1_Click() Espero que esto sea muy fácil para vosotros. Gracias. (https://i.postimg.cc/BnjFBsBd/image.jpg) (https://postimages.org/) Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 14 Febrero 2020, 17:19 pm 'Aquí necesito obtener Hwnd de cada MenuID, para añadirlos a un ListBox No te lo puedo asegurar pero los submenus si es a lo que te refieres no tiene handle. Para diregirte a ellos usa MenuID tal como has hecho. Este código rastrea todos los menús y submenus, es similar al tuyo. Pero tal como muestro la información te quedará más claro.En un nuevo proyecto, crea 4 listbox tal como lo pusistes y un botón y pega este código. Código
Puedes usar GetMenuItemInfo par obtener información de menús, por ejemplo si están checkeados e igualmente los nombres, por ejemplo. Pero hSubMenu siempre te devolverá 0 si no me equivoco. Código
Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 14 Febrero 2020, 19:53 pm Muy bueno este código, este es para mi colección seguro que lo utilizaré.
Te he mandado un mensaje. Lo que necesito hacer es que queden inaccesibles todos los menúes, y lo he conseguido así: Código: Private Sub Command1_Click() Seguramente tu tienes una solución mejor, pero esta funciona perfecto. Un saludo. Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 14 Febrero 2020, 20:45 pm Muy bueno este código, este es para mi colección seguro que lo utilizaré. ¿inaccesibles pero operativos o solo inaccesibles?Te he mandado un mensaje. Lo que necesito hacer es que queden inaccesibles todos los menúes, y lo he conseguido así: --- Puedes usar esta función la función API RemoveMenu: Código: Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long Código
Código
EJEMPLO: Código
Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 14 Febrero 2020, 22:33 pm Si tienen que ser no accesibles, pero operativos para el programa
Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 14 Febrero 2020, 22:36 pm Yo no utilizo DrawMenuBar, quiero que desaparezcan
Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 14 Febrero 2020, 22:52 pm Si tienen que ser no accesibles, pero operativos para el programa No te preocupes siguen estando operativos edito: Pero debes obtener el MenuID que quieres usar, meterlos en memoria en un array por ejemplo, porque una vez borrado no se puede obtener el ID. Mira prueba: Código
Título: Re: Alguien sabe como conseguir esto Publicado por: Fran1946 en 15 Febrero 2020, 12:47 pm Perfecto...
Se queda así: Código: Public Function EliminarMenu(ByVal hwndAPP As Long) Se ejecuta Ctr+E para que el cursor del mouse no tenga el icono del lápiz, que podría pintar y arruinar el proceso. Una vez mas, muchísimas gracias. Título: Re: Alguien sabe como conseguir esto Publicado por: FJDA en 15 Febrero 2020, 13:06 pm Perfecto... al final te sirvío :)Se queda así: Código: Public Function EliminarMenu(ByVal hwndAPP As Long) Se ejecuta Ctr+E para que el cursor del mouse no tenga el icono del lápiz, que podría pintar y arruinar el proceso. Una vez mas, muchísimas gracias. VB todavía no está muerto, bien por el foro que permita esta sección. ;-) Aunque la mayoría de preguntas sobre sql y base de datos, pero casi todas alguien las responde, aunque muchas con poca gana. También mucha gente se equivoca y hace preguntas sobre VB.NET, ya hay otra sección para eso. Ayudarte me ha servido para recordar como era esto de programar (pero venía rodado por ayudar a otro usuario antes que a tí que si no...) :xD |