Existe uma maneira de tornar um formulário sem borda (FormBorderStyle definido como "nenhum") móvel quando o mouse é clicado no formulário como se houvesse uma borda?
109
Este artigo em CodeProject detalha uma técnica. Basicamente se resume a:
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.DllImport("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);
}
}
Isso basicamente faz exatamente o mesmo que pegar a barra de título de uma janela, do ponto de vista do gerenciador de janelas.
Form1_MouseDown
não está atribuído aoMouseDown
evento real deForm1
.this.MouseDown += ...
àMain()
função para o formulárioNão vamos tornar as coisas mais difíceis do que precisam ser. Eu encontrei tantos trechos de código que permitem que você arraste um formulário (ou outro controle). E muitos deles têm suas próprias desvantagens / efeitos colaterais. Especialmente aqueles em que enganam o Windows fazendo-o pensar que um controle em um formulário é o formulário real.
Dito isso, aqui está o meu trecho. Eu uso isso o tempo todo. Também gostaria de observar que você não deve usar this.Invalidate (); como outros gostam de fazer porque faz com que o formulário pisque em alguns casos. E em alguns casos isso acontece. Usando this.Update, não tive problemas de oscilação:
fonte
Outra maneira mais simples de fazer a mesma coisa.
fonte
use MouseDown, MouseMove e MouseUp. Você pode definir um sinalizador de variável para isso. Eu tenho uma amostra, mas acho que você precisa revisar.
Estou codificando a ação do mouse em um painel. Depois de clicar no painel, seu formulário será movido com ele.
fonte
WPF apenas
não tenho o código exato em mãos, mas em um projeto recente, acho que usei o evento MouseDown e simplesmente coloquei isto:
Método Window.DragMove (MSDN)
fonte
Ref. link de vídeo
Isso é testado e fácil de entender.
fonte
WM_NCHITTEST
disfarçado.Não há propriedade que você possa alterar para fazer isso acontecer magicamente. Observe os eventos do formulário e torna-se bastante trivial implementar isso definindo
this.Top
ethis.Left
. Especificamente você vai querer olhar paraMouseDown
,MouseUp
eMouseMove
.fonte
isso pode resolver seu problema ....
fonte
https://social.msdn.microsoft.com/Forums/vstudio/en-US/d803d869-68e6-46ff-9ff1-fabf78d6393c/how-to-make-a-borderless-form-in-c?forum=csharpgeneral
Este trecho de código do link acima funcionou no meu caso :)
fonte
Melhor maneira que encontrei (modificada, é claro)
Para aplicar o arrasto a um controle, basta inseri-lo após InitializeComponent ()
fonte
Funcionou para mim.
fonte
Para .NET Framework 4,
Você pode usar
this.DragMove()
para oMouseDown
evento do componente (mainLayout neste exemplo) que você está usando para arrastar.fonte
A maneira mais fácil é:
Primeiro crie um rótulo denominado label1. Vá para eventos de label1> eventos de mouse> Label1_Mouse Move e escreva estes:
fonte
Eu estava tentando fazer um formulário de janelas sem borda móvel que continha um controle de host de elemento WPF e um controle de usuário WPF.
Acabei com um painel de pilha chamado StackPanel em meu controle de usuário WPF que parecia a coisa lógica para tentar clicar para mover. Tentar o código do junmats funcionou quando movi o mouse lentamente, mas se movesse o mouse mais rápido, o mouse se moveria para fora do formulário e o formulário ficaria preso em algum lugar no meio do movimento.
Isso melhorou sua resposta para a minha situação usando CaptureMouse e ReleaseCaptureMouse e agora o mouse não se move para fora do formulário enquanto o move, mesmo que eu o mova rapidamente.
fonte
Como algumas respostas não permitem que os controles filhos sejam arrastáveis, criei uma pequena classe auxiliar. Deve ser passado o formulário de nível superior. Pode ser mais genérico, se desejado.
fonte
Além disso, se precisar fazer o DoubleClick e tornar seu formulário maior / menor, você pode usar a primeira resposta, criar uma variável int global, adicionar 1 sempre que o usuário clicar no componente que você usa para arrastar. Em
variable == 2
seguida, torne seu formulário maior / menor. Use também um cronômetro a cada meio segundo ou segundo para fazer o seuvariable = 0
;fonte
Adicionar um
MouseLeftButtonDown
manipulador de eventos à MainWindow funcionou para mim.Na função de evento que é gerada automaticamente, adicione o código abaixo:
fonte
Estou expandindo a solução de jay_t55 com mais um método
ToolStrip1_MouseLeave
que trata o evento do mouse se movendo rapidamente e saindo da região.fonte
Eu tentei o seguinte e pronto, minha janela transparente não estava mais congelada no lugar, mas podia ser movida !! (jogue fora todas as outras soluções complexas acima ...)
fonte
Formulário 1():
new Moveable(control1, control2, control3);
Classe:
fonte
fonte