C# implementa algunas funciones convenientes en HWindowControl: (hacer zoom y arrastrar imágenes)

C# implementa algunas funciones convenientes en HWindowControl: (hacer zoom y arrastrar imágenes)


1. Acerca de la parte que se muestra en el formulario Hwindow

En primer lugar, el tamaño del control HWindowControl es fijo. Cuando estamos en este tamaño fijo, en comparación con la imagen completa mostrada originalmente, ahora solo se muestra una parte de la imagen para lograr el efecto de ampliación.
Es decir, cuando queremos ampliar, reducimos ImagePart; cuando queremos reducir, ampliamos ImagePart.
Por ejemplo: para una imagen de 800 600,
inicialmente configuramos ImagePart en: esquina superior izquierda (0, 0), esquina inferior derecha (800
600);
ahora lo configuramos en: esquina superior izquierda (0, 0), inferior esquina derecha (400, 300),
antes usaba la imagen completa para llenar el control HWindowControl, ahora usa la mitad de la imagen para llenarla, obviamente esta parte de la imagen se ampliará. El factor de ampliación es 2.
Y
ahora lo configuramos en: esquina superior izquierda (100, 100), esquina inferior derecha (500, 400), lo que
equivale a arrastrar la imagen a la esquina superior izquierda.
Los parámetros que necesitamos para configurar la pieza son los valores de coordenadas de la esquina superior izquierda y la esquina inferior derecha del rectángulo, o la esquina superior izquierda y los valores de largo y ancho.

2. Zoom centrado en el mouse

Ahora que puede hacer zoom, veamos cómo hacer zoom con la posición actual del mouse como centro.
Para garantizar la posición central del mouse, asegúrese de que la posición relativa de la imagen apuntada por el mouse permanezca sin cambios.
inserte la descripción de la imagen aquí
Como se muestra en la figura, el cuadro negro es la imagen original. Cuando
queremos ampliar la imagen (hacer la imagen original más pequeña y luego llenarla proporcionalmente en la ventana HWindowControl), se debe transformar en rojo; cuando queremos
reducir la imagen (agrandar la imagen original) Luego comprímala proporcionalmente en la ventana HWindowControl), por lo que debería transformarse en azul.
El punto rojo es la coordenada del mouse en el control de formulario HWindowControl.

Podemos obtener la parte cuando la imagen original se muestra como LUPointX, LUPointY;
las coordenadas obtenidas del mouse son MouseX, MouseY;
la relación de ampliación Zoom es 0.5;
luego las coordenadas de la esquina superior izquierda del rectángulo rojo son:

				LUPointY2 = (MouseY - (Zoom * (MouseY - LUPointY))); 
                LUPointX2 = (MouseX - (Zoom * (MouseX - LUPointX)));

Tenga en cuenta aquí que las coordenadas de la imagen aumentan de arriba a abajo y de izquierda a derecha.
También están las coordenadas de la esquina inferior derecha:

                //Ht,Wt为原图像的右下角与左上角计算出来的长宽。
                RBPointY2 = LUPointY2 + (Ht * Zoom);
                RBPointX2 = LUPointX2 + (Wt * Zoom);

En este punto, puede configurar el área de visualización a través del atributo de pieza.
El código completo es el siguiente:

