求助plus 如何实现 上下左右滑动 查看图片
By
niheibie
at 2023-08-06 • 0人收藏 • 1600人看过
这是一张1080 * 2280 的图片, 如何能上下左右滑动图片查看呢,各位大佬
13 个回复 | 最后更新于 2023-09-02
c#编写的, 可以拖动, 鼠标转滚轮放大和缩小的图片功能: 双击还原
等我有时间封装个dll给aar用.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp4 { public partial class Form1 : Form { public Form1() { InitializeComponent(); pictureBox1.MouseWheel += PictureBox1_MouseWheel; } bool isMouseDown = false; System.Drawing.Point p1 = new System.Drawing.Point(); System.Drawing.Point p2 = new System.Drawing.Point(); private void PictureBox1_MouseWheel(object sender, MouseEventArgs e) { int x = e.Location.X; int y = e.Location.Y; int ow = pictureBox1.Width; int oh = pictureBox1.Height; int VX, VY; //因缩放产生的位移矢量 int zoomStep = (pictureBox1.Width> pictureBox1.Height)? pictureBox1.Width/10: pictureBox1.Height / 10; if (e.Delta > 0) //放大 { //防止一直缩成负值 if (pictureBox1.Width > pictureBox1.Image.Width * 10) return; pictureBox1.Width += zoomStep; pictureBox1.Height += zoomStep; } if (e.Delta < 0) //缩小 { //防止一直缩成负值 if (pictureBox1.Width < pictureBox1.Image.Width / 10) return; pictureBox1.Width -= zoomStep; pictureBox1.Height -= zoomStep; } //第④步,求因缩放产生的位移,进行补偿,实现锚点缩放的效果 VX = (int)((double)x * (ow - pictureBox1.Width) / ow); VY = (int)((double)y * (oh - pictureBox1.Height) / oh); pictureBox1.Location = new Point(pictureBox1.Location.X + VX, pictureBox1.Location.Y + VY); } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { isMouseDown = true; p1 = PointToClient(Control.MousePosition);//记录鼠标坐标 p2 = pictureBox1.Location; //记录图片坐标 } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { isMouseDown = false; } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { //鼠标坐标的相对改变值 int a = PointToClient(Control.MousePosition).X - p1.X; int b = PointToClient(Control.MousePosition).Y - p1.Y; //图片坐标计算&赋值 if (isMouseDown) pictureBox1.Location = new System.Drawing.Point(p2.X + a, p2.Y + b);//图片新的坐标 = 图片起始坐标 + 鼠标相对位移 } private void pictureBox1_DoubleClick(object sender, EventArgs e) { pictureBox1.Size = this.Size; pictureBox1.Location = new System.Drawing.Point(0, 0); } private void Form1_DoubleClick(object sender, EventArgs e) { pictureBox1.Size = this.Size; pictureBox1.Location = new System.Drawing.Point(0, 0); } } }
将上面的C#代码封装成了类库, 可以简单的被aardio调用了.
此类库dll我使用的net4.7.2编译, 如果提示没有这个库, 请自行安装
aardio调用代码如下:
import win.ui; /*DSG{{*/ var winform = win.form(text="aardio form";right=903;bottom=623;bgcolor=12639424) winform.add( button={cls="button";text="Button";left=142;top=488;right=336;bottom=538;db=1;dl=1;z=2}; custom={cls="custom";text="自定义控件";left=98;top=51;right=727;bottom=413;bgcolor=12632256;db=1;dl=1;dr=1;dt=1;z=1} ) /*}}*/ import dotNet; import System.Windows.Forms; var Forms = System.Windows.Forms; //.NET 控件必须用 Forms.CreateEmbed 创建一个窗口包住再嵌入 aardio 窗口 var pictureBox1 = Forms.CreateEmbed("PictureBox",winform.custom); //声明 var PicBoxExdll = dotNet.load("/PicBoxEx.dll"); var PicBox = PicBoxExdll.new("PicBoxEx.ToAardio"); PicBox.LinkTo(pictureBox1); PicBox.ChangeImg(io.fullpath("\单波长直对准.png")); winform.button.oncommand = function(id,event){ PicBox.ChangeImg(io.fullpath("\捕获.PNG")); } winform.show(); win.loopMessage();
aardio示例工程下载:
c#类库代码如下:
using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames; namespace PicBoxEx { public class ToAardio:Form { public PictureBox pictureBox = null; private bool isMouseDown = false; private System.Drawing.Point p1 = new System.Drawing.Point(); private System.Drawing.Point p2 = new System.Drawing.Point(); public void LinkTo ( PictureBox picturebox ) { pictureBox = picturebox; pictureBox.Size = pictureBox.Parent.Size; pictureBox.Location = new System.Drawing.Point(0, 0); pictureBox.Dock = DockStyle.None; pictureBox.SizeMode = PictureBoxSizeMode.Zoom; pictureBox.MouseWheel += PictureBox_MouseWheel; pictureBox.MouseDown += PictureBox_MouseDown; pictureBox.MouseUp += PictureBox_MouseUp; pictureBox.MouseMove += PictureBox_MouseMove; pictureBox.MouseDoubleClick += PictureBox_MouseDoubleClick; pictureBox.Parent.MouseDoubleClick += Parent_MouseDoubleClick; } public System.Drawing.Image ChangeImg(string path) { if (path != string.Empty) { pictureBox.Size = pictureBox.Parent.Size; pictureBox.Location = new System.Drawing.Point(0, 0); System.Drawing.Image preimg = pictureBox.Image; pictureBox.Image = System.Drawing.Image.FromFile(path); return preimg; } return null; } private void Parent_MouseDoubleClick(object sender, MouseEventArgs e) { pictureBox.Size = pictureBox.Parent.Size; pictureBox.Location = new System.Drawing.Point(0, 0); } private void PictureBox_MouseDoubleClick(object sender, MouseEventArgs e) { pictureBox.Size = pictureBox.Parent.Size; pictureBox.Location = new System.Drawing.Point(0, 0); } private void PictureBox_MouseMove(object sender, MouseEventArgs e) { if (pictureBox == null) { return; } //鼠标坐标的相对改变值 int a = PointToClient(Control.MousePosition).X - p1.X; int b = PointToClient(Control.MousePosition).Y - p1.Y; //图片坐标计算&赋值 if (isMouseDown) pictureBox.Location = new System.Drawing.Point(p2.X + a, p2.Y + b);//图片新的坐标 = 图片起始坐标 + 鼠标相对位移 } private void PictureBox_MouseUp(object sender, MouseEventArgs e) { if (pictureBox == null) { return; } isMouseDown = false; } private void PictureBox_MouseDown(object sender, MouseEventArgs e) { if (pictureBox == null) { return; } isMouseDown = true; p1 = PointToClient(Control.MousePosition);//记录鼠标坐标 p2 = pictureBox.Location; //记录图片坐标 } private void PictureBox_MouseWheel(object sender, MouseEventArgs e) { if (pictureBox == null) { return; } int x = e.Location.X; int y = e.Location.Y; int ow = pictureBox.Width; int oh = pictureBox.Height; int VX, VY; //因缩放产生的位移矢量 int zoomStep = (pictureBox.Width > pictureBox.Height) ? pictureBox.Width / 10 : pictureBox.Height / 10; if (e.Delta > 0) //放大 { //防止一直缩成负值 if (pictureBox.Width > pictureBox.Image.Width * 10) return; pictureBox.Width += zoomStep; pictureBox.Height += zoomStep; } if (e.Delta < 0) //缩小 { //防止一直缩成负值 if (pictureBox.Width < pictureBox.Image.Width / 10) return; pictureBox.Width -= zoomStep; pictureBox.Height -= zoomStep; } //第④步,求因缩放产生的位移,进行补偿,实现锚点缩放的效果 VX = (int)((double)x * (ow - pictureBox.Width) / ow); VY = (int)((double)y * (oh - pictureBox.Height) / oh); pictureBox.Location = new Point(pictureBox.Location.X + VX, pictureBox.Location.Y + VY); } } }
c#调用此dll类库示例:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp5 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } PicBoxEx.ToAardio PicBox; private void Form1_Load(object sender, EventArgs e) { PicBox = new PicBoxEx.ToAardio(); PicBox.LinkTo(pictureBox1); PicBox.ChangeImg("C:\\Users\\popdes\\Desktop\\捕获.PNG"); } private void button1_Click(object sender, EventArgs e) { PicBox.ChangeImg("C:\\Users\\popdes\\Desktop\\单波长直对准.png"); } } }
再次直接封装了个c#的控件类库, 使用和调用更简单了.
鼠标左键拖拽, 鼠标滚轮放大缩小, 双击窗口回归原位.
import win.ui; /*DSG{{*/ var winform = win.form(text="aardio form";right=903;bottom=623;bgcolor=12639424) winform.add( button={cls="button";text="Button";left=128;top=517;right=322;bottom=567;db=1;dl=1;z=2}; custom={cls="custom";text="自定义控件";left=18;top=7;right=895;bottom=474;bgcolor=12632256;db=1;dl=1;dr=1;dt=1;z=1} ) /*}}*/ import dotNet; import System.Windows.Forms; var Forms = System.Windows.Forms; //声明 var PicExdll = dotNet.load("/PicEx.dll"); //绑定窗体 var PicBox = PicExdll.new("picEx.UserControl1"); var ctrl = Forms.CreateEmbed(PicBox,winform.custom); //控件不填充满父窗体 ctrl.Dock = 0/*System.Windows.Forms.DockStyle.None*/; PicBox.imgPath = io.fullpath("\单波长直对准.png"); winform.button.oncommand = function(id,event){ PicBox.imgPath = io.fullpath("\捕获.PNG"); } winform.show(); win.loopMessage();
aardio示例工程下载:
下面是这个picEx控件类库代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace picEx { public partial class UserControl1: PictureBox { public UserControl1() { InitializeComponent(); UserControl1_Load(); } private bool isInitParent = false; private bool isMouseDown = false; private System.Drawing.Point p1 = new System.Drawing.Point(); private System.Drawing.Point p2 = new System.Drawing.Point(); public string imgPath { set { if (value != string.Empty) { this.Size = this.Parent.Size; this.Location = new System.Drawing.Point(0, 0); this.Image = System.Drawing.Image.FromFile(value); // if (!isInitParent) { isInitParent = true; this.Parent.MouseDoubleClick += PictureBox_MouseDoubleClick; } } } } private void UserControl1_Load() { this.Location = new System.Drawing.Point(0, 0); this.Dock = DockStyle.None; this.SizeMode = PictureBoxSizeMode.Zoom; this.MouseWheel += PictureBox_MouseWheel; this.MouseDown += PictureBox_MouseDown; this.MouseUp += PictureBox_MouseUp; this.MouseMove += PictureBox_MouseMove; this.MouseDoubleClick += PictureBox_MouseDoubleClick; } private void PictureBox_MouseDoubleClick(object sender, MouseEventArgs e) { if (this.Image == null) { return; } this.Size = this.Parent.Size; this.Location = new System.Drawing.Point(0, 0); } private void PictureBox_MouseMove(object sender, MouseEventArgs e) { if (this.Image == null) { return; } //鼠标坐标的相对改变值 int a = Control.MousePosition.X - p1.X; int b = Control.MousePosition.Y - p1.Y; //图片坐标计算&赋值 if (isMouseDown) this.Location = new System.Drawing.Point(p2.X + a, p2.Y + b);//图片新的坐标 = 图片起始坐标 + 鼠标相对位移 } private void PictureBox_MouseUp(object sender, MouseEventArgs e) { if (this.Image == null) { return; } isMouseDown = false; } private void PictureBox_MouseDown(object sender, MouseEventArgs e) { if (this.Image == null) { return; } isMouseDown = true; p1 = Control.MousePosition;//记录鼠标坐标 p2 = this.Location; //记录图片坐标 } private void PictureBox_MouseWheel(object sender, MouseEventArgs e) { if (this.Image == null) { return; } int x = e.Location.X; int y = e.Location.Y; int ow = this.Width; int oh = this.Height; int VX, VY; //因缩放产生的位移矢量 int zoomStep = (this.Width > this.Height) ? this.Width / 10 : this.Height / 10; if (e.Delta > 0) //放大 { //防止一直无限放大导致异常错误 if (Math.Max( this.Width,this.Height) > Math.Max(this.Image.Width * 10, this.Image.Height * 10)) return; this.Width += zoomStep; this.Height += zoomStep; } if (e.Delta < 0) //缩小 { //防止一直缩 if ( Math.Min( this.Width,this.Height) < Math.Min( this.Image.Width/10, this.Image.Height / 10) ) return; this.Width -= zoomStep; this.Height -= zoomStep; } //第④步,求因缩放产生的位移,进行补偿,实现锚点缩放的效果 VX = (int)((double)x * (ow - this.Width) / ow); VY = (int)((double)y * (oh - this.Height) / oh); this.Location = new Point(this.Location.X + VX, this.Location.Y + VY); } } }
c#自己调用这个控件dll代码:
拖动这个dll到vs的控件列表里, 然后拖动usercontrol控件到界面上就可以了.
private void Form1_Load(object sender, EventArgs e) { userControl11.imgPath = "C:\\Users\\popdes\\Desktop\\捕获.PNG"; }
2023-09-02
#13
handycontrol中有个Imageviewer控件已经完成了这个功能,可以直接调用
handycontrol应该是有个winform的版本,可以适配framework 4使用,可以直接嵌入到aardio中。
<Window x:Class="WPFImageViewer.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WPFImageViewer" mc:Ignorable="d" xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:vm="clr-namespace:WPFImageViewer.ViewModels" Title="MainWindow" Height="450" Width="800" FontFamily="JetBrains Mono" FontSize="14" Background="White" WindowStyle="None" MouseDown="Window_MouseDown"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="35"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="150"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Border Grid.ColumnSpan="2" HorizontalAlignment="Left" Margin="10"> <TextBlock Text="ImageViewer" Style="{StaticResource TextBlockDefaultPrimary}" FontSize="16" FontWeight="Heavy"/> </Border> <hc:ButtonGroup Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" Width="100"> <Button Content="-" Style="{StaticResource ButtonGroupItemHorizontalFirst}" Click="Window_Minimize"/> <Button Content="^" Style="{StaticResource ButtonGroupItemDefault}" Click="Window_Maximize"/> <Button Content="X" Style="{StaticResource ButtonGroupItemHorizontalLast}" Background="Red" Foreground="White" Click="Window_Close"/> </hc:ButtonGroup> <DockPanel x:Name="contentView" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"> <hc:ImageViewer DockPanel.Dock="Left, Top" ImageSource="https://img-s-msn-com.akamaized.net/tenant/amp/entityid/AA1g5Pl6.img?w=768&h=957&m=6&x=552&y=653&s=249&d=249"></hc:ImageViewer> </DockPanel> </Grid> </Window>
C#
using System.Windows; using System.Windows.Input; namespace WPFImageViewer; /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } public void Window_Minimize(object sender, RoutedEventArgs e) { WindowState = WindowState.Minimized; } public void Window_Maximize(object sender, RoutedEventArgs e) { if (WindowState != WindowState.Maximized) WindowState = WindowState.Maximized; else WindowState = WindowState.Normal; } public void Window_Close(object sender, RoutedEventArgs e) { Application.Current.Shutdown(); } private void Window_MouseDown(object sender, MouseButtonEventArgs e) { if (e.ButtonState == MouseButtonState.Pressed) DragMove(); } }
登录后方可回帖
C# 实现,可局部放大,类似淘宝商品图片功能