Suppose there is a picturexox on the panel
and there is a datagridview on the picturebox.
I use the following code to capture the panel:
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(panel1.ClientRectangle.Width, panel1.ClientRectangle.Height);
panel1.DrawToBitmap(bmp, panel1.ClientRectangle);
bmp.Save(#"test.jpg");
But it seems that only the picturebox has been captured, the datagridview on it is missing.
How can capture the picturebox together with the datagridview?
The DrawToBitmap method will capture the graphics drawn in the Paint event and all nested controls. If one is missing it isn't nested either directly of indirectly. Here is how this probably happened:
The designer behaviour of Panels and PictureBoxes is different.
Panels, like GroupBoxes, TabPages and a few more are container controls.
This means that any control you drag onto them with your mouse gets nested in them.
PictureBox is not a Container, like, say a Button or a Label..
To nest your DataGridView in the PictureBox you have a choice of
moving it there with the keyboard (!)
nesting it in code ( yourDGV.Parent = yourPBox1;)
Do test the success of the keyboard way by moving the PictureBox to see if the DGV moves with it..
Update:
If you nest the DGV in the PictureBox, which itself is nested in the Panel, all will be well and the result will looks just like what you see.
However, if you nest both DGV and PictureBox in the Panel and merely let them overlap, a strange bug will appear: Multiple overlapping controls are drawn in reverse, See here for a post and a link about this issue, which is documented
Controls inside containers are rendered in reverse order.
but obviously still a bug.
Related
I am making chess with c sharp and visual studio 2019. I managed to generate the chessboard with panels and I am planning to use PictureBox for the chess pieces. However, despite the chess images have a transparent background, it ignores the color of the panel and uses the default background color of the form. I suspect it is due to these lines.
...
Controls.Add(newPanel);
...
Controls.Add(picturebox);
...
What it is doing is adding each newly created panel to the form and adding the picturebox (which is used for showing a chess piece) to the form. I tried adding picturebox to the panel but the location of the picturebox becomes relative to that panel. When I drag the picturebox around (at runtime), the picturebox is not visible as soon as it leaves the panel. I have seen someone implemented this successfully before but I cannot figure out how.
This is what the background color looks like when moving the picturebox around (I have methods to handle mouse up, mouse down and mouse move). Any help would be appreciated.
Drawing the shapes and putting them into a single control seems like the way to go. If I draw the grid and chess pieces instead of using controls, the background of the chess pieces show up correctly as transparent.
Suppose there is a picturexox on the panel
and there is a datagridview on the picturebox.
I use the following code to capture the panel:
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(panel1.ClientRectangle.Width, panel1.ClientRectangle.Height);
panel1.DrawToBitmap(bmp, panel1.ClientRectangle);
bmp.Save(#"test.jpg");
But it seems that only the picturebox has been captured, the datagridview on it is missing.
How can capture the picturebox together with the datagridview?
The DrawToBitmap method will capture the graphics drawn in the Paint event and all nested controls. If one is missing it isn't nested either directly of indirectly. Here is how this probably happened:
The designer behaviour of Panels and PictureBoxes is different.
Panels, like GroupBoxes, TabPages and a few more are container controls.
This means that any control you drag onto them with your mouse gets nested in them.
PictureBox is not a Container, like, say a Button or a Label..
To nest your DataGridView in the PictureBox you have a choice of
moving it there with the keyboard (!)
nesting it in code ( yourDGV.Parent = yourPBox1;)
Do test the success of the keyboard way by moving the PictureBox to see if the DGV moves with it..
Update:
If you nest the DGV in the PictureBox, which itself is nested in the Panel, all will be well and the result will looks just like what you see.
However, if you nest both DGV and PictureBox in the Panel and merely let them overlap, a strange bug will appear: Multiple overlapping controls are drawn in reverse, See here for a post and a link about this issue, which is documented
Controls inside containers are rendered in reverse order.
but obviously still a bug.
I have an array of picture boxes that are arranged in a square. I want to put a larger, mostly transparent picture box over the top. But when I do it covers the other picture boxes and just draws the background of the form.
Is there a way to get it to have all the other picture boxes show where it is transparent?
Transparency in WinForms isn't great. Some controls have transparency support, others don't. Some controls can be subclassed to enable this (by calling Control.SetStyle() with the SupportsTransparency flag). I believe this can be done with PictureBox.
However, transparency in all WinForms controls works by having the transparent control call its parent control to draw the background before the child control draws. This means that you cannot have two sibling controls and expect transparency on one to show through to the other. Sorry!
All that said, it would be possible to code your own workaround to support this. It would involve subclassing PictureBox and clever coding in the OnPaint override to locate sibling controls and manually trigger painting of them into in-memory bitmaps. Lots of gotchas with this approach.
Try WPF!
Here's a tip to get the desired result:
Create multiple copies of your top image.
Add each copy to the Controls of each picture box it should cover.
Adjust location of each copy according to the offset of each picture box to be covered.
So you will see every copy of your big image covering each picture box as if they were a single image.
i tried to search for this on google, but didnt seem to find anything related that could help me.
My problem is this, i have a panel in which i draw a cube, and i added a group box with 3 radio buttons and 4 normal buttons(these do the rotation of the cube)
For testing i have another button added on the panel but not in the group box.
The problem is this, when i push on any button it doesn't update the cube's rotation, only when i move the mouse on the test button(over it)
If i try to move the buttons outside the group box then all works well, but they don't work if they stay inside the group box.
Does anyone know how i can fix this?
May I suggest that instead of redrawing the panel you create a Bitmap for drawing your (rotated) cube and use a PictureBox to display it? The PictureBox could be inside the Panel together with the GroupBox.
The flickering comes because the panel redraws his background first and then raises the Paint event. To avoid this you must to create a custom control and do the drawing in OnPaintBackground protected method. This seems a overkill. Or you can write to a Bitmap and put it in the BackgroundImage property.
I'm writing a form in C# and have several panels. I need to draw a line between two of the panels. I've found online several ways to go about this, the most promising appears to be to create a third panel, make it transparent, place it on top of my original panels and draw the line here.
I'm not able to get the panel to be transparent, even if I set its BackColor and ForeColor properties to transparent (in code or in design view of VS).
Any ideas on how to make the panel itself transparent (or not Visible) but have the line I draw on it still visible on top of everything else?
Thanks in advance.
No, it's transparent. See this by giving the form's BackgroundImage a value. You'll see it through the transparent panel. Of course, that's not the kind of transparency you want, you want stacking effects to work. There is no direct support for that.
If you want layers to work then don't use controls. Use the Paint event to draw. Now there's no problem, if you want transparency then just don't paint. Draw a line across an image simply by drawing the image first. This is also the rendering model of WPF.
You can actually do this pretty easily as your own UserControl. Here's a code example:
Drawing on top of controls inside a panel (C# WinForms)
This is similar to what you were originally attempting to do, only instead of drawing a line on top of a transparent panel, this code creates an irregularly-shaped user control (which happens to be in the irregular shape of a line).