One would imagine that clicking anywhere within the MDI Child form (or on any control) will focus that form. But in my application I can only focus a MDI child by clicking on its titlebar, which is an abnormal behavior on the part of the user. My forms are filled with either controls or panels so I don't have the luxury of just "clicking on the form." But clicking anywhere within it should focus it.
I haven't been able to find a solution to this problem although it seems others are having it as well.
I figured it out. If you are setting the child form mdiParent property after you are calling Form.Show then it messes up the focus of all the child forms.
When I set mdiParent property of the form first and then call .Show(), everything works perfectly as expected.
Related
To boil the situation down, I have a panel with 3 textboxes on it. When I hide the panel, the first textbox in the tab order for the panel gets assigned to Me.ActiveControl (The form), regardless of which one was focused when the panel was hidden.
I thought a hidden control could never have focus. I have other controls on my form where the issue was originally found, so I thought it would have to choose a non hidden control to focus on. Is this a bug, or designed this way?
I use a timer on my simple form that fires every 5 seconds, recording the active control name in a label.
I have been able to recreate your scenario and it revealed an interesting possibility (more on this later).
WinForms has the concept of the Selected (or activated) control. The Control.Select Method is related to the Control.Focus Method. The Focus Method-Remarks section documentation is relevant.
A control can be selected and receive input focus if all the following
are true: the Selectable value of ControlStyles is set to true, it is
contained in another control, and all its parent controls are both
visible and enabled.
...
Focus is a low-level method intended primarily for custom control
authors. Instead, application programmers should use the Select method
or the ActiveControl property for child controls, or the Activate
method for forms.
The ContainerControl.ActiveControl Property points to the last selected control.
The reason that the first control by tab order in the Panel is selected is due to the code that executes when the Panel.Visible property is set to false. The Visible Property setter calls SetVisibleCore that in turn calls SelectNextIfFocused that calls SelectNextControlInternal that finally calls Control.SelectNextControl that selects the your TextBox1.
This is where it gets interesting. At this point the Panel and TextBox are both visible. Therefore, the TextBox receives focus and retains it when the Panel is hidden. This condition allows for a hidden TextBox to have keyboard input and no rules about a hidden control not being able to receive focus are violated.
I am trying to make a transparent control with child controls that are visible and opaque.
I have added a panel control to the main form via code in the form load event. In this I am adding five buttons as child controls like: panel.controls.add(). To all of these, I have set backcolor=color.transparent.
When I run this program, the button background shows the background of the next button in the panel. If I open a child form, then I can see labels on the child form as the background of the panel.
I want to make container panel control completely transparent, so I can see the main form through it. How can this be achieved?
When the form loads, you can see neighbor buttons behind the actual buttons
"Perform Check" is a label on a child form which I opened right before taking this picture.
: "Check Cases and Combinations" is a button on a child form which I opened right before I took this picture.
How can I make it truly transparent? Why doesn't the background of the panel control refresh with the main form background? The panel sort of "keeps" whatever happens on the main form and shows it as a background.
I found out there some issues with setting controls that are transparent and on top of other controls in the main form. They take the background of the container form, whether or not there is any control in between. I used WPF form instead of the panel and it worked perfectly.
I am working with MDI forms and have an MDI Parent opening different MDI Children. On one particular MDI Child I want to open a normal window on the same screen as the Child, but when I move the MDI parent to a new screen, the normal window continuously opens on the primary screen.
I have tried a multitude of diffent things but can't seem to resolve it.
Does anyone have any suggestions?
The form is about 4 levels down. So from the Parent, I have opened a Child, then from that Child I have opened another form inside the Parent, and from there I want to open another form that sits on top of everything at a specific location. I also want to be able to close this form using the 'Deactivate' method so it can't be a ShowDialog from as far as I can see.
Hope that all makes sense. Thanks
You must make this form a child of the parent. You can do this by using
Form.MDIParent = Me.MDIParent
Form.Show
That should do the trick.
anybody use .NET MDI containers much?
I've got an MDI Parent form that creates a bunch of smaller MDI child forms within it after a user clicks a toolbar. The child forms are all set to have the maximize button, and when clicked, they fill the parent container. But here's my problem:
Once you maximize one child, all of the subsequent child forms you open are maximized as well. Likewise, if you have several child forms open and maximized, clicking the shrink window button shrinks all of them.
Anyway to get around this?
Thanks,
Elliot
Sounds like this could break alot of things you would not want to break
http://social.msdn.microsoft.com/Forums/en/winforms/thread/4760c883-f789-4b91-8843-38863ad3add2
you might want to try a different approach
I have a MDI parent that opens another form like this:
Dim frm As New Form1
frm.ShowDialog(Me)
That form has a button that, when clicked, does this:
CreateObject("Shell.Application").ToggleDesktop()
The button operates as expected (showing the desktop) most of the time but occasionally does not minimize the MDI parent. All the other windows, including the form above get minimized every time.
Why is this happening, and how do I fix it?
Instead of trying to allow a form shown with ShowDialog I changed the angle from which I'm approaching. I'll show the form with Show and assign the MdiParent and just fake the modality of the form instead. The fake modal will disable all other parts of the MDI parent except the system buttons in the title bar. If the user attempts to close the MDI parent, the "modal" window will beep once and blink the title bar a bit.