Debe vincular los siguientes eventos a HMouseWheel de HWindowControl

        public void Scale(object sender, HMouseEventArgs e) 
        {
    
    
            double Zoom = 0.5;//缩放比例
            HTuple MouseX, MouseY;//鼠标位于图片窗体的坐标
            //左上角与右下角坐标
            HTuple LUPointY, LUPointX, RBPointY, RBPointX;
            HTuple LUPointY2, LUPointX2, RBPointY2, RBPointX2;
            //当前显示的界面大小
            HTuple Ht, Wt;
            HTuple WindowID = hWindowControl1.HalconWindow;

            MouseX = e.X;
            MouseY = e.Y;
            Zoom = e.Delta > 0 ? Zoom : (1 + Zoom);
            HOperatorSet.GetPart(WindowID, out LUPointY, out LUPointX, out RBPointY, out RBPointX);
            Ht = RBPointY - LUPointY;
            Wt = RBPointX - LUPointX;

            if ((Ht * Wt) < 32000 * 32000)
            {
    
    
                LUPointY2 = (MouseY - (Zoom * (MouseY - LUPointY))); 
                LUPointX2 = (MouseX - (Zoom * (MouseX - LUPointX)));
                RBPointY2 = LUPointY2 + (Ht * Zoom);
                RBPointX2 = LUPointX2 + (Wt * Zoom);
                HOperatorSet.SetPart(WindowID, LUPointY2, LUPointX2, RBPointY2, RBPointX2);
                hWindowControl.HalconWindow.ClearWindow();
                hWindowControl.HalconWindow.DispObj(hImage);
            }
        }

3. Mueva la imagen arrastrándola con el mouse.

El movimiento es relativamente simple.
Primero, registramos la posición de las coordenadas del mouse (startPointX, startPointY) cuando se presiona el botón izquierdo. La
posición de las coordenadas (endPointX, endPointY) cuando se suelta el botón izquierdo del mouse
puede obtener la interpolación move_c, move_r en x dirección y dirección y;
Entonces podemos obtener:
las coordenadas de la esquina superior izquierda después del movimiento son: (originalImageUL_c + move_c, originalImageUL_r + move_r)
Las coordenadas de la esquina inferior derecha después del movimiento son: (originalImageDR_c + move_c, originalImageDR_r + agente de mudanzas)

El código completo es el siguiente:

        Point StartPoint = new Point();
        Point EndPoint = new Point();

        private void HMouseDown(object sender, HMouseEventArgs e) 
        {
    
    
            if (e.Button == MouseButtons.Left)
            {
    
    
                StartPoint.X = Convert.ToInt32(e.X);
                StartPoint.Y = Convert.ToInt32(e.Y);
                hWindowControl1.HMouseMove += HMouseMove;
            }
        }
        private void HMouseUp(object sender, HMouseEventArgs e)
        {
    
    
            hWindowControl1.HMouseMove -= HMouseMove;
        }

        private void HMouseMove(object sender, HMouseEventArgs e)
        {
    
    
            EndPoint.X = Convert.ToInt32(e.X);
            EndPoint.Y = Convert.ToInt32(e.Y);
            HWindow_MoveImage(StartPoint, EndPoint, hWindowControl1, hImage);
        }

        public void HWindow_MoveImage(Point startPoint, Point endPoint, HWindowControl hWindow, HImage hImage)
        {
    
    
            int originalImageUL_r;
            int originalImageUL_c;

            int originalImageDR_r;
            int originalImageDR_c;

            hWindow.HalconWindow.GetPart(out originalImageUL_r, out originalImageUL_c, out originalImageDR_r, out originalImageDR_c);

            int move_r = startPoint.Y - endPoint.Y;
            int move_c = startPoint.X - endPoint.X;

            hWindow.HalconWindow.SetPart(originalImageUL_r + move_r, originalImageUL_c + move_c, originalImageDR_r + move_r, originalImageDR_c + move_c);
            hWindow.HalconWindow.ClearWindow();
            hWindow.HalconWindow.DispObj(hImage);
        }

Cuando el código fuente se mueve rápidamente, la alta frecuencia de actualización puede provocar que la imagen parpadee. Realice los siguientes cambios antes y después de la función hWindow.HalconWindow.ClearWindow(); en la función HWindow_MoveImage para resolver eficazmente el problema del parpadeo.

                HOperatorSet.SetSystem("flush_graphic", "false");
                hWindow.HalconWindow.ClearWindow();
                HOperatorSet.SetSystem("flush_graphic", "true");

Supongo que te gusta

Origin blog.csdn.net/qq_42504097/article/details/129231042
Recomendado
Clasificación