C# は HWindowControl にいくつかの便利な関数を実装します - (画像のズームとドラッグ)

C# は HWindowControl にいくつかの便利な関数を実装します - (画像のズームとドラッグ)


1.Hwindowフォームに表示される部分について

まず、HWindowControl コントロールのサイズは固定されており、この固定サイズでは、最初に表示されていた完全な画像と比較して、拡大効果を実現するために画像の一部のみが表示されます。
つまり、拡大したい場合はImagePartを縮小し、縮小したい場合はImagePartを拡大します。
例: 800 600 の画像の場合、
最初は ImagePart を左上隅 (0, 0)、右下隅 (800
600) に設定しましたが、
今は左上隅 (0, 0)、下隅に設定します。右隅 (400、300) では、
画像全体を使用して HWindowControl コントロールを埋める前に、今度は画像の半分を使用してそれを埋めると、明らかに画像のこの部分が拡大されます。倍率は2倍です。
そして
今度は、左上隅 (100, 100)、右下隅 (500, 400) に設定します。
これは、画像を左上隅にドラッグするのと同じです。
パーツの設定に必要なパラメータは、長方形の左上隅と右下隅の座標値、または左上隅と長さと幅の値です。

2. マウス中心のズーム

ズームできるようになったので、マウスの現在位置を中心にしてズームする方法を見てみましょう。
マウスの中心位置を確実にするには、マウスがポイントする画像の相対位置が変わらないことを確認してください。
ここに画像の説明を挿入します
図にあるように、黒いボックスが元の画像で、
画像を拡大したい場合(元の画像を小さくして、HWindowControl ウィンドウに均等に埋め込む)は赤色に変換し、縮小したい場合は赤色に変換します
。画像 (元の画像を大きくし、それを HWindowControl ウィンドウに比例して圧縮します)、青に変換されるはずです。
赤い点は、HWindowControl フォーム コントロール内のマウスの座標です。

元の画像を LUPointX、LUPointY として表示したときの部分を取得できます。
取得したマウスの座標は MouseX、MouseY、
拡大率 Zoom は 0.5、
赤い四角形の左上隅の座標は次のようになります。

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

ここで、画像の座標は上から下、左から右に増加することに注意してください。
右下隅の座標もあります。

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

この時点で、part 属性を通じて表示領域を設定できます。
完全なコードは次のとおりです。

HWindowControl の HMouseWheel に次のイベントをバインドする必要があります

        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. 画像をマウスでドラッグして移動します

移動は比較的単純で、
まず左ボタンを押したときのマウス座標位置(startPointX, startPointY)を記録し、
マウスの左ボタンを放したときの座標位置(endPointX, endPointY)から
x軸の補間move_c, move_rを求めることができます。方向と y 方向;
次に、
移動後の左上隅の座標は (originalImageUL_c + move_c,originalImageUL_r + move_r)
移動後の右下隅の座標は (originalImageDR_c + move_c,originalImageDR_r +移動_r)

完全なコードは次のとおりです。

        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);
        }

ソース コードが高速に動作する場合、高いリフレッシュ レートにより画像がちらつく場合があります。ちらつきの問題を効果的に解決するには、HWindow_MoveImage 関数の hWindow.HalconWindow.ClearWindow(); 関数の前後に次の変更を加えます。

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

おすすめ

転載: blog.csdn.net/qq_42504097/article/details/129231042