Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencipta Tindanan Separuh Telus pada Borang Windows Menggunakan C#?

Bagaimana untuk Mencipta Tindanan Separuh Telus pada Borang Windows Menggunakan C#?

Susan Sarandon
Lepaskan: 2025-01-09 20:36:43
asal
949 orang telah melayarinya

How to Create a Semi-Transparent Overlay on a Windows Form Using C#?

Tindankan imej separa lutsinar pada Borang Windows

Artikel ini bertujuan untuk menyediakan penyelesaian untuk menindih imej separa lutsinar pada Borang Windows yang mengandungi kawalan lain, memastikan kawalan kekal kelihatan tetapi tidak boleh diakses.

Untuk mencapai kesan ini, kami akan menggunakan borang lain dan meletakkannya di atas borang sedia ada. Sifat Opacity borang baharu mengawal tahap ketelusan. Berikut ialah kelas tersuai yang boleh ditambahkan pada projek anda:

<code class="language-csharp">using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class Plexiglass : Form
{
    public Plexiglass(Form tocover)
    {
        // 自定义叠加窗体的外观和行为
        this.BackColor = Color.DarkGray;
        this.Opacity = 0.30;
        this.FormBorderStyle = FormBorderStyle.None;
        this.ControlBox = false;
        this.ShowInTaskbar = false;
        this.StartPosition = FormStartPosition.Manual;
        this.AutoScaleMode = AutoScaleMode.None;
        this.Location = tocover.PointToScreen(Point.Empty);
        this.ClientSize = tocover.ClientSize;

        // 将叠加层与目标窗体关联,以跟踪其移动和大小调整事件
        tocover.LocationChanged += Cover_LocationChanged;
        tocover.ClientSizeChanged += Cover_ClientSizeChanged;
        this.Show(tocover);
        tocover.Focus();

        // 禁用Aero过渡效果,以获得更流畅的效果
        if (Environment.OSVersion.Version.Major >= 6)
        {
            int value = 1;
            DwmSetWindowAttribute(tocover.Handle, DWMWA_TRANSITIONS_FORCEDISABLED, ref value, 4);
        }
    }

    // 事件处理程序,用于更新叠加层的位置和大小
    private void Cover_LocationChanged(object sender, EventArgs e)
    {
        this.Location = this.Owner.PointToScreen(Point.Empty);
    }
    private void Cover_ClientSizeChanged(object sender, EventArgs e)
    {
        this.ClientSize = this.Owner.ClientSize;
    }

    // 调整窗体行为,以确保目标窗体保持焦点
    protected override void OnActivated(EventArgs e)
    {
        this.BeginInvoke(new Action(() => this.Owner.Activate()));
    }
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        this.Owner.LocationChanged -= Cover_LocationChanged;
        this.Owner.ClientSizeChanged -= Cover_ClientSizeChanged;
        if (!this.Owner.IsDisposed && Environment.OSVersion.Version.Major >= 6)
        {
            int value = 1;
            DwmSetWindowAttribute(this.Owner.Handle, DWMWA_TRANSITIONS_FORCEDISABLED, ref value, 4);
        }
        base.OnFormClosing(e);
    }

    // DWM API调用的常量
    private const int DWMWA_TRANSITIONS_FORCEDISABLED = 3;
    [DllImport("dwmapi.dll")]
    private static extern int DwmSetWindowAttribute(IntPtr hWnd, int attr, ref int value, int attrLen);
}</code>
Salin selepas log masuk

Untuk menindih imej, buat contoh kelas Plexiglass dan lulus borang sasaran sebagai parameter apabila borang dipaparkan. Ini mewujudkan tindanan separa telus yang meliputi keseluruhan borang sasaran, membolehkan anda melihat kawalan sedia ada tetapi menghalang interaksi dengannya.

Untuk mengalih keluar tindanan, cuma panggil kaedah Plexiglass contoh borang. Close()

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Tindanan Separuh Telus pada Borang Windows Menggunakan C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan