Título: Crear control personalizado, para mostrar una regla con zoom y pan. Publicado por: Harold23 en 6 Julio 2017, 22:35 pm Hola, muy buenas tardes;
Estoy intentando crear un control personalizado en VS2017, que me permita mostrar una regla en los bordes superior e izquierdo con marcas de texto, basado en un sustema de unidades, sea milímetros o metros. He empeza tratando de crear los efectos ZOOM y PAN, dibujando un rectángulo de ejemplo, y funciona bien. Mi idea es obtener esto(obvien el rectángulo, que lo dibujé para probar el ZOOM y PAN, pero si las líneas de referencia del cursor): (https://social.msdn.microsoft.com/Forums/getfile/1095018) Para ello en VS he creado un proyecto de tipo UserControl, y el código que he usado es el siguiente: Código
El problema es que cuando INTENTO correr el control personalizado en el proyecto de creación, no me muestra las propiedades a mano derecha y empieza a parpadear. Sé que esto pasa por el evento Paint, pero pues no se conceptualmente como solucionarlo. (https://social.msdn.microsoft.com/Forums/getfile/1095016) De igual forma pasa, cuando intento usar el control en un proyecto de prueba, al agregarlo en el Form, se observa que parpadea, y cuando intento correr el Test, ni si quiera arranca. (https://social.msdn.microsoft.com/Forums/getfile/1095017) Podrían ayudarme a solucionar esto. Mi idea es crea posteriormente un control para dibujar con GDI+ con sobre él, y quiero es mostrar unas reglas en dicho control en unidades varias, hacer el zoom y el pan, éstos dos últimos que ya funcionan en el ejemplo que acabé de pasar. ¿Podrían guiarme para crear dicho control personalizado, de una forma correcta? Muchas gracias. MOD: Etiqueta GeSHi. Imagenes adaptadas a lo permitido. Título: Re: Crear control personalizado, para mostrar una regla con zoom y pan. Publicado por: Maurice_Lupin en 7 Julio 2017, 19:22 pm Hola, Harold23
No he probado tu código, puedo comentarte en cuanto al parpadeo, cuando pintas directamente el control es posible notar el pintado de píxeles (por eso se ve un feo parpadeo), para evitarlo se pinta en memoria primero y luego se vuelca esto en el método paint, se le llama la técnica del double buffer. Me parece que en vb.net es más sencillo, se puede habilitar. https://msdn.microsoft.com/es-es/library/3t7htc9c(v=vs.110).aspx Aquí un ejemplo completo, está en C# pero es casi lo mismo en vb.net https://www.codeproject.com/Articles/12870/Don-t-Flicker-Double-Buffer Saludos. Título: Re: Crear control personalizado, para mostrar una regla con zoom y pan. Publicado por: Eleкtro en 8 Julio 2017, 16:26 pm Citar El problema es que cuando INTENTO correr el control personalizado en el proyecto de creación, no me muestra las propiedades a mano derecha y empieza a parpadear. Sé que esto pasa por el evento Paint, pero pues no se conceptualmente como solucionarlo. Fíjate bien en lo que haces, cuando se dispara por primera vez el evento Control.Paint de tu UserControl, entras en un círculo vicioso volviendo a disparar el mismo evento una y otra vez como un búcle infinito, esto es por culpa de las llamadas que estás haciendo a Control.Invalidate() dentro del bloque de los métodos TransformarGraphics() y DrawLineReferencieMouse(), literálmente hablando estás colapsando la cola de mensajes del control/la aplicación/el diseñador de Visual Studio, todo. Para evitarlo sencillamente elimina las llamadas a Control.Invalidate(), a simple vista no parece ser realmente necesario, y en caso de necesitarlo pues simplemente crea una variable booleana que sirva como señal para determinar si el control necesita invalidación, de esta forma evitar entrar en ese "búcle infinito"... Código
...Tan solo te muestro cual sería una solución a ese tipo de problema, pero como ya he comentado no necesitas invalidar nada... al menos a simple vista. Ten en cuenta también la propiedad Component.DesignMode, mediante esta propiedad deberías evaluar si tu control está siendo usado en tiempo de diseño o en tiempo de ejecución para evitar operaciones de dibujado que resulten innecesarias... Código
Con respecto al flickering o parapadeo, bueno, las constantes e infinitas invalidaciones que haces sobre el control es lo que causa ese parpadeo, una vez lo hayas arreglado deberías dejar de sufrir más parpadeos, pero en general te diré que el doble búfer es tan solo una ayuda para reducir (que no eliminar) el flickering. No existe ninguna forma posible para erradicar por completo la posibilidad de producir flickering en WinForms/GDI/GDI+, cuanto más complejas sean las operaciones de dibujado, más alta será la probabilidad, es inevitable, aunque según en que escenario y si haces las cosas bien entonces se puede reducir el flickering hasta que parezca casi imperceptible; si eso te preocupa entonces lo más sensato que podrías hacer es migrar a la tecnología WPF, allí no tendrás ese problema. EDITO: Ah, por cierto... en tu código no estás liberando objetos administrados que internamente generan recursos no administrados (residuos), como por ejemplo las instancias de la clase Pen. Saludos! |