暂时透视wpf应用程序 - 用于工具提示的Visual Studio Ctrl

时间:2009-09-29 07:50:41

标签: wpf transparency

上下文:我正在开发一个WPF应用程序,用户经常需要从其他程序手动转录数据。没有双显示器,这涉及很多Alt-tabbing。

我认为在Visual Studio中提供与工具提示相同的功能会非常好 - 您可以点击 Ctrl 使它们略微透明。

我遇到的“问题”是,您只能(有用)使用透明度,如果您的窗口AllowsTransparency,那么只有WindowStyle = None才有可能。我真的不想在我的应用程序中重新创建标题栏等所有复杂功能。

有没有合适的选择?

1 个答案:

答案 0 :(得分:2)

使用一点Win32 Interop,您可以获得窗口的HWND并使用CreateRgn并为窗口定义剪切区域,这将根据需要呈现窗口的任何部分“透视”。它还将修改命中测试,因此,窗口不仅“透视”,而且还“点击”。

以下是我的一个宠物项目中的一些内容,这消除了窗口的客户区域。这里的一些代码可能是特定于WPF的,但最终这里显示的Win32 API自90年代初以来一直存在。

    [DllImport("gdi32.dll")]
    internal static extern IntPtr CreateRectRgnIndirect([In] ref Mubox.Win32.Windows.RECT lprc);

    [DllImport("gdi32.dll")]
    internal static extern IntPtr CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);

    [DllImport("user32.dll")]
    internal static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw);

    [DllImport("gdi32.dll")]
    internal static extern int CombineRgn(IntPtr hrgnDest, IntPtr hrgnSrc1, IntPtr hrgnSrc2, CombineRgnStyles fnCombineMode);

    public enum CombineRgnStyles : int
    {
        RGN_AND = 1,
        RGN_OR = 2,
        RGN_XOR = 3,
        RGN_DIFF = 4,
        RGN_COPY = 5,
        RGN_MIN = RGN_AND,
        RGN_MAX = RGN_COPY
    }

    #endregion

                    IntPtr windowRegion = Control.Windows.CreateRectRgn(0, 0, parkingWindowRect.Width, parkingWindowRect.Height);
                    Mubox.Win32.Windows.RECT clipRect = new Mubox.Win32.Windows.RECT();

                        Mubox.Win32.Windows.GetClientRect(this.Handle, out clipRect);
                        clipRect.Left = (parkingWindowRect.Width - clipRect.Width) / 2;
                        clipRect.Right += clipRect.Left;
                        clipRect.Top = (parkingWindowRect.Height - clipRect.Height) - clipRect.Left;
                        clipRect.Bottom = parkingWindowRect.Height - clipRect.Left;


                    IntPtr clipRegion = Control.Windows.CreateRectRgnIndirect(ref clipRect);
                    Control.Windows.CombineRgn(windowRegion, windowRegion, clipRegion, Windows.CombineRgnStyles.RGN_XOR);
                    Control.Windows.DeleteObject(clipRegion);
                    Control.Windows.SetWindowRgn(this.Handle, windowRegion, true);