0

ユーザーがマウスをクリックするまで会社のロゴを表示するために、マウスの移動とクリックのイベントに引き続き応答する透明なフォームを作成しようとしていますが、フォームとロゴが表示されないことがあるという点で少し苦労しています。まったく表示されず、それ以外の場合は表示されますが、背景は黒です。

フォームを呼び出す方法は次のとおりです。

MouseAlertForm maf = new MouseAlertForm(Win32.GetCursorPosition());
maf.Show();

maf.Show()フォームがまったく表示されず ( と同じShow(this))、maf.ShowDialog()背景が黒くなります。のコードは次のとおりですMouseAlertForm

public sealed partial class MouseAlertForm : Form
{
    private Image Logo;
    public Point MouseLocation { get; private set; }

    public MouseAlertForm(Point location)
    {
        InitializeComponent();
        MouseLocation = location; 

        // Allow transparent backgrounds.
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);

        // Set up this form to be maximum size, with no borders, and have a nearly transparent background.
        this.TopMost = true;
        this.DoubleBuffered = true;
        this.ShowInTaskbar = false;
        this.FormBorderStyle = FormBorderStyle.None;
        this.WindowState = FormWindowState.Maximized;
        this.BackColor = Color.FromArgb(1,255,255,255);

        // Load the Image.
        var assemlby = Assembly.GetAssembly(new AssemblyTypeLinker().GetType());
        if (assemlby != null)
            Logo = Image.FromStream(assemlby.GetManifestResourceStream("MyProgram.MyLogo.png"));
    }

    /// <summary>
    /// Update the current mouse location, and invalidate the control causing a re-draw.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);

        MouseLocation = e.Location;
        Invalidate();
    }

    /// <summary>
    /// Release our logo, and close the form.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnMouseClick(MouseEventArgs e)
    {
        base.OnMouseClick(e);

        Logo.Dispose();
        this.Close();
    }

    /// <summary>
    /// Clear what was previously drawn, and if we have a mouse location, draw the logo in that area.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        // Clear the background back to a nearly transparent white.
        e.Graphics.Clear(Color.FromArgb(1, 255, 255, 255));

        if (MouseLocation != Point.Empty)
        {
            // Draw our logo in the spot of the current mouse location.
            e.Graphics.DrawImage(Logo, MouseLocation.X - 100, MouseLocation.Y - 100, 200, 200);
        }
    }
}

編集:背景と見なされるものの下でも、黒い背景が作成されているようです。私BackColorは完全な 255 に設定し、それを青にしてから、アルファ コンポーネントをゆっくりと 0 まで減らしました。これは ShowDialog の特徴でしょうか。この背景はどこから?

4

1 に答える 1

0

これが修正です。まず、OnPaint以前の実装ではオーバーライドしていなかったのに対し、現在は をオーバーライドしてCreateGraphics()いるため、大量に使用していました。しかし、私はオーバーライドOnPaintしているので、独自のグラフィックス オブジェクトが付属しており、無効になったときにクリアされるため、自分でクリアする必要はありません。

2番目に、理由はわかりませんが、以前に a を使用するBackColorとおよびイベントTransparencyKeyが登録されませんでしたが、再度、それらにアタッチするのではなくオーバーライドしているため、.MouseMoveMouseClickTransparencyKey

public sealed partial class MouseAlertForm : Form
{
    private Image Logo;
    public Point MouseLocation { get; private set; }

    public MouseAlertForm(Point location)
    {
        InitializeComponent();
        MouseLocation = location; 

        // Allow transparent backgrounds.
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);

        // Set up this form to be maximum size, with no borders, and have a nearly transparent background.
        this.TopMost = true;
        this.DoubleBuffered = true;
        this.ShowInTaskbar = false;
        this.FormBorderStyle = FormBorderStyle.None;
        this.WindowState = FormWindowState.Maximized;

        this.BackColor = Color.Lime;
        this.TransparencyKey = Color.Lime;

        // Load the Image.
        var assembly = Assembly.GetAssembly(new AssemblyTypeLinker().GetType());
        if (assembly != null)
            Logo = Image.FromStream(assembly.GetManifestResourceStream("MyProgram.MyLogo.png"));
    }

    /// <summary>
    /// Update the current mouse location, and invalidate the control causing a re-draw.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);

        MouseLocation = e.Location;
        Invalidate();
    }

    /// <summary>
    /// Release our logo, and close the form.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnMouseClick(MouseEventArgs e)
    {
        base.OnMouseClick(e);

        Logo.Dispose();
        this.Close();
    }

    /// <summary>
    /// Clear what was previously drawn, and if we have a mouse location, draw the logo in that area.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        if (MouseLocation != Point.Empty)
        {
            // Draw our logo in the spot of the current mouse location.
            e.Graphics.DrawImage(Logo, MouseLocation.X - 100, MouseLocation.Y - 100, 200, 200);
        }
    }
于 2012-12-06T18:07:52.970 に答える