Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VC#] PictureBox - Масштабирование, Прокрутка колёсика 
V
    Опции темы
MuForum
Дата 27.8.2008, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Доброе время суток.
- Использую компонент 'PictureBox'.
- Необходимо реализовать масштабирования изображения при прокрутке колесика мыши. (Как во всех графических редакторах)
- То есть когда крутишь колесико, соответственно меняется размер картинки. Проблема в том, что я не могу отследить это событие.

# Вопрос: Есть ли встроенное событие на отслеживание прокрутки колесика?
- Если есть, то какое, если нету, то как данную вещь реализовать?


P.S. -> В 'C++' можно было реализовать при помощи обработке сообщения 'WM_MOUSEWHEEL', а в C# такого не нашел =(
- Если нет, то прейдётся инициализировать хук WH_MOUSE для компонента Picture Box.

Это сообщение отредактировал(а) MuForum - 27.8.2008, 02:41


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
marcusmae
Дата 27.8.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(MuForum @  27.8.2008,  02:08 Найти цитируемый пост)
Если нет, то прейдётся инициализировать хук WH_MOUSE для компонента Picture Box.


OMG smile 

Можно использовать событие Control.MouseWheel

В примере для Panel регистрируется обработчик :

Код

 this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);


в котором можно, например, поставить в соответствие движению колеса матрицу сдвига или поворота некоторого объекта :

Код

    private System.Drawing.Drawing2D.GraphicsPath mousePath;

    private void panel1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        // Update the drawing based upon the mouse wheel scrolling.
      
        int numberOfTextLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines / 120;
        int numberOfPixelsToMove = numberOfTextLinesToMove * fontSize;

        if (numberOfPixelsToMove != 0) 
        {
            System.Drawing.Drawing2D.Matrix translateMatrix = new System.Drawing.Drawing2D.Matrix();
            translateMatrix.Translate(0, numberOfPixelsToMove);
            mousePath.Transform(translateMatrix);
        }
        panel1.Invalidate();
    }


Состояние колеса можно определять и по другим событиям с callback-ами, в аргументе которых стоит MouseEventArgs : свойство MouseEventArgs.Delta указывает целочисленный "пробег" колеса, положительный или отрицательный, в зависимости от направления, зависящий от константы WHEEL_DELTA, связанной с оптическим разрешением.


Это сообщение отредактировал(а) marcusmae - 27.8.2008, 13:00


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
MuForum
Дата 27.8.2008, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



#1,  - Попробовал сделать, но ноль по массе...

Код

        private void FMain_Load(object sender, EventArgs e)
        {
            this.MouseWheel += new MouseEventHandler(FMain_MouseWheel);
        }
......
        private void FMain_MouseWheel(object sender, MouseEventArgs e)
        {
            MessageBox.Show(this, "[Message]", "FMain_MouseWheel()");
        }


P.S. -> Работает, но только когда фокус у формы.
- Спасибо. (Хотя я до этого тоже сделал так, но не допёр, что только когда у формы фокус работает)
- В плане, когда фокус у кого-то компонента с формы, то уже сообщение не вылазит.

Это сообщение отредактировал(а) MuForum - 27.8.2008, 15:49


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
marcusmae
Дата 27.8.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(MuForum @  27.8.2008,  15:30 Найти цитируемый пост)
Работает, но только когда не выбираешь любой другой компонент.


Обработчик вызывается при возникновении события именно в том компоненте, для которого зарегистрирован. Дело в этом?


Это сообщение отредактировал(а) marcusmae - 27.8.2008, 15:45


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
MuForum
Дата 27.8.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Цитата(marcusmae @ 27.8.2008,  15:44)
Цитата(MuForum @  27.8.2008,  15:30 Найти цитируемый пост)
Работает, но только когда не выбираешь любой другой компонент.


Обработчик вызывается при возникновении события именно в том компоненте, для которого зарегистрирован. Дело в этом?

Ага. Но по сути это правильно. Так что всё нормально.


# Добавлено: Я сделал обработчик события компоненту 'TreeView', но теперь в обоих случаях идёт скролиннг, а это не удобно =(
- Как можно сделать так, чтобы обработчик прокрутки колёсика фиксировался всегда или как-то передать фокус компоненту PictureBox?
- Я делаю:
Код

pb_main.Focus();
pb_main.Select();

- Но это не помогает, полюбому при прокрутке колесика реагирует обработчик от компонента TreeView, а не PictureBox.

Это сообщение отредактировал(а) MuForum - 27.8.2008, 16:37


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0891 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.