C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
It must be positioned automatically. It should appear in the correct place regardless of where the first window is. We manipulate the coordinates of Windows Forms.
Intro. We solve the problem with some methods. Our example will position itself to the bottom. Let's look at some useful properties we need to use to solve this problem and make your program much more graceful and useful.
Methods: WorkingArea.Height: This returns the height of the screen minus the taskbar in pixels. WorkingArea.Width: Width of screen, minus the Vista sidebar or anything else. Height: This is the height of your window in pixels. Width: This is the width of the window in pixels. Location: Top left corner of the form in pixels relative to the screen. X and Y: Horizontal and vertical coordinates of Point.
Example. Here we adjust the position of the window before it is shown. Look at the Screen.PrimaryScreen WorkingArea.Height and Width properties above. These are the most important trick to this project.
Here: We see the approach we will use to position windows like a palette relative to another window. This will position to the bottom.
Window that positions a sub-window: C# /// <summary> /// A Windows Form. /// </summary> public partial class MainWindow : Form { /// <summary> /// The Windows Form we want to position. /// </summary> ReporterWindow _reporterWin = new ReporterWindow(); public MainWindow () { InitializeComponent(); } private void reportMoveToolStripMenuItem_Click(object sender, EventArgs e) { // This is an event handler triggered by a menu item (or button). PositionReporterEdge(); // Position the window. _reporterWin.Show(); } /// <summary> /// Position the "Reporter" form next to the current form. /// </summary> private void PositionReporterEdge() { int screenHeight = Screen.PrimaryScreen.WorkingArea.Height; int screenWidth = Screen.PrimaryScreen.WorkingArea.Width; Point parentPoint = this.Location; int parentHeight = this.Height; int parentWidth = this.Width; int childHeight = _reporterWin.Height; int childWidth = _reporterWin.Width; int resultX; int resultY; if ((parentPoint.Y + parentHeight + childHeight) > screenHeight) { // If we would move off the screen, position near the top. resultY = parentPoint.Y + 50; // move down 50 resultX = parentPoint.X; } else { // Position on the edge. resultY = parentPoint.Y + parentHeight; resultX = parentPoint.X; } // set our child form to the new position _reporterWin.Location = new Point(resultX, resultY); } }
The example shows how to get the sizes of both windows. It uses several built-in classes. Obviously, for our calculations to work we must know the positions and sizes of both windows we want to position.
We must get the size of the working area, meaning the size of the user's desktop minus the taskbar. We use the WorkingArea class for this. Before we place the form, we need to make sense that our new position makes sense.
And: After we make that check of the desired Location, we place the new Form. We assign the Location.
Call the PositionReporterEdge method before you show the ReporterWin Windows Form. The above function supports positioning a new window to the bottom, which is a fairly common position for palettes and similar windows.
Tip: You can add left, right and top if you need them. The method can be modified with additional features.
FormBorderStyle. I have found that the FormBorderStyle of "FixedToolWindow" looks best for palettes. This will mean that your form will look like a palette in Photoshop. I have found that a "FixedSingle" style looks good for a "Find and Replace" window.
Uses. I have used this method or one similar to it for creating windows like palettes that show next to the side of a window. The example code here is for a reporting window for a move on a game board (think chess or a board game).
Also: I have used it for a "Find in this page" window, similar to Microsoft Word's.
Summary. We positioned a window on the edge of another window, using Windows Forms. You can achieve an awesome user experience with a palette window or a find window, or other types of windows.