RockHammer Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 (изменено) Всем привет! Заканчиваю пилить свое прилить свой мега-крутой трейнер В общем, нарисовал прикольный дизайн... Откомпилил... Но он отказывается перемещаться Я поставил тип формы "без границ" и сделал picture box, в который и загрузил свою картинку.В общем вопрос такой: как сделать, чтобы можно было перемещать форму, двигая за picture box???P.s. раз уж заговорил про дизайн... В настройках проекта указал свою иконку. Она будет в архиве с трейнером. Но почему то при компиляции, студия говорит: "неудалось открыть файл иконки"... С чего бы это? Скачать Изменено 9 ноября, 2014 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 в обработчике сообщения 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; // Обработка других сообщений от системы }}Но это код для С++, для решеток, возможно, будет несколько иначе. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 ноября, 2014 Автор Поделиться Опубликовано 9 ноября, 2014 в обработчике сообщения 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; // Обработка других сообщений от системы }}Но это код для С++, для решеток, возможно, будет несколько иначе. Хм... Как же этот код перевести в решетку? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 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); } } Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 ноября, 2014 Автор Поделиться Опубликовано 9 ноября, 2014 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); }} Ругается, что в приложении две точки входа Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 Елки-палки. А зачем весь код-то копипастить? Возьми только нужное. Подсказываю. Тебе нужно создать для своей формы обработчик нажатия кнопок мыши, и в него вставить этот код:this.Capture = false;var msg = Message.Create(this.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);this.WndProc(ref msg); Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 ноября, 2014 Автор Поделиться Опубликовано 9 ноября, 2014 Елки-палки. А зачем весь код-то копипастить? Возьми только нужное. Подсказываю. Тебе нужно создать для своей формы обработчик нажатия кнопок мыши, и в него вставить этот код: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); }Как не перемещалась - так и не перемещается ( Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 Код на 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)); } } Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 ноября, 2014 Автор Поделиться Опубликовано 9 ноября, 2014 Код на 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)); } } Не работает ( Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 И мой, и код ZOCKIR вполне рабочие. Помимо копипасты тебе нужно через редактор формы зарегистрировать данные функции в качестве обработчиков события мыши. Ищи, как это сделать, и все заработает.Значит так. Кликаешь правой кнопкой по пустому месту формы в дизайнере форм, выбираешь Properties. В появившемся инспекторе свойств выбираешь пиктограмму молнии (Actions)В группе Mouse находишь событие MouseDown. Кликаешь по нему два раза. Студия для тебя сгенерирует код функции события (и автоматически зарегистрирует его).В этот код тебе нужно будет (внутрь функции) вставить следующее:this.Capture = false;var msg = Message.Create(this.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);this.WndProc(ref msg);И все. Абсолютно ничего сложного. Только что проверил, все работает штатно. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 ноября, 2014 Автор Поделиться Опубликовано 9 ноября, 2014 И мой, и код 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 Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 нажал, зарегистрировал... при двойном клике выкинуло в код, где я уже прописал вариант ZOCKIR... стыдно признаваться, но до сих пор не работает ((( Какие ошибки выдает? Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 ноября, 2014 Автор Поделиться Опубликовано 9 ноября, 2014 Какие ошибки выдает? ошибок нет, компилируется замечательно... но вот свою функцию не исполняет... как была неподвижной - так и осталась ((( Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 Мой код пропиши, должно работать, я проверял. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 ноября, 2014 Автор Поделиться Опубликовано 9 ноября, 2014 Мой код пропиши, должно работать, я проверял. ошибок не выдает, но и функцию свою не выполняет Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 Вот у тебя там даже написано над твоей функцией - ссылок: 0. Потому что ты саму функцию скопипастил, а не зарегистрировал в качестве события. Читай внимательно, как это делается, выше в моем посте, и делай. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 ноября, 2014 Автор Поделиться Опубликовано 9 ноября, 2014 (изменено) Вот у тебя там даже написано над твоей функцией - ссылок: 0. Потому что ты саму функцию скопипастил, а не зарегистрировал в качестве события. Читай внимательно, как это делается, выше в моем посте, и делай. Я делал... В точности так же.У меня расписано обе функции. И MoveBox и DownBox. Но в свойствах можно выбрать что-то одно... Изменено 9 ноября, 2014 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 Разумеется, нужно выбирать что-то одно. Но ты, судя по всему, не выбрал вообще ничего. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 ноября, 2014 Автор Поделиться Опубликовано 9 ноября, 2014 Разумеется, нужно выбирать что-то одно. Но ты, судя по всему, не выбрал вообще ничего. Смотри: я выбрал downbox, нажал перейти и он меня перекинул на уже готовый код, который я прописал. Т.е. по логике вещей оно должно работать... Но не работает. Я прописал это и для формочки, и для имедж бокса... Все равно... Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 Кликаешь в проекте на 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 (у тебя может быть опять же по-русски написано). Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 ноября, 2014 Автор Поделиться Опубликовано 9 ноября, 2014 (изменено) Я совместил вариант ZOCKIR и Xipho... Получилось примерно это:http://www.youtube.com/watch?v=V83tjJRd1t4&feature=youtu.be Изменено 9 ноября, 2014 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 ноября, 2014 Поделиться Опубликовано 9 ноября, 2014 Так не нужно их совмещать. Что мешает сделать вот прямо вот так: http://www.youtube.com/watch?v=7C0KdKk1g64 Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 10 ноября, 2014 Автор Поделиться Опубликовано 10 ноября, 2014 Так не нужно их совмещать. Что мешает сделать вот прямо вот так: http://www.youtube.com/watch?v=7C0KdKk1g64 Хм... А у меня - вот это отображается на карте метода: Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 10 ноября, 2014 Поделиться Опубликовано 10 ноября, 2014 Да это не особо важно, они действительно связаны между собой. Факт в том, что ты видел на видео, как я сделал, и что оно работает. Дальше дело за тобой. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 10 ноября, 2014 Автор Поделиться Опубликовано 10 ноября, 2014 Да это не особо важно, они действительно связаны между собой. Факт в том, что ты видел на видео, как я сделал, и что оно работает. Дальше дело за тобой. Понял. Не будет работать - перепишу с нуля)))Переписал трейнер с нуля...Оказывается проблема была в PictureBox'e. Удалил его и загрузил картинку напрямую в бекграунд основной формы. Код добавил. Все работает! Проблема была в PictureBox. Теперь дизайн трейнера более оптимизирован. Теперь можно полностью кастомно настроить положения кнопок, а не подстраиваться под размеры картинки, установленные в фотошопе)Спасибо всем за помощь и советы Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения