Form Transparency overlays other elements - c#

I have a transparent Windows Forms Form with a few custom usercontrols on it.
These controls have some transparency themselves.
The problem is that these controls overlap each other a little. The overlapping part is transparent so that shouldn't be a problem. Unfortunately it isn't working like it should instead of the transparency to show the control below it cuts out that part of the control.
Does anyone know what could be the problem here and how to solve it?

Related

How to have different opacity for multiple controls?

I have a problem with the opacity of some controls.
So I set the form opacity to 0.3, when the form is loaded, and the problem is that it makes the other controls as tranparent as the form. Here is the code.
private void Form1_Load(object sender, EventArgs e)
{
this.Opacity = 0.3;
}
By doing this, all my controls are as transparent as the form. Is there any way to have different opacity for the controls inside the form ? I don't want the other to be transparent at all.
My first recommandation would be to avoid that. Having a semi-transparent background with opaque controls will look somewhat weird. Instead, consider changing the opacity when the form is active say from 0.3 to 0.7 so that it is easier to read.
Also another problem if some controls are opaque and the background is almost transparent, then your UI might not work well on some background. For example, if the background is really dark, then dark text (control) will be hard to see. If the background is white, then white controls like edit box would be the same color as the background.
You can get a few idea from other people comments. Even though some comment are for WPF, you might be able to take some idea for WinForms. And if you don't get the expected result, you might also consider using WPF for that part of the UI.
Having said that, a possible workaround to get what you want is to create two top-level windows at the same position (and move/resize them as appropriate). That way, you can have one window with a transparency key and the desired background for opaque area that will be used to have opaque and semi-transparent area. The other window will use the opacity so that it would be semi-transparent. This is the window that will contain your UI controls (and the one that would be on the top).
I have used that technic in the past to have a semi-transparent client area with a fully opaque frame in one application where I want to be able to see through client area (adjustable opacity) so that I could "draw" in my window using the image in another application as a reference.
Another comment is that you might need actual control with windows handle and direct Win32 API access for some customization that are not available in WinForms and/or WPF. In my application, I was handling activation in a way that if I click on the bottom level windows, the top-level window still appears as the active one (caption bar color). If one has no standard caption bar (either the frame is custom or no frame at all), then you would not have that problem.
As suggested by some links in the comment section, it might also be possible to get what you want using a single top-level windows. I have not tried that. In fact, when I try the above solution, I think that my application was still supported on Windows XP and as such you are more limited in options and the behavior is somewhat different essentially because XP more or less write directly to screen while Vista and later use bitmaps (buffers) for each windows.
I have also used combined transparency key and opacity for splash screen (on a single window) and it works on most system but sometime I got black background instead of desired background on some system (probably some XP machine with specific configuration).

Not inherrit topmost form opacity

If I set the opacity of the topmost form all the sub-controls are just as transparent as the form. The same goes for when using the transparencyKey, all the sub-controls have the same transparent color.
What I wish to accomplish it to have controls on the form and selectively choose which should inherit this property. Is it possible to do this even if it would require adding subforms to the form?
Any help/suggestions would be appreciated, since I couldn't find any solution that worked for me.
No, this is generally not possible, because it is not specific to c#, but the way Microsoft Windows works.
There are 2 ways to get proper transparency on Windows: WS_EX_LAYERED and WS_EX_NOREDIRECTIONBITMAP . Both are inaccessible using Winforms and for good reason: You will have to do any and all painting yourself, including the subcontrols.
WPF does however support this natively.

How to have windows forms control catch drag enter instead of embedded WPF canvas

This is a pretty basic setup. I have a System.Windows.Forms Panel that holds an ElementHost control that holds a System.Windows.Controls Canvas. The user begins a drag operation and the drag enter event is fired from the Canvas control, but what I really want is for the canvas to ignore the drag enter and for the event to be caught by the parent System.Windows.Forms.Panel that holds the canvas. How can I do this?
The simple answer to this, is that you cannot do that. If you mix Win32, WPF, or DirectX technologies on top of each other, then the one on top takes precedence and it is a black hole to the other technologies. The limitation you are experiencing is called Airspace and if you search around you will find many articles discussing airspace restrictions and mixing WPF/Winforms/DirectX content. Please see the following link:
Technology Regions Overview
There may be methods that would help to provide a workaround for what you are trying to accomplish. For example, handling the input in WPF and then passing it explicitly back to your program in some other manner. Some quick googling shows:
Mitigating Airspace Issues
WPF and Win32 Interoption

Blinking Form when background Image set to it c#

When I fix a Background to my winform, It is getting blink on form load. I have a table layout panel on my form and I kept all my controls on the table layout panel.
I set the backcolor of tablelayout panel to Transparent and Set the Image to the background. Why am I getting blink on my form load?
WinForms doesn't handle transparency very well (As I'm sure you may have noticed, not all WinForms controls even support it). The blink is caused because as your TableLayoutPanel is loaded, as well as all its items, the Form has to find the correct 'image' (Because the control doesn't support transparency in the same way as WPF or a game does, it instead uses an image of the controls behind it) to display. It must go through this process as each of your controls are loaded, hence the blinking. You can try enabling DoubleBuffering on your Form, however, if I recall correctly, this can cause issues with transparency.
If you find that you are using a lot of transparency and/or want to customise your Form a lot more, I suggest you take a look at WPF. It offers far greater control over your Form (Window in WPF) as well as supporting transparency on every single control.

Build turns partially transparent image pixels black

I'm very new to C# and I've run into a problem and haven't been able to solve it. I have a row of buttons that have .png images assigned to them. The images are in .png format to allow transparency, and smoothing the edges in GIMP leaves some semi-transparent pixels. I've set the Image List Toolbar (imglToolbar)'s properties to recognize "Transparent" as the designated color to show up as transparent. I'm working in Visual Studio 2005.
The strange thing is that everything looks great when I'm viewing the Visual C# form preview window. The icons look exactly as they should. However, once I actually build the project, the buttons treat every semi-transparent pixel near the edge of the image as if it's black. It seems like it can't handle one that's both transparent and has color.
Image of it via the Visual C# form editor:
alt text http://img5.imageshack.us/img5/2577/whatiwanted.jpg
Image of what it looks like when built:
alt text http://img690.imageshack.us/img690/7241/whatigot.jpg
Any ideas as to why this is happening?
I just found the answer, at least to my specific situation.
The form I'm dealing with is a top-level MDI container. For whatever reason, having the icons set to 32 bit color doesn't allow for these semi-transparent pixels to be properly interpreted. Setting it to 24-bit, on a whim, completely solved the problem. Not sure if this is some situation that has come up as a result of some unseen factor, but the color depth change fixed my problem.
Also for those who may come here with a similar problem, make sure the window isn't a child of an MDI container. While looking for information, I found MDI children don't support TransparencyKeys at all.
I ran into this problem as well; changing the form's IsMdiContainer property to false solved it.

Categories