Перейти к содержанию

Перемещение формочки мышкой c# (нестандарт)


RockHammer

Рекомендуемые сообщения

Всем привет!

 

Заканчиваю пилить свое прилить свой мега-крутой трейнер :)

В общем, нарисовал прикольный дизайн... Откомпилил... Но он отказывается перемещаться :(

Я поставил тип формы "без границ" и сделал picture box, в который и загрузил свою картинку.

В общем вопрос такой: как сделать, чтобы можно было перемещать форму, двигая за picture box???

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

 

Скачать
 

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

в обработчике сообщения WM_LBUTTONDOWN пишешь

SendMessage(hWnd,WM_NCLBUTTONDOWN, HTCAPTION, 0);

где

hWnd - хэндл твоего окна,

WM_NCLBUTTONDOWN - сообщение, которое в твоем случае нужно отправить твоему окну

HTCAPTION - виндовая константа

0 - 0

 

В общем случае, для С++ код выглядит примерно так:

 

LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

 

{    switch(uMsg)     {        // Обработка других сообщений от системы        case WM_LBUTTONDOWN:            SendMessage(hWnd,WM_NCLBUTTONDOWN, HTCAPTION, 0);        break;        // Обработка других сообщений от системы    }}
Но это код для С++, для решеток, возможно, будет несколько иначе.
Ссылка на комментарий
Поделиться на другие сайты

в обработчике сообщения WM_LBUTTONDOWN пишешь

SendMessage(hWnd,WM_NCLBUTTONDOWN, HTCAPTION, 0);

где

hWnd - хэндл твоего окна,

WM_NCLBUTTONDOWN - сообщение, которое в твоем случае нужно отправить твоему окну

HTCAPTION - виндовая константа

0 - 0

 

В общем случае, для С++ код выглядит примерно так:

 

LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

 

{    switch(uMsg)     {        // Обработка других сообщений от системы        case WM_LBUTTONDOWN:            SendMessage(hWnd,WM_NCLBUTTONDOWN, HTCAPTION, 0);        break;        // Обработка других сообщений от системы    }}
Но это код для С++, для решеток, возможно, будет несколько иначе.

 

 

Хм... Как же этот код перевести в решетку?

Ссылка на комментарий
Поделиться на другие сайты

using System;

using System.Windows.Forms;

class FormEx : Form

{

public static void Main()

{

Application.Run(new FormEx());

}

protected override void OnMouseDown(MouseEventArgs e)

{

this.Capture = false;

var msg = Message.Create(this.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);

this.WndProc(ref msg);

}

}

Ссылка на комментарий
Поделиться на другие сайты

using System;using System.Windows.Forms; class FormEx : Form{    public static void Main()    {        Application.Run(new FormEx());    }    protected override void OnMouseDown(MouseEventArgs e)    {        this.Capture = false;        var msg = Message.Create(this.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);        this.WndProc(ref msg);    }}

 

Ругается, что в приложении две точки входа

Ссылка на комментарий
Поделиться на другие сайты

Елки-палки. А зачем весь код-то копипастить? Возьми только нужное.

 

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

this.Capture = false;var msg = Message.Create(this.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);this.WndProc(ref msg);
Ссылка на комментарий
Поделиться на другие сайты

 

Елки-палки. А зачем весь код-то копипастить? Возьми только нужное.

 

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

this.Capture = false;var msg = Message.Create(this.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);this.WndProc(ref msg);

 

Прописал 

protected override void OnMouseDown (MouseEventArgs e)        {            this.Capture = false;            var msg = Message.Create(this.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);            this.WndProc(ref msg);        }

Как не перемещалась - так и не перемещается (

Ссылка на комментарий
Поделиться на другие сайты

Код на VSC#

private Point dragStartPoint = new Point();
        private void pictureBox2_MouseDown(object sender, MouseEventArgs e)        {            dragStartPoint = new Point(e.X + (Width - ClientSize.Width) / 2, e.Y - (Width - ClientSize.Width) / 2);        }        private void pictureBox2_MouseMove(object sender, MouseEventArgs e)        {            if (e.Button == System.Windows.Forms.MouseButtons.Left)            {                Point location = PointToScreen(new Point(e.X, e.Y));                Location = new Point(location.X - dragStartPoint.X, location.Y - dragStartPoint.Y - (Height - ClientSize.Height));            }        }
Ссылка на комментарий
Поделиться на другие сайты

 

Код на VSC#

private Point dragStartPoint = new Point();
        private void pictureBox2_MouseDown(object sender, MouseEventArgs e)        {            dragStartPoint = new Point(e.X + (Width - ClientSize.Width) / 2, e.Y - (Width - ClientSize.Width) / 2);        }        private void pictureBox2_MouseMove(object sender, MouseEventArgs e)        {            if (e.Button == System.Windows.Forms.MouseButtons.Left)            {                Point location = PointToScreen(new Point(e.X, e.Y));                Location = new Point(location.X - dragStartPoint.X, location.Y - dragStartPoint.Y - (Height - ClientSize.Height));            }        }

 

 

Не работает (

Ссылка на комментарий
Поделиться на другие сайты

И мой, и код ZOCKIR вполне рабочие. Помимо копипасты тебе нужно через редактор формы зарегистрировать данные функции в качестве обработчиков события мыши. Ищи, как это сделать, и все заработает.


Значит так. Кликаешь правой кнопкой по пустому месту формы в дизайнере форм, выбираешь Properties. В появившемся инспекторе свойств выбираешь пиктограмму молнии (Actions)В группе Mouse находишь событие MouseDown. Кликаешь по нему два раза. Студия для тебя сгенерирует код функции события (и автоматически зарегистрирует его).

В этот код тебе нужно будет (внутрь функции) вставить следующее:

this.Capture = false;var msg = Message.Create(this.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);this.WndProc(ref msg);

И все. Абсолютно ничего сложного. Только что проверил, все работает штатно.

Ссылка на комментарий
Поделиться на другие сайты

И мой, и код ZOCKIR вполне рабочие. Помимо копипасты тебе нужно через редактор формы зарегистрировать данные функции в качестве обработчиков события мыши. Ищи, как это сделать, и все заработает.

Значит так. Кликаешь правой кнопкой по пустому месту формы в дизайнере форм, выбираешь Properties. В появившемся инспекторе свойств выбираешь пиктограмму молнии (Actions)В группе Mouse находишь событие MouseDown. Кликаешь по нему два раза. Студия для тебя сгенерирует код функции события (и автоматически зарегистрирует его).

В этот код тебе нужно будет (внутрь функции) вставить следующее:

this.Capture = false;var msg = Message.Create(this.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);this.WndProc(ref msg);

И все. Абсолютно ничего сложного. Только что проверил, все работает штатно.

 

нажал, зарегистрировал... при двойном клике выкинуло в код, где я уже прописал вариант ZOCKIR... стыдно признаваться, но до сих пор не работает (((

Ссылка на комментарий
Поделиться на другие сайты

нажал, зарегистрировал... при двойном клике выкинуло в код, где я уже прописал вариант ZOCKIR... стыдно признаваться, но до сих пор не работает (((

 

Какие ошибки выдает? 

Ссылка на комментарий
Поделиться на другие сайты

Какие ошибки выдает? 

 

ошибок нет, компилируется замечательно... но вот свою функцию не исполняет... как была неподвижной - так и осталась (((

Ссылка на комментарий
Поделиться на другие сайты

Вот у тебя там даже написано над твоей функцией - ссылок: 0. Потому что ты саму функцию скопипастил, а не зарегистрировал в качестве события. Читай внимательно, как это делается, выше в моем посте, и делай.

Ссылка на комментарий
Поделиться на другие сайты

Вот у тебя там даже написано над твоей функцией - ссылок: 0. Потому что ты саму функцию скопипастил, а не зарегистрировал в качестве события. Читай внимательно, как это делается, выше в моем посте, и делай.

 

Я делал... В точности так же.

У меня расписано обе функции. И MoveBox и DownBox. Но в свойствах можно выбрать что-то одно...

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

Разумеется, нужно выбирать что-то одно. Но ты, судя по всему, не выбрал вообще ничего.

 

Смотри: я выбрал downbox, нажал перейти и он меня перекинул на уже готовый код, который я прописал. Т.е. по логике вещей оно должно работать... Но не работает. Я прописал это и для формочки, и для имедж бокса... Все равно...

Ссылка на комментарий
Поделиться на другие сайты

Кликаешь в проекте на Form1.Designer.cs (не знаю, как он у тебя в русской версии называется, но похоже должен быть)

 

Находишь функцию

 

private void InitializeComponent()

 

Убеждаешься, что в этой функции есть такой код:

this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);

В моем случае регистрируется функция

private void Form1_MouseDown(object sender, MouseEventArgs e)        {            this.Capture = false;            var msg = Message.Create(this.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);            this.WndProc(ref msg);        }

И обрати внимание. Событие вешается на саму форму, а не на picturebox. Так что будь внимателен, и все у тебя получится. Надеюсь, поймешь, куда  нужно вписать свои значения, а не будешь заниматься копипастой.

И да, если ты не видишь фукнцию private void InitializeComponent() - у тебя она в коде скрыта, надо нажать плюсик в той же строке, где написано Windows Forms Designer Generated Code (у тебя может быть опять же по-русски написано).

Ссылка на комментарий
Поделиться на другие сайты

Я совместил вариант ZOCKIR и Xipho... Получилось примерно это:

http://www.youtube.com/watch?v=V83tjJRd1t4&feature=youtu.be

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

Так не нужно их совмещать. Что мешает сделать вот прямо вот так:

 

http://www.youtube.com/watch?v=7C0KdKk1g64

 

Хм... А у меня - вот это отображается на карте метода:

9i7D-H5aZkU.jpg

Ссылка на комментарий
Поделиться на другие сайты

Да это не особо важно, они действительно связаны между собой. Факт в том, что ты видел на видео, как я сделал, и что оно работает. Дальше дело за тобой.

Ссылка на комментарий
Поделиться на другие сайты

Да это не особо важно, они действительно связаны между собой. Факт в том, что ты видел на видео, как я сделал, и что оно работает. Дальше дело за тобой.

 

Понял. Не будет работать - перепишу с нуля)))

Переписал трейнер с нуля...

Оказывается проблема была в PictureBox'e. Удалил его и загрузил картинку напрямую в бекграунд основной формы. Код добавил. Все работает! :)

Проблема была в PictureBox. 

Теперь дизайн трейнера более оптимизирован. Теперь можно полностью кастомно настроить положения кнопок, а не подстраиваться под размеры картинки, установленные в фотошопе)

Спасибо всем за помощь и советы :)

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.