Forms don't render properly in Visual Studio - c#

I am using Visual Studio Community 2017, but the same problem appeared on older versions too. In almost every WinForm app in form_load I write this:
FormBorderStyle = FormBorderStyle.FixedSingle;
CenterToScreen();
Before any code, in form properties, I always set ShowIcon to false, and FormBorderStyle to None. But, always I experience the same problems:
1) Instead of nothing I see little Console Icon in top-left corner of window.
2) two stripes (I'd say 10-20 pixels wide) on right and bottom side of form's window don't render at all.
I need to minimize and open the window back to fix that. After minimizing Form is rendered fully. How can I fix this? This became really annoying.
Here is a screenshot:
Bad rendering

I found the solution. Don't write this commands in form_load void, but in constructor:
public Form1()
{
InitializeComponent();
FormBorderStyle = FormBorderStyle.FixedSingle;
CenterToScreen();
}
And the Icon will hide properly :)

Related

App opens maximized when it should not

I have a C# winforms application with a fixed-size starting dialog. After making some changes entirely unrelated to this form, the form now opens maximized, filling the entire screen with the actual content still at the regular size in upper left corner. Dragging the title bar down a bit with the mouse causes it to restore to its appropriate size.
The form has
MaximizeBox = False
StartPosition = CenterScreen
FormBorderStyle = Fixed3D
Does anyone have any suggestions what might be causing it to open maximized, and how to stop it?
Edit:
WindowState = Normal
is also set.
Edit 2:
I found the problem. My update routine was shutting down the original process so it could be updated (inappropriately, but that is a different bug), then restarting it with code I had borrowed from elsewhere, and part of that restart code was:
process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
Thank you for the assistance. Though no direct answer was given (nor expected with the spotty information), it did point me in the right direction.
The Window being Maximised is normally set on the forms "WindowState", Light Reading. You need this to be set to WindowState.Normal. It's possible someone's set it to maximised in the designer? or somewhere else in the code. the 3 lines of code you have shown are not the problem.
Edit:
You need to do some investigation if you cant give us code from your form, Hook into some resize events, and see what's triggered it off. Forms dont just start up maximised unless they're told to and maximizing a window triggers a resize event.

Strange effect of the form minimization in Windows Forms

I have my own minimize button with the following code on the Click event:
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
this.notifyIcon.Visible = true;
Sometimes when I click on it, the form appears in the left bottom corner of the screen like this:
Why? What am I doing wrong? How can I fix it?
Thanks in advance.
It is a counter-measure against you setting ShowInTaskbar to false. The user won't be able to restore it so Windows makes it a minimum size window instead of hiding it. Otherwise without paying attention to the fact that you've prevented that from working as well by making it a borderless window.
You need to call Hide() instead.
According to this link
you need to add
this.FormBorderStyle = FormBorderStyle.None;
to your minimization event.

Do it yourself MDI

I have created an MDI application that I want to add a ToolStripContainer to. My first try was to just add one and dock it on Top. Problem I got here was moving ToolStrips inside the container's ToolStripPanels would create an extra Row which was invisible.
Then I saw this question and tried to implement my do-it-yourself MDI interface, using the ToolStripContainer's ContentPanel as where the windows go. This way, I can have my ToolStrips anywhere around the MDI.
The code I have is as follows:
Form f = new Form();
f.TopLevel = false;
tsContainer.ContentPanel.Controls.Add(f);
It all works remarkably well, but I am wondering if this is smart, would I not run into problems later on? Also, if this is possible, why have the entire MDI functionality in Windows?
By setting the TopLevel property to false, the form essentially turns into a UserControl. Do note that you have to explicitly set the Visible property to true, it isn't automatic.
But yes, there certainly are problems and it doesn't behave like an MDI child window at all. The biggest issue should be readily visible, the form can no longer be activated. Very noticeable from its caption bar, it will always be rendered with the colors for a non-active window. It however still works like a caption bar, the user can drag the window and move it around. Which has the clear failure mode that the window is going to get clipped without scrollbars. Not only that, the window can still be maximized and minimized by double-clicking the caption. An MDI child does this very differently. And the visual style for the frame will be wrong in Windows 8.x, looking like a Win7 frame instead, a quirk that has no known workaround.
Realistically, you have to set the FormBorderStyle property to None so it behaves more like a true child window. Or write a bunch of fairly nasty code in the WndProc() override to tame the window, you'll be doomed to re-invent an MDI child, imperfectly.
Which is otherwise a fine way to embed a form. The only remaining quirk after fixing the border is that the form still gets added to the Application.OpenForms collection.

Switching top-most form without flickering

