powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Zoom
13 сообщений из 13, страница 1 из 1
Zoom
    #40040555
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть windows Form. На форме только Panel. Форма при загрузки открывает изображение и роликом мыши можно менять zoom. И если мышкой нажать на Panel, то изображение восстанавливается.
C#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace TestZoom2
{
    public partial class Form1 : Form
    {        
        Image image; //Исходное изображение
        Image imageZoom; //Изображение после Zoom
        double zoom = 1.0; //Последний zoom
        double Stride = 0.005;

        public Form1()
        {
            InitializeComponent();            
            this.MaximizeBox = false;
            this.MinimizeBox = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {            
            this.FormBorderStyle = FormBorderStyle.FixedDialog;

            image = Image.FromFile("C:\\Users\\Acer\\Desktop\\image1.jpg");            

            pictureBox1 = new PictureBox();
            pictureBox1.Name = "pictureBox1";
            pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;            
            pictureBox1.Image = image;

            panel1.AutoScroll = true;
            panel1.Controls.Add(pictureBox1);            
            pictureBox1.MouseWheel += new MouseEventHandler(pictureBox1_MouseWheel);
            //pictureBox1.MouseHover += new System.EventHandler(pictureBox1_MouseHover);
            pictureBox1.Image = image;
            imageZoom = image;

            pictureBox1.Focus();
        }

        private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
        {
            if (pictureBox1.Image != null)
            {
                if (e.Delta < 0)
                {
                    zoom = zoom * (1 + Stride);
                }
                else if (e.Delta > 0)
                {
                    zoom = zoom * (1 - Stride);                    
                }

                Bitmap bmp = new Bitmap(imageZoom,
                                        Convert.ToInt32(pictureBox1.Width * zoom),
                                        Convert.ToInt32(pictureBox1.Height * zoom));
                Graphics g = Graphics.FromImage(bmp);
                g.InterpolationMode = InterpolationMode.Default;
                imageZoom = bmp;

                pictureBox1.Width = (int)Math.Round(pictureBox1.Image.Width * zoom);
                pictureBox1.Height = (int)Math.Round(pictureBox1.Image.Height * zoom);

                pictureBox1.Image = bmp;                
            }
        }

        /*private void pictureBox1_MouseHover(object sender, EventArgs e)
        {
            pictureBox1.Focus();
        }*/

        //Восстановление изображения
        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            pictureBox1.Image = image;
            imageZoom = image;
            zoom = 1.0;
            //pictureBox1.Focus();
        }
    }
}

Программа работает, но будто с опозданием. Крутишь ролик в один сдвиг в одну сторону - меняется изображение в соответствующую сторону. Дальше крутишь - также норм. Но потом, если крутить в другую сторону ролика, то не меняет направление и дальше изменяет размер как раньше, и чуть позже изменять в нужную сторону. Будто работает с опозданием.

Скажите, почему так происходит и как это исправить?
...
Рейтинг: 0 / 0
Zoom
    #40040653
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,


Вам принципиально использовать только winforms?

Работа с изображением в разы удобнее в WPF
...
Рейтинг: 0 / 0
Zoom
    #40040658
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Можно и в WPF. Учитывая, что на форме отдельно на button накладываю bmp рядом с текстом, то тут не особо удобно.
...
Рейтинг: 0 / 0
Zoom
    #40040798
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
felix_ff
ferzmikk,


Вам принципиально использовать только winforms?

Работа с изображением в разы удобнее в WPF

Библиотеки одни и те же. Нет особого смыла.
...
Рейтинг: 0 / 0
Zoom
    #40040800
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ferzmikk,

Изменения размеров надо делать не от текущего размера, а от исходного


Код: c#
1.
2.
3.
Bitmap bmp = new Bitmap(imageZoom,
                                        Convert.ToInt32(image.Width * zoom),
                                        Convert.ToInt32(image.Height * zoom));



На вашем месте я бы менял не размер рисунка, а размер PictureBox в режиме PictureBoxSizeMode.Zoom
...
Рейтинг: 0 / 0
Zoom
    #40040805
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2
Библиотеки одни и те же. Нет особого смыла.

