Dyl*_*lan 7 c# forms mdi mdiparent
我要做的是在标记为mdi容器的表格上画一些玻璃.但是,只要设置了IsMdiContainer,表单就会在其控件列表中添加一个MdiClient.此时,父表单会发生一些事情 - 几乎就像深灰色面板停靠在MdiClient所在的整个表单上.
我接下来要做的是将MdiClient控件移开一点:
foreach(var c in Controls)
{
if(c is MdiClient)
{
var client = (MdiClient)c;
client.BackColor = Color.Red;
client.Dock = DockStyle.None;
client.Size = new Size(this.Width-100, this.Height);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,这使得实际的MdiClient区域变小,以便我们可以看到它背后的内容(托管子窗体的位),并且显然父窗体不是绘画或其他东西.
从这里可以看出:http://img525.imageshack.us/img525/8605/mdiglassproblem.png
我现在需要以某种方式获得MdiClient背后的区域(在玻璃部分呈现白色的深灰色部分)消失.
有任何想法吗?
PS - 在Vista中使用DwmExtendFrameIntoClientArea方法渲染Glass.
我觉得这很完美.
foreach (Control ctrl in this.Controls)
{
if (ctrl is MdiClient)
{
ctrl.BackColor = Color.LightGray;
}
}
Run Code Online (Sandbox Code Playgroud)
我设法让它运作起来.我正在谈论的那个深灰色的区域,它被绘制在一切都在表单的OnPaint方法中出现.显然,当存在MdiContainer时,表格被预编程以绘制阻碍玻璃的深灰色区域.
因此,只需覆盖OnPaint方法而不调用它的基础,然后在普通的Paint方法中使用用于绘制玻璃的代码并将其粘贴在OnPaint方法中.
protected override void OnPaint(PaintEventArgs e)
{
//base.OnPaint(e);
bool glassEnabled = IsGlassEnabled();
if (glassEnabled) // draw glass if enabled
{
Rectangle rc = picPlaceHolder.ClientRectangle;
IntPtr destdc = e.Graphics.GetHdc(); // hwnd must be the handle of form, not control
IntPtr Memdc = CreateCompatibleDC(destdc);
IntPtr bitmapOld = IntPtr.Zero;
BITMAPINFO dib = new BITMAPINFO();
dib.bmiHeader.biHeight = -(rc.Bottom - rc.Top);
dib.bmiHeader.biWidth = rc.Right - rc.Left;
dib.bmiHeader.biPlanes = 1;
dib.bmiHeader.biSize = Marshal.SizeOf(typeof(BITMAPINFOHEADER));
dib.bmiHeader.biBitCount = 32;
dib.bmiHeader.biCompression = BI_RGB;
if (!(SaveDC(Memdc) == 0))
{
IntPtr bitmap = CreateDIBSection(Memdc, ref dib, DIB_RGB_COLORS, 0, IntPtr.Zero, 0);
if (!(bitmap == IntPtr.Zero))
{
bitmapOld = SelectObject(Memdc, bitmap);
BitBlt(destdc, rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top, Memdc, 0, 0, SRCCOPY);
}
// remember to clean up
SelectObject(Memdc, bitmapOld);
DeleteObject(bitmap);
ReleaseDC(Memdc, -1);
DeleteDC(Memdc);
}
e.Graphics.ReleaseHdc();
}
}
Run Code Online (Sandbox Code Playgroud)
然后确保MdiContainer不会妨碍玻璃,它应该完美绘制.
| 归档时间: |
|
| 查看次数: |
14993 次 |
| 最近记录: |