Hey,
ich wollte gerade mal versuchen, einen eigenen Formrand mit GDI+ zu zeichnen. Dafür habe ich den FormBorderStyle auf None gesetzt (logisch).
Nun wollte ich diese Form aber trotzdem verschieben können, sowie ihre Größe ändern können. Dafür verwende ich folgenden Code:
Spoiler anzeigen
Das funktioniert auch alles so wie gewollt.
Nun besitzt so eine Form ohne Border aber auch kein Systemmenü (das Menü, dass sich bei Alt + Space oder bei Rechtsklick auf das Icon in der Taskleiste öffnet). Dieses kann man sich ebenfalls zurückholen, und zwar mit diesem Code:
Spoiler anzeigen
Jetzt ist aber mein Problem, dass wenn ich diesen Code ebenfalls in die Form einfüge, man ihre Größe nicht mehr ändern kann (verschieben geht noch). Weiß jemand, woran das liegt oder was ich anders machen muss/kann?
ich wollte gerade mal versuchen, einen eigenen Formrand mit GDI+ zu zeichnen. Dafür habe ich den FormBorderStyle auf None gesetzt (logisch).
Nun wollte ich diese Form aber trotzdem verschieben können, sowie ihre Größe ändern können. Dafür verwende ich folgenden Code:
C#-Quellcode
- [DllImport("user32.dll")]
- public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
- private const int WM_NCLBUTTONDOWN = 0xA1;
- private const int HT_CAPTION = 2;
- private const int HT_LEFT = 10;
- private const int HT_RIGHT = 11;
- private const int HT_TOP = 12;
- private const int HT_TOPLEFT = 13;
- private const int HT_TOPRIGHT = 14;
- private const int HT_BOTTOM = 15;
- private const int HT_BOTTOMLEFT = 16;
- private const int HT_BOTTOMRIGHT = 17;
- protected override void OnMouseDown(MouseEventArgs e)
- {
- base.OnMouseDown(e);
- if (e.Button == MouseButtons.Left)
- {
- Capture = false;
- var wParam = 0;
- if (e.Y <= borderSize && e.X <= borderSize)
- wParam = HT_TOPLEFT;
- else if (e.Y <= borderSize && e.X >= ClientSize.Width - borderSize)
- wParam = HT_TOPRIGHT;
- else if (e.Y <= borderSize)
- wParam = HT_TOP;
- else if (e.Y >= ClientSize.Height - borderSize && e.X <= borderSize)
- wParam = HT_BOTTOMLEFT;
- else if (e.Y >= ClientSize.Height - borderSize && e.X >= ClientSize.Width - borderSize)
- wParam = HT_BOTTOMRIGHT;
- else if (e.Y >= ClientSize.Height - borderSize)
- wParam = HT_BOTTOM;
- else if (e.X <= borderSize)
- wParam = HT_LEFT;
- else if (e.X >= ClientSize.Width - borderSize)
- wParam = HT_RIGHT;
- else if (e.Y <= 30)
- wParam = HT_CAPTION;
- else
- return;
- SendMessage(Handle, WM_NCLBUTTONDOWN, new IntPtr(wParam), IntPtr.Zero);
- }
- }
Das funktioniert auch alles so wie gewollt.
Nun besitzt so eine Form ohne Border aber auch kein Systemmenü (das Menü, dass sich bei Alt + Space oder bei Rechtsklick auf das Icon in der Taskleiste öffnet). Dieses kann man sich ebenfalls zurückholen, und zwar mit diesem Code:
C#-Quellcode
- protected override CreateParams CreateParams
- {
- get
- {
- CreateParams cp = base.CreateParams;
- const int WS_CLIPCHILDREN = 0x2000000;
- const int WS_MINIMIZEBOX = 0x20000;
- const int WS_MAXIMIZEBOX = 0x10000;
- const int WS_SYSMENU = 0x80000;
- const int CS_DROPSHADOW = 0x20000;
- int classFlags = cp.ClassStyle;
- if (Environment.OSVersion.Version.Major >= 6)
- classFlags |= CS_DROPSHADOW;
- cp.Style |= WS_CLIPCHILDREN | WS_MINIMIZEBOX | WS_SYSMENU | WS_MAXIMIZEBOX;
- cp.ClassStyle = classFlags;
- return cp;
- }
- }
Jetzt ist aber mein Problem, dass wenn ich diesen Code ebenfalls in die Form einfüge, man ihre Größe nicht mehr ändern kann (verschieben geht noch). Weiß jemand, woran das liegt oder was ich anders machen muss/kann?