Это с чего бы вдруг?
...
Рейтинг: 0 / 0
Zoom
    #40040806
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Примерно так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
private void Form1_Load(object sender, EventArgs e)
        {
            this.FormBorderStyle = FormBorderStyle.FixedDialog;

            image = Image.FromFile(@"F:\inetpub\wwwroot\wlk\2020-12\img_7504-1000.jpg");
            //pictureBox1 = new PictureBox();
            //pictureBox1.Name = "pictureBox1";
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
            
            pictureBox1.Width = image.Width;
            pictureBox1.Height = image.Height;

            panel1.AutoScroll = true;
            panel1.Controls.Add(pictureBox1);
            pictureBox1.MouseWheel += new MouseEventHandler(pictureBox1_MouseWheel);
            pictureBox1.Image = image;
            pictureBox1.Focus();
        }

        private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
        {
          
            if (pictureBox1.Image != null)
            {
                zoom *=  (1 + Stride * Math.Sign(e.Delta));
                pictureBox1.Width =Convert.ToInt32( image.Width * zoom);
                pictureBox1.Height = Convert.ToInt32(image.Height * zoom);
            }
        }
...
Рейтинг: 0 / 0
Zoom
    #40040807
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сон Веры Павловны
Cat2
Библиотеки одни и те же. Нет особого смыла.

Это с чего бы вдруг?

Выигрыша в производительности не будет, а зачем иначе огород городить?
...
Рейтинг: 0 / 0
Zoom
    #40040817
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2
Примерно так
Получилось! Намного лучше работает zoom теперь.

Только вот один момент есть. Когда увеличиваешь изображение, где позже появляется вертикальный ползунок и потом когда обратно крутишь колесо мыши, то сначала перемещает ползунок вниз и только потом уменьшается размер.

Скажите, как сделать так, чтобы прокрутка колеса мыши не влияло на прокрутку ползунка?
...
Рейтинг: 0 / 0
Zoom
    #40040823
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

заблокируй прокрутку колеса на уровне scrollbox'а
...
Рейтинг: 0 / 0
Zoom
    #40040824
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
ferzmikk,

заблокируй прокрутку колеса на уровне scrollbox'а
Получилось так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
        {
            if (pictureBox1.Image != null)
            {
                zoom *= (1 + Stride * Math.Sign(e.Delta));
                pictureBox1.Width = Convert.ToInt32(image.Width * zoom);
                pictureBox1.Height = Convert.ToInt32(image.Height * zoom);
                ((HandledMouseEventArgs)e).Handled = true;
            }
        }
...
Рейтинг: 0 / 0
Zoom
    #40040929
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

в WPF это выглядело бы так:
xaml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<Window x:Class="Zoom.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:Zoom"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" MouseWheel="Window_MouseWheel">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="24"/>
        </Grid.RowDefinitions>
        <Image x:Name="img" Grid.Row="0" Source="3d bar chart.bmp" RenderTransformOrigin="0.5,0.5" >
            <Image.RenderTransform>
                <TransformGroup>
                    <ScaleTransform ScaleX="{Binding Value,ElementName=zoomer}" ScaleY="{Binding Value,ElementName=zoomer}"/>
                </TransformGroup>
            </Image.RenderTransform>
        </Image>
        <Slider x:Name="zoomer" Grid.Row="1" Minimum="1" Maximum="100"/>
    </Grid>

</Window>



codebehind
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Imaging;
namespace Zoom
{
    public partial class MainWindow : Window
    {      
        public MainWindow()
        {
            InitializeComponent();
            MouseButtonEventHandler handler = Image_MouseLeftButtonDown;
            img.AddHandler(UIElement.MouseLeftButtonDownEvent, handler, true);
        }

        private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.ClickCount == 2)
            {
                var dialog = new Microsoft.Win32.OpenFileDialog();
                var dr = dialog.ShowDialog();
                if (dr.HasValue && dr.Value)
                {
                    BitmapImage bmp = new BitmapImage(new Uri(dialog.FileName));
                    img.Source = bmp;
                    
                }
            }
        }

        private void Window_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            zoomer.Value += e.Delta * 0.01;
        }
    }
}


...
Рейтинг: 0 / 0
Zoom
    #40040987
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2, Roman Mejtes, felix_ff,

Спасибо!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Zoom
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]