簡體   English   中英

最透明的可點擊式表單和可點擊式控件C#

[英]Topmost transparent clickable through form with clickable through controls C#

我在透明表單上使用GDI繪制了一些矩形。

表單是全屏的,並且始終位於最上面。 另外,可以使用以下方法單擊它:最上面的表單,單擊“通過”是否可行?

但是,繪制的矩形像我的窗體一樣無法單擊,並且每次單擊它們時應用程序都會失去焦點。 另外,當我將鼠標懸停在它們上面時,我可以看到我的應用程序光標(窗體下方的窗口是一個游戲,因此具有自定義光標)。

您能告訴我如何使所有控件都無法集中顯示和單擊嗎? 有可能還是我必須使用DirectX繪圖之類的東西?

我搜索了整個Web和stackoverflow,使用了各種解決方案,但沒有任何效果。

謝謝。

我不確定我是否完全理解您要完成的任務,但是,如果您希望創建一個可以接收鼠標點擊但不會“竊取”焦點的控件,則很有可能:

public class Box : Control
{
    public Box()
    {
        // Prevent mouse clicks from 'stealing' focus:
        TabStop = false;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        DrawText(e.Graphics);
    }

    // Display control text so we know what the button does:
    private void DrawText(Graphics graphics)
    {
        using (var brush = new SolidBrush(this.ForeColor))
        {
            graphics.DrawString(
                this.Text, this.Font, brush,
                new PointF()
                {
                    X = ((float)this.Width / 2f),
                    Y = (((float)this.Height / 2f) - (this.Font.GetHeight(graphics) / 2f))
                },
                new StringFormat()
                {
                    Alignment = StringAlignment.Center
                });
        }
    }
}


這個簡單的控件將顯示為矩形,它仍然能夠接收鼠標點擊和觸發點擊事件,但是不會從窗體上的其他控件(也不是窗體本身)上搶走焦點。


將表單上的透明鍵設置為其背景色將使表單的其余部分不可見,從而僅顯示矩形“按鈕”。 這也可以用組合Opacity屬性,以使所顯示半透明的,但正好為零的不透明度形式不會用鼠標(由Windows設計)進行交互。


僅將窗體的TopMost屬性設置為true可能不足以將窗口保持在所有其他窗口的頂部。 首次創建表單時,您可能需要在表單中進行以下API調用( 例如 ,放置在構造函數中, OnLoad事件 ):

SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW));


關於此功能的MSDN文檔可以在這里找到。

為了進行此調用,您將需要在窗體類中添加以下Windows API聲明:

[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

並添加以下常量:

private const int SWP_NOMOVE     = 0x0002;
private const int SWP_NOSIZE     = 0x0001;
private const int SWP_SHOWWINDOW = 0x0040;

private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);


我希望這有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM