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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Лаги при перетаскивании формы, перетаскивание окна 
:(
    Опции темы
albert21
Дата 10.10.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет.

Ситуация следующая: есть окно "нестандартной" формы, форма окна создаётся на основе bmp файла.
Нужно реализовать перетаскивание этого окна.

Я знаю 2 варианта реализации:

Вариант №1: Переопределение WndProc
Код

       // Идентификатор события перетаскивания мышкой
        const int WM_NCHITTEST = 0x0084;

        // Дополнительный параметр события 
        const int HTCAPTION = 2;

        // Переопределяем обработку оконной функции для того, что бы можно было таскать его мышкой
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_NCHITTEST)
            {
                m.Result = (IntPtr)HTCAPTION;
                return;
            }
            base.WndProc(ref m);
        }

Первый вариант работает быстрее чем второй. Есть ещё одна проблема! Нельзя перетащить окно таким образом, чтобы крайняя верхняя граница окна вышла за пределы экрана (короче capture за пределы верхнего края экрана smile). Окно не остаётся наполовину за пределами экрана, а "спускается" на уровень где capture с кнопками "закрыть", "свернуть", "развернуть" остаются в пределах экрана. 

Надеюсь понятно написал! Можно ли реализовать перемещение первым способом с возможностью оставлять часть окна за пределами экрана?

Вариант №2: Присвоение значений свойству Location окна
Код


        Point oldMousePosition = new Point();
        private bool mousePressed = false;

        private void MainForm_MouseDown(object sender, MouseEventArgs e)
        {
            oldMousePosition = e.Location;
            mousePressed = true;
        }

        private void MainForm_MouseMove(object sender, MouseEventArgs e)
        {
            if (mousePressed)
            {
                if (e.Button == MouseButtons.Left)
                {
                    this.Location = new Point(this.Location.X + e.X - oldMousePosition.X, this.Location.Y + e.Y - oldMousePosition.Y);
                }
            }
        }

Второй вариант оставляет после себя "след из череды перерисовок окна". Можно ли обойти этот эффект? На стандартном окне, прямоугольной формы, такого не наблюдается


Впрочем первый вариант тоже притормаживает, но гораздо меньше!
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
BinaryShadow
Дата 12.10.2009, 12:49 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я думаю стоит изменить с BMP на JPG, это существенно уменьшит размер, что должно привести к ускорению прорисовки.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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