Czy istnieje sposób, aby formularz, który nie ma obramowania (FormBorderStyle jest ustawiony na „brak”), byłby ruchomy po kliknięciu myszą na formularzu, tak jakby istniała ramka?
109
W tym artykule na CodeProject opisano szczegółowo technikę. Zasadniczo sprowadza się do:
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);
}
}
Zasadniczo robi to dokładnie to samo, co chwytanie paska tytułu okna, z punktu widzenia menedżera okien.
Form1_MouseDown
nie jest przypisany do rzeczywistegoMouseDown
zdarzeniaForm1
.this.MouseDown += ...
doMain()
funkcji formularzaNie róbmy rzeczy trudniejszych niż to konieczne. Natknąłem się na tak wiele fragmentów kodu, które pozwalają przeciągać formularz (lub inną kontrolkę). Wiele z nich ma swoje wady / skutki uboczne. Szczególnie te, w których oszukują system Windows, aby pomyślał, że kontrolka w formularzu jest rzeczywistą formą.
Biorąc to pod uwagę, oto mój fragment. Używam go cały czas. Chciałbym również zauważyć, że nie powinieneś używać this.Invalidate (); jak lubią to robić inni, ponieważ w niektórych przypadkach powoduje to migotanie formularza. A w niektórych przypadkach tak się dzieje. Używając this.Update, nie miałem żadnych problemów z migotaniem:
źródło
Kolejny prostszy sposób na zrobienie tego samego.
źródło
użyj MouseDown, MouseMove i MouseUp. Możesz ustawić w tym celu flagę zmiennej. Mam próbkę, ale myślę, że musisz powtórzyć.
Koduję działanie myszy do panelu. Po kliknięciu panelu formularz przesunie się wraz z nim.
źródło
Tylko WPF
nie mam pod ręką dokładnego kodu, ale myślę, że w ostatnim projekcie użyłem zdarzenia MouseDown i po prostu umieściłem to:
Metoda Window.DragMove (MSDN)
źródło
Nr ref. link do filmu
Jest to sprawdzone i łatwe do zrozumienia.
źródło
WM_NCHITTEST
w przebraniu.Nie ma właściwości, które można odwrócić, aby stało się to magicznie. Spójrz na zdarzenia dla formularza i wdrożenie tego przez ustawienie
this.Top
ithis.Left
. W szczególności warto przyjrzeć sięMouseDown
,MouseUp
iMouseMove
.źródło
to może rozwiązać twój problem ....
źródło
https://social.msdn.microsoft.com/Forums/vstudio/en-US/d803d869-68e6-46ff-9ff1-fabf78d6393c/how-to-make-a-borderless-form-in-c?forum=csharpgeneral
Ten fragment kodu z powyższego linku załatwił sprawę w moim przypadku :)
źródło
Najlepszy sposób, jaki znalazłem (oczywiście zmodyfikowany)
Aby zastosować przeciąganie do kontrolki, po prostu wstaw to po InitializeComponent ()
źródło
To zadziałało dla mnie.
źródło
W przypadku .NET Framework 4
Możesz użyć
this.DragMove()
dlaMouseDown
zdarzenia składnika (w tym przykładzie mainLayout), którego używasz do przeciągania.źródło
Najłatwiej jest:
Najpierw utwórz etykietę o nazwie label1. Przejdź do zdarzeń label1> zdarzenia myszy> Label1_Mouse Move i napisz te:
źródło
Próbowałem zrobić ruchomy formularz okna bez obramowania, który zawiera kontrolkę hosta elementu WPF i kontrolkę użytkownika WPF.
Skończyło się na panelu stosu o nazwie StackPanel w mojej kontrolce użytkownika WPF, który wydawał się logiczną rzeczą, aby spróbować kliknąć, aby przenieść. Wypróbowanie kodu junmats działało, gdy poruszałem myszą powoli, ale jeśli poruszałem myszą szybciej, mysz odsuwałaby się od formularza, a forma utknęłaby gdzieś w połowie ruchu.
To poprawiło jego odpowiedź dla mojej sytuacji przy użyciu CaptureMouse i ReleaseCaptureMouse, a teraz mysz nie odsuwa się od formularza podczas przenoszenia go, nawet jeśli poruszam się szybko.
źródło
Ponieważ niektóre odpowiedzi nie pozwalają na przeciąganie kontrolek podrzędnych, stworzyłem małą klasę pomocniczą. Należy przejść formularz najwyższego poziomu. W razie potrzeby można uczynić bardziej ogólnym.
źródło
Jeśli chcesz skorzystać z DoubleClick i powiększyć / pomniejszyć swój formularz, możesz użyć pierwszej odpowiedzi, utworzyć globalną zmienną int i dodać 1 za każdym razem, gdy użytkownik kliknie komponent, którego używasz do przeciągania. Jeśli
variable == 2
więc powiększ / pomniejsz swoją formę. Użyj również timera co pół sekundy lub sekundy, aby zrobićvariable = 0
;źródło
Dodanie programu
MouseLeftButtonDown
obsługi zdarzeń do MainWindow zadziałało dla mnie.W funkcji zdarzenia, która jest generowana automatycznie, dodaj poniższy kod:
źródło
Rozszerzam rozwiązanie z jay_t55 o jeszcze jedną metodę,
ToolStrip1_MouseLeave
która obsługuje zdarzenie, w którym mysz porusza się szybko i opuszcza region.źródło
Wypróbowałem następujące i presto changeo, moje przezroczyste okno nie było już zamarznięte, ale można je było przesunąć !! (odrzuć wszystkie inne złożone rozwiązania powyżej ...)
źródło
Formularz 1():
new Moveable(control1, control2, control3);
Klasa:
źródło
źródło