I'm developing a magnifier in C# .NET (using WindowsForm) that shows a top-most click-able through form. This top-most window shows an specific part of the screen.
The problem I'm having is that to take the screenshot I need to Hide() and Show() the form (otherwise I would take a screenshot of the magnifier) and this creates an annoying flickering in which the magnifier disappears and rapidly appears again.
How could I take a screenshot of the Desktop without hiding/showing the form?
Is there another approach/workaround?
Thanks.
Use the form's Opacity property. Set it to 99% in the designer. When you are ready to take the screen shot, set it to 0, make the shot and set it back to 0.99.
The change is instant, no need to wait and no flicker or repainting. Do not restore it to 1.0, that flickers.
Do beware that you remove the "Hall of Mirrors" effect from the magnifier. Bit of a loss :)

Preventing Winform from being maximized?

I want to prevent my desktop application from being maximized. It should not become maximized by any means - by double clicking on title bar, or by clicking Windows + Up arrow on the keyboard, etc.
-> I disable both the MaximizeBox and MinimizeBox.
-> I also set the MaximumSize and MinimumSize for my WinForm
Still when I press Windows + Up arrow, my win form Shifts to top left of the screen, I mean it gets maximized.
So please tell me any way to prevent this thing happening...
There are actually two completely separate issues at work here. Granted, they look basically the same from a functional perspective, but from an implementation-model perspective (as Windows itself would naturally use) they are unrelated.
As others have answered, you can prevent your form from being maximized by setting its MaximizeBox property to false. This removes the WS_MAXIMIZEBOX style on the form's underlying window, which prevents the window manager from allowing the window to be maximized. It disables the maximize box on the window's caption bar (the one between the minimize box and the close box), disables the "Maximize" option on the window/system menu, and any other methods of maximizing a window that I may have forgotten.
However, this has nothing to do with the Win+↑ keyboard shortcut, which invokes Aero Snap the same as would dragging the window to the the magic position sat the edges of the screen. The window manager, whether as a result of a bug or a feature of Aero Snap, still allows you to effectively "maximize" windows that should not otherwise be maximized. Setting the MaximizeBox property doesn't affect this, so if you truly want to prevent the user from changing the window's size this way, you will need to disable Aero Snap's effect on your window.
Unfortunately, there's no method (at least, not to my knowledge) of programmatically disabling Aero Snap on a per-window or per-process basis (also see this related question). If the user has Aero Snap enabled, you can assume that they want that behavior and applications aren't supposed to tamper with it. The only thing you can do is completely disable resizing your window. In WinForms, you do that by setting the FormBorderStyle property to one of the following: FormBorderStyle.FixedSingle, FormBorderStyle.Fixed3D, or FormBorderStyle.FixedDialog. If you still want your window to be resizable in other ways, you will need to write the code to handle that manually, which is not a particularly easy task.
Thus, I encourage you to very carefully consider whether this is really necessary. All other non-maximizable windows accomplish this simply by setting the MaximizeBox property (or doing the equivalent in their UI framework), which means that they can still be effectively maximized via Aero Snap. If this works for everyone else's windows, including those that are part of Windows itself, it should probably work for you.
The form has a property called MaximizeBox - set this to false.
In regard to your second question, check out this question and it's answers for the best ways to implement keyboard shortcuts in WinForms.
this.FormBorderStyle = FormBorderStyle.FixedSingle;
That line of code will prevent the user from re-sizing the Window.
In addition to that you hide/disable the maximize box and that should do what you asked.
To disable the maximize box use this
this.MaximizeBox = false;
To hide the maximize box use this as well
this.MinimizeBox = false;
If Maximize and Minimize are set to false the buttons disappear.
Setting the MaximumSize equal to the Size (or some size) at least stops the windows from going full-screen. It still snaps to the top left corner but it's still a window at least and looks right - like it's Windows being stupid instead of your program.
You can prevent the windows snapping to the upper left corner by setting:
private void toolbox_Move(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Normal;
}
in the move event of the form.
There is a property of the Form class named "MaximumBox" you have to set False in the properties window of your form... This actually will disable the form from being maximized by any way... Also if you want to control your form sizes you can work with such properties as "MinimumSize, MaximumSize" setting their values at your discretion or creating an event handler for the MaximumSizeChanged and MinimumSizeChanged events...
You can try to RegisterHotKey Win+Up if your window or application is activated and unregister this hot key if it is deactivated. You must catch the hotkey and return appropriate value to prevent further processing.
Look at WM_ACTIVATEAPP, WM_ACTIVATE and WM_NCACTIVATE. The first can be used if you want to disable the Win+UP for all your windows.
Set formborderstyle to fixedsingle
Maximizebox=false
Set the maximumsize to the size of winform's default size
Ex: if size(646,385) then set maximumsize(646,385)
One thing you can do is set the MaximumSize and MinimumSize in the same value but not 0,0.
It's easy easy! Apply the folling code to maintain window's state to normal when a resize event is triggered.
protected override void OnResize(EventArgs e) {
base.OnResize(e);
WindowState = FormWindowState.Normal;
}

Categories

Resources