除自定义标题栏外的透明,点击型表单

时间:2014-10-27 17:05:40

标签: c# winforms

我选择了一些代码,通过代码实现了Topmost,Transparent和Click-While表单:

public enum GWL
{
    ExStyle = -20
}

public enum WS_EX
{
    Transparent = 0x20,
    Layered = 0x80000
}

public enum LWA
{
    ColorKey = 0x1,
    Alpha = 0x2
}

[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex);

[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong);

[DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, LWA dwFlags);

protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    int wl = GetWindowLong(this.Handle, GWL.ExStyle);
    wl = wl | 0x80000 | 0x20;
    SetWindowLong(this.Handle, GWL.ExStyle, wl);
    SetLayeredWindowAttributes(this.Handle, 0, 128, LWA.Alpha);
}

使用此代码,所有表单都是透明的,绝对点击(文本,图像,控制按钮......)

当前表单边框样式为无(无边框,无标题栏)。现在我想制作一个自定义标题栏,允许用户将表单移动到屏幕上的其他位置(如标题栏)。

这里的问题,所有形式都无法点击它(因为点击代码),如何进行点击式表格,但自定义标题栏除外?

自定义标题栏必须是透明的其他元素。 我不想保留原来的标题栏,这对我的申请来说很糟糕。

1 个答案:

答案 0 :(得分:0)

使用WS_EX_LAYERED样式意味着您必须使用 UpdateLayeredWindow函数自行绘制表单。您仍然可以从控件中获取所有消息,前提是您已使用UpdateLayeredWindow绘制了消息。

UpdateLayeredWindow只会绘制hdc: handle device context,所以如果你想绘制图像:

IntPtr screenHdc = GetDC(IntPtr.Zero);
IntPtr bmpHdc = CreateCompatibleDC(screenHdc);
IntPtr hBitmap; 

Bitmap bmp = .... //load your bitmap, a png one for transparency
hBitmap = bmp.GetHbitmap(Color.FromArgb(0));  //Zero: background is transparent
SelectObject(bmpHdc, hBitmap);

UpdateLayeredWindow(this.Handle, screenHdc, ..., ..., bmpHdc, ..., ..., ..., ...);

查看UpdateLayeredWindow function了解更多信息