int x = Control.LowOrder ((int) m.LParam.ToInt32 ());
int y = Control.HighOrder ((int) m.LParam.ToInt32 ());
- form.PointToClient (ref x, ref y);
- y += TitleBarHeight;
+ NCPointToClient (ref x, ref y);
FormPos pos = FormPosForCoords (x, y);
}
return true;
- case Msg.WM_NCMOUSEMOVE:
- return HandleNCMouseMove (form, ref m);
-
+ // Return true from these guys, otherwise win32 will mess up z-order
case Msg.WM_NCLBUTTONUP:
- return HandleNCLButtonUp (ref m);
+ HandleNCLButtonUp (ref m);
+ return true;
case Msg.WM_NCLBUTTONDOWN:
- return HandleNCLButtonDown (ref m);
+ HandleNCLButtonDown (ref m);
+ return true;
case Msg.WM_NCLBUTTONDBLCLK:
HandleNCLButtonDblClick (ref m);
break;
case Msg.WM_NCPAINT:
- PaintDecorations ();
+ PaintEventArgs pe = XplatUI.PaintEventStart (form.Handle, false);
+
+ Rectangle clip;
+ // clip region is not correct on win32.
+ // if (m.WParam.ToInt32 () > 1) {
+ // Region r = Region.FromHrgn (m.WParam);
+ // RectangleF rf = r.GetBounds (pe.Graphics);
+ // clip = new Rectangle ((int) rf.X, (int) rf.Y, (int) rf.Width, (int) rf.Height);
+ //} else {
+ clip = new Rectangle (0, 0, form.Width, form.Height);
+ //}
+
+ ThemeEngine.Current.DrawManagedWindowDecorations (pe.Graphics, clip, this);
+ XplatUI.PaintEventEnd (form.Handle, false);
return true;
}
+
return false;
}
public virtual void PointToClient (ref int x, ref int y)
{
- // toolwindows stay in screencoords
+ // toolwindows stay in screencoords we just have to make sure
+ // they obey the working area
+ Rectangle working = SystemInformation.WorkingArea;
+
+ if (x > working.Right)
+ x = working.Right;
+ if (x < working.Left)
+ x = working.Left;
+
+ if (y < working.Top)
+ y = working.Top;
+ if (y > working.Bottom)
+ y = working.Bottom;
}
public virtual void PointToScreen (ref int x, ref int y)
protected virtual void Activate ()
{
// Hack to get a paint
- NativeWindow.WndProc (form.Handle, Msg.WM_NCPAINT, IntPtr.Zero, IntPtr.Zero);
+ //NativeWindow.WndProc (form.Handle, Msg.WM_NCPAINT, IntPtr.Zero, IntPtr.Zero);
form.Refresh ();
}
return true;
}
+
private void FormSizeChangedHandler (object sender, EventArgs e)
{
ThemeEngine.Current.ManagedWindowSetButtonLocations (this);
-
- PaintDecorations ();
+ Message m = new Message ();
+ m.Msg = (int) Msg.WM_NCPAINT;
+ m.HWnd = form.Handle;
+ m.LParam = IntPtr.Zero;
+ m.WParam = new IntPtr (1);
+ XplatUI.SendMessage (ref m);
}
- private void PaintDecorations ()
- {
- PaintEventArgs pe = XplatUI.PaintEventStart (form.Handle, false);
- ThemeEngine.Current.DrawManagedWindowDecorations (pe.Graphics, pe.ClipRectangle, this);
-
- if (IsMaximized) {
- MainMenu menu = form.ActiveMenu;
- DrawMaximizedButtons (pe, menu);
- if (menu != null)
- menu.Draw (pe);
- }
-
- XplatUI.PaintEventEnd (form.Handle, false);
- }
-
- private void CreateButtons ()
+ protected void CreateButtons ()
{
switch (form.FormBorderStyle) {
case FormBorderStyle.None:
close_button = null;
minimize_button = null;
maximize_button = null;
+ if (IsMaximized || IsMinimized)
+ goto case FormBorderStyle.Sizable;
+ break;
+ case FormBorderStyle.FixedToolWindow:
+ case FormBorderStyle.SizableToolWindow:
+ close_button = new TitleButton (CaptionButton.Close, new EventHandler (CloseClicked));
+ if (IsMaximized || IsMinimized)
+ goto case FormBorderStyle.Sizable;
break;
case FormBorderStyle.FixedSingle:
case FormBorderStyle.Fixed3D:
minimize_button = new TitleButton (CaptionButton.Minimize, new EventHandler (MinimizeClicked));
maximize_button = new TitleButton (CaptionButton.Maximize, new EventHandler (MaximizeClicked));
break;
- case FormBorderStyle.FixedToolWindow:
- case FormBorderStyle.SizableToolWindow:
- close_button = new TitleButton (CaptionButton.Close, new EventHandler (CloseClicked));
- break;
}
title_buttons [0] = close_button;
{
Activate ();
- int x = Control.LowOrder ((int) m.LParam.ToInt32 ());
- int y = Control.HighOrder ((int) m.LParam.ToInt32 ());
-
start = Cursor.Position;
virtual_position = form.Bounds;
- form.PointToClient (ref x, ref y);
+ int x = Control.LowOrder ((int) m.LParam.ToInt32 ());
+ int y = Control.HighOrder ((int) m.LParam.ToInt32 ());
+
// Need to adjust because we are in NC land
- y += TitleBarHeight;
+ NCPointToClient (ref x, ref y);
FormPos pos = FormPosForCoords (x, y);
-
+
if (pos == FormPos.TitleBar) {
HandleTitleBarDown (x, y);
return true;
}
if (IsSizable) {
- SetCursorForPos (pos);
-
if ((pos & FormPos.AnyEdge) == 0)
return false;
return false;
}
- private bool HandleNCMouseMove (Form form, ref Message m)
- {
- int x = Control.LowOrder ((int) m.LParam.ToInt32 ());
- int y = Control.HighOrder ((int) m.LParam.ToInt32 ());
-
- if (IsSizable) {
- form.PointToClient (ref x, ref y);
- y += TitleBarHeight;
- }
-
- return false;
- }
-
private void FormMouseLeave (ref Message m)
{
form.ResetCursor ();
}
-
- private void SetCursorForPos (FormPos pos)
- {
- switch (pos) {
- case FormPos.TopLeft:
- case FormPos.BottomRight:
- form.Cursor = Cursors.SizeNWSE;
- break;
- case FormPos.TopRight:
- case FormPos.BottomLeft:
- form.Cursor = Cursors.SizeNESW;
- break;
- case FormPos.Top:
- case FormPos.Bottom:
- form.Cursor = Cursors.SizeNS;
- break;
- case FormPos.Left:
- case FormPos.Right:
- form.Cursor = Cursors.SizeWE;
- break;
- default:
- form.ResetCursor ();
- break;
- }
- }
protected virtual void HandleWindowMove (Message m)
{
get { return GetWindowState () == FormWindowState.Maximized; }
}
+ public bool IsMinimized {
+ get { return GetWindowState () == FormWindowState.Minimized; }
+ }
+
public bool IsSizable {
get {
switch (form.FormBorderStyle) {
}
}
- public Size ButtonSize {
- get {
- int height = TitleBarHeight;
- if (IsToolWindow)
- return new Size (SystemInformation.ToolWindowCaptionButtonSize.Width - 2,
- height - 5);
- if (form.FormBorderStyle == FormBorderStyle.None)
- return Size.Empty;
- return new Size (SystemInformation.CaptionButtonSize.Width - 2,
- height - 5);
- }
- }
-
protected void UpdateVP (Rectangle r)
{
UpdateVP (r.X, r.Y, r.Width, r.Height);
form.Capture = false;
state = State.Idle;
+ if (form.MdiContainer != null)
+ form.MdiContainer.SizeScrollBars();
}
int x = Control.LowOrder ((int) m.LParam.ToInt32 ());
int y = Control.HighOrder ((int) m.LParam.ToInt32 ());
- form.PointToClient (ref x, ref y);
-
- // Need to adjust because we are in NC land
- y += TitleBarHeight;
+ NCPointToClient (ref x, ref y);
foreach (TitleButton button in title_buttons) {
if (button != null && button.Rectangle.Contains (x, y)) {
button.Caption, ButtonState.Normal);
}
- public virtual void DrawMaximizedButtons (PaintEventArgs pe, MainMenu menu)
+ public virtual void DrawMaximizedButtons (object sender, PaintEventArgs pe)
{
-
}
protected virtual void CloseClicked (object sender, EventArgs e)
{
}
+ protected virtual void NCPointToClient(ref int x, ref int y) {
+ form.PointToClient(ref x, ref y);
+ y += TitleBarHeight;
+ y += ThemeEngine.Current.ManagedWindowBorderWidth (this);
+ }
+
protected FormPos FormPosForCoords (int x, int y)
{
int bw = ThemeEngine.Current.ManagedWindowBorderWidth (this);