Как переместить окно, которое не имеет границы. В приложении нет свободного места, все, что доступно, - это webbrowser и menustrip. Я бы хотел, чтобы пользователи могли перемещать окно, перетаскивая полосу меню. Как это сделать? Я пробовал несколько кодовых блоков, которые я нашел в Интернете, но никто из них не работал.Перемещение окна без границы
ответ
This Код Проект статьи должен помочь вам выполнить это. Я сам использовал это без проблем. Это тэки его:
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
Это будет в основном «трюк» менеджер окон, думая, что он захватывая строку заголовка WinForm.
Чтобы применить его к вашему проекту, просто используйте событие MouseDown из MenuStrip.
Это работает отлично. Вы можете добавить содержимое метода в любое событие MouseDown, например изображение ... – Otiel
Это было почти слишком просто :) Спасибо! –
Вы можете подделать свой menustrip, например, используя панель с меткой. И тогда вы можете справиться с этим вручную: когда пользователь нажмет на ярлык, откроется всплывающее меню, и когда пользователь перетащит ярлык, окно переместится. Но я бы посоветовал отказаться от таких обходных решений, потому что это не стандартное поведение графического интерфейса, и вы можете смутить своих пользователей.
* Пожалуйста, не делайте этого. Это не совсем нестандартный пользовательский интерфейс, но он все еще не решает проблему интерпретации щелчка. Помните, что «перетаскивание» происходит * после * щелчка.Должен ли щелчок открыть меню или его следует интерпретировать как начало перетаскивания? Машины времени еще не усовершенствованы. –
@Cody Щелчок происходит, когда вы отпускаете кнопку мыши. Посмотрите, как он работает на панели «Папки» проводника Windows: если вы щелкнете папку, она откроется в правой панели, но если вы перетащите папку, она не откроется, ее просто перетащит. –
Понял. Но поймите, что вы определяете событие «Click» иначе, чем его интерпретирует в Windows. Как только я нажимаю кнопку мыши в любом меню в любом приложении в Windows, меню падает. Это не происходит, когда кнопка мыши отпущена. Я думаю, что важно отметить, что конструктивные решения, которые резко изменяют ожидаемое поведение, должны быть рассмотрены особенно тщательно. –
Я не пробовал, но если вы можете справиться с «OnMouseDown» и «OnMouseUp» события в строке меню:
- На мыши вниз - Переместить окно в соответствии с движением мыши
- Остановить отслеживание движения мыши по мыши, или мышь
Если вы используете панель, вы должны добавить это в
YourForm.Designer.cs
this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown);
и это в
YourForm.cs
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
private void panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
. .Net Way
private bool dragging = false;
private Point dragCursorPoint;
private Point dragFormPoint;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
dragging = true;
dragCursorPoint = Cursor.Position;
dragFormPoint = this.Location;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (dragging)
{
Point dif = Point.Subtract(Cursor.Position, new Size(dragCursorPoint));
this.Location = Point.Add(dragFormPoint, new Size(dif));
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
dragging = false;
}
все.
+1 для чисто C# решения. –
Mbithi Kioko на правильном пути, но я сделал бы это так.
bool dragging = false;
int xOffset = 0;
int yOffset = 0;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
dragging = true;
xOffset = Cursor.Position.X - this.Location.X;
yOffset = Cursor.Position.Y - this.Location.Y;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (dragging)
{
this.Location = new Point(Cursor.Position.X - xOffset, Cursor.Position.Y - yOffset);
this.Update();
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
dragging = false;
}
Я должен был использовать System.Runtime.InteropServices.DllImportAttribute
- просто думал, что комментарии, и пусть вы все знаете.
Просто поместите начальную точку в 2D массив как это:
public partial class mainForm : Form
{
//Global variables for Moving a Borderless Form
private bool dragging = false;
private Point startPoint = new Point(0, 0);
public mainForm()
{
InitializeComponent();
}
private void mainForm_MouseDown(object sender, MouseEventArgs e)
{
dragging = true;
startPoint = new Point(e.X, e.Y);
}
private void mainForm_MouseUp(object sender, MouseEventArgs e)
{
dragging = false;
}
private void mainForm_MouseMove(object sender, MouseEventArgs e)
{
if (dragging)
{
Point p = PointToScreen(e.Location);
Location = new Point(p.X - this.startPoint.X, p.Y - this.startPoint.Y);
}
}
}
- 1. Перемещение формы окна без строки состояния, borderstyle
- 2. Перемещение формы на C# без границы?
- 3. Перемещение формы без границы через панель
- 4. Создание окна без заголовка и границы
- 5. Java - Получить положение окна без границы
- 6. C++ Перемещение окна без изменения его размера
- 7. Перемещение объекта при достижении границы
- 8. Динамическое изменение границы окна
- 9. Удаление границы окна?
- 10. Получите границы UIView относительно окна?
- 11. Удалить границы из определенного окна
- 12. Linux: получить высоту границы окна
- 13. программно изменить цвет окна границы окна 7
- 14. Перемещение окна с SetWindowPos
- 15. Перемещение окна в Matlab
- 16. WPF отключить перемещение окна
- 17. Перемещение окна по изображению
- 18. перемещение окна в R
- 19. C# как распечатать окно формы без окна формы границы
- 20. Стиль окна/Минимальный заголовок/границы
- 21. Удалить полностью границы внешнего окна
- 22. Ширина и высота границы окна
- 23. Обнаружение границы окна в JavaFX?
- 24. OSX: получить окна приложений + границы
- 25. Как получить минимизированные границы окна?
- 26. Размер окна окна и перемещение консоли
- 27. Перемещение окна Улучшение производительности RMQ
- 28. Как получить границы главного меню окна?
- 29. Перемещение окна без заголовка с помощью области перетаскивания
- 30. Перемещение div при изменении размера окна без использования абсолютного
Наверное, потому, что это невозможно для приложения (или пользователя), чтобы отличить щелчок на 'MenuStrip' предназначен ли переместить приложение или открыть меню. Есть причина, что окна имеют границы - переосмыслите свой дизайн. –