views:

392

answers:

4

Is it possible to change the style of a WinForm border? I know that if the border is removed, it takes away the functionality to resize the program. Therefore is there a way to change the style of it? At the moment, I've removed the text from the border, set the "FormBorderStyle" to "SizableToolWindow" and set the "ControlBox" to false. That makes it look like this:
alt text

But I want it to look something like this, but still be resizeable: (Maybe with a different color line) alt text

A: 

I dont think there is a direct way to do this.

But, you could set the form border style to None. And implement the resizing in your form(which I don't think its difficult)

SysAdmin
Resizing might not be trivial because the cursor no longer changes to the size cursor when you move the mouse to the edges of your form.
Mr Roys
Could I maybe put a panel on my form, like the image above. And then have that resize my form when someone resizes the panel? I could make the panel Anchor to the top, bottom, left and right so it would always be the same size as the form. Do you know any code I could use to do this?
Joey Morani
@MrRoys - changing cursor will be the most easiest thing one could ever do.
SysAdmin
@Dodi300 - you could do as you suggested. but you dont need that. you could eazily draw a rectangle on the form and check if the mouse pos overlaps the rectangle in MouseMove Event of the form. If it overlaps change the cursor and perform the logic to resize the form
SysAdmin
Please could you give some example code? How would I get the form to resize? Thanks.
Joey Morani
@SysAdmin - oops, didn't make myself clear - was referring to the manual resizing code, not the changing of the cursor - @Veer's and your suggestion sound good though.
Mr Roys
+4  A: 

What you seek is not simple because the border is drawn by the operating system. However, there is a library on CodePlex that does make possible to do this very thing.

Drawing Custom Borders in Windows Forms

Thomas
A: 
string position = String.Empty;
Point mouseDownPosition = new Point();

private void myForm_MouseDown(object sender, MouseEventArgs e)
{
    position = (e.X == 0) ? "Left" : ((e.X == myForm.Width) ? "Right" : String.Empty;
    position += (e.Y == 0) ? "Top" : ((e.Y == myForm.Height) ? "Bottom" : String.Empty;
    if(position != String.Empty)
    {
        mouseDownPosition = e.Location;
    }
}

private void myForm_MouseMove(object sender, MouseEventArgs e)
{
    if(position != String.Empty)
    {        
        Point movementOffset = new Point(e.Location.X - mouseDownPosition.X, e.Location.Y - mouseDownPosition.Y);
        Switch(position)
        {
            Case "LeftTop":
                myForm.Location.X += movementOffset.X;
                myForm.Location.Y += movementOffset.Y;
                myForm.Width -= movementOffset.X;
                myForm.Height -= movementOffset.Y;
            Case "Left":
                myForm.Location.X += movementOffset.X;
                myForm.Width -= movementOffset.X;
            // Complete the remaining please :)
        }
    }
}

private void myForm_MouseUp(object sender, MouseEventArgs e)
{
    position = String.Empty;
}

P.S: Have not yet tested it

Hope you've set FormBorderStyle to None

Veer
A: 

First write this in the InitializeComponent():

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_RIGHT = 0xB;

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();

this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Resize_Form);

Then, use a method similar to this. In this case, my form is only resizable from the right side, but should be easy to make it resize from any side:

    private void Resize_Form(object sender, MouseEventArgs e)
    {
        if ((e.Button == MouseButtons.Left) && (MousePosition.X >= this.Location.X + formWidth - 10))
        {
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.SizeWE;
            ReleaseCapture();
            SendMessage(Handle, WM_NCLBUTTONDOWN, HT_RIGHT, 0);
            formWidth = this.Width;
        }
    }
Steve