Placing Image control in MDI form - winforms

I have placed an image controls in center the mdi. But when I an opening a child form the form form appears below the image control.
Please help ???

A small idea to solve this problem.
Use a picture box to show your image in MDI form and try the code below:
Private Sub MDIFORM_MdiChildActivate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MdiChildActivate
Dim cnt As Integer = 0
For Each frm As Form In My.Application.OpenForms
cnt += 1
Next
If cnt > 1 Then
Me.PictureBox1.Hide()
Else
Me.PictureBox1.Show()
End If
End Sub

Once the outer form is an MdiParent, the mdiclient area will expand to fill all space not used by other containers. So you'll either need to put the image somewhere else (e.g., a panel docked to the left, separated by a Splitter from the mdi client area) or not put the image on child forms.

This is the way MDI forms work in .NET. According to my copy of Professional VB 2005 (Wrox), "in VB.NET, an MDI parent can contain any control that a regular form can contain. Buttons, labels, and the like can be placed directly on the MDI surface. Such controls will appear in front of any MDI child forms that are displayed in the MDI client area" (emphasis mine)
I imagine what you're trying to do is have some kind of logo appear in the client area in the MDI form? In this case, you will need to draw this in the form's Paint event rather than using an Image control.

Related

How to dim a WinForms form when it is about to open another form and then revert to full legibility when the opened form closes?

How to dim Form1 just before it opens Form2, and then when Form2 closes, return Form1 to its original visibility/legibility? How would that be accomplished?
I am not speaking about opacity but about an effect that is like a gray shade has been pulled down, hiding the form, but leaving the borders visible.
(I need to make it so the information on these two forms is never visible on screen simultaneously, and users are confused when I do this using opacity.)

WinForms : how to add toolStrip to a form already divided into left/right panes using a SplitContainer control

My form is divided up into left and right panes, and the right pane is split into upper and lower panes:
AAAABBBB
AAAACCCC
There's a menu-strip at the top, below the title-bar and a status bar at the bottom:
menuStrip
AAAABBBB
AAAACCCC
status
Now I would like to add a toolStrip below the menuStrip. But when I do so, the toolStrip obscures the topmost content of the panes created using the splitContainer control. The Dock for the toolStrip = Top.
What am I doing wrong that the toolStrip doesn't simply get inserted between the menuStrip and the splitContainer control, pushing the splitContainer control down, so to speak?
You have to play with the BringToFront and SendToBack context menu items of those controls in the designer.
Drop the toolstrip container onto the form, then open the Document Outline window to re-arrange the controls into the correct hierarchy.
There are 2 simple ways of doing that:
Method 1
Open Document Outline window: View\Other windows\Document outline. Use buttons to place your control in the correct place
Method 2
Notice, that the current control in designer form is marked with some kind of focus rectangle.
You can easily navigate through current control parents using Esc key: once pressed, it can be used to go exactly one parent up in hierarchy.
Knowing the above just place your control in any place, cut it and then past it in the correct container. Repeat the step for any other control which is not in a good position
When you need to change the order of control in the same container use Bring To Front and Bring To Back from context menu
You have to set the splitcontainer's dock to none and instead use its anchor settings

Redraw and flicker issues

I have an Outlook style app. So basically I have a sidebar on the left and on the right I have a panel control (pnlMainBody) that hosts content.
The content is typically a user control that I add to the panel when user clicks appropriate button in the side bar. The way I add the user control to the panel is as follows:
// _pnlEmails is the User Control that I am adding to the panel
_pnlEmails = new pnlEmails();
_pnlEmails.Dock = DockStyle.Fill;
this.pnlMainBody.Controls.Add(_pnlEmails);
Some of the user controls that I add to the main panel are quite complex UI-wise. So when this.pnlMainBody.Controls.Add(_pnlEmails); fires, I see the control appear on the screen, then it resizes itself to fill the body of the panel control.
It's quite ugly actually, so I was wondering whether there is a way to not show the resizing until it's actually done resizing?
I've tried setting the user control's .Visible to false. I've tried doing .SuspendLayout, all to no avail.
Is there a way to do this so the screen transitions are smooth?
First try to turn on double buffer painting in the parent form by setting:
this.DoubleBuffered = true;
Do that in your load handler or some such place to see if the flicker goes away.
If that doesn't work you can also try to set the DoubleBuffered property to true for the child controls if they are .NET Control-derived entities. Here's some code that I used recently to get controls that did not expose the double buffer property to paint nicely: (vb version. Do you need C#?)
Private Sub ForceDoubleBuffering(ByVal o As Object)
Dim ctrl As Control
Dim method As Reflection.MethodInfo
Dim flags As Reflection.BindingFlags
ctrl = TryCast(o, Control)
flags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic
method = ctrl.GetType().GetMethod("SetStyle", flags)
method.Invoke(ctrl, New Object() {ControlStyles.OptimizedDoubleBuffer, True})
End Sub
I figured out the trick to solving the issue. As I long as I set up the Dock.Fill property after adding the control to the main panel, there is no flicker.
this.pnlMainBody.Controls.Add(_pnlEmails);
_pnlEmails.Dock = DockStyle.Fill;

Is it possible to autosize WebBrowser control?

I need to display some portion of html in my windows forms application. It's necessary that this html will be displayed without any scrollbars.
I tried to use WebBrowser control for my task, but it lacks of AutoSize property. Is it possible to determine minimal height necessary to display all contents without scrolling somehow?
Set ScrollBarsEnabled to false. Define the size based on your target minimum width. Add a handler to the webbrowser documentcompleted event as follows:
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
WebBrowser1.Size = WebBrowser1.Document.Body.ScrollRectangle.Size
End Sub
Here's a link to a C# WebBrowser wrapper which may do what you need:
http://www.codeproject.com/KB/miscctrl/csEXWB.aspx?msg=2526724
To do what you need, I think you would access the document on the page and then the element you're displaying, and get its height and width properties, and then adjust your WebBrowser control to be a few pixels larger than that. I think the WebBrowser wrapper control in the link can do the first part of this task (get the element's height and width).

Automatic proportionate resizing of Windows Form Components?

I have a Windows Forms form in C#.
It is just like a regular Windows GUI application. However I am facing problems making the different components on the form resize themselves according to the window size. I mean I do not exactly know which property of the component is to be changed.
I have a tabPage in the form. The tabPage contains a splitcontainer which has 2 panels in it.
The left panel contains a treeView and the right panel has components like radio buttons, textboxes, comboBox and buttons,etc
When I run my application and resize the window (either by dragging a corner of the window or by hitting the maximize button on top right corner) the Windows Forms form and the tabPage expand but the split container doesn't. It stays where it was. Also I want to anchor the split container so that if I shrink my window, the split cointainer still remain on top left. I am sorry I cannot put screenshots here.
Just set the Anchor property of the SplitContainer to Top, Left, Right, Bottom. Or experiment setting the Dock property to Fill.
Have you tried using a TableLayoutPanel? Windows Forms doesn't have great layout support (compared with, say, Java and WPF) but TLP works reasonably well - until you find a situation where it doesn't do what you want, and then it's a pain :)

Resources