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

Posted

技术标签:

【中文标题】临时透视 wpf 应用程序 - 用于工具提示的 Visual Studio Ctrl【英文标题】:Temporarily see-through wpf application - à la Visual Studio Ctrl for tooltips 【发布时间】:2009-09-29 07:50:40 【问题描述】:

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

我认为拥有与 Visual Studio 中工具提示相同的功能会非常好 - 您可以在其中按 Ctrl 使它们稍微透明。

我遇到的“问题”是,如果您的窗口 AllowsTransparency,您只能(有用地)使用透明度,而这又只有在 WindowStyle = None 时才有可能。我真的不想涉及在我的应用程序上重新创建标题栏等的所有复杂情况。

有什么不错的选择吗?

【问题讨论】:

【参考方案1】:

通过一点点 Win32 互操作,您可以获得窗口的 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);

【讨论】:

我认为您的意思是特定于 WinForms,什么是 Mubox?谷歌找到的“Mubox.Win32.Windows”的唯一参考是这个页面:( 好的,我发现我必须推出自己的 RECT 结构。据我所知,我这里只有完全透明的选项,没有不透明的? Mubox 是@mubox.codeplex.com,上面提供的代码不是公共/开源版本的一部分。如果您愿意,使用区域允许您定义一个非矩形的剪切区域。裁剪与透明度不同,也就是说,您不能定义不透明度级别。您可以定义一个小至 1 像素或大至窗口的区域。我用它来屏蔽一个窗口的客户区,我将其用作外部/第 3 方应用程序的控制框架(例如,伪造另一个不提供任何 NC 控制的应用程序的 NC 区域。) 已经有一段时间了,但是,您确认这对您有用吗?

以上是关于临时透视 wpf 应用程序 - 用于工具提示的 Visual Studio Ctrl的主要内容,如果未能解决你的问题,请参考以下文章

使用工具提示 WPF 在数据网格中填充组合框

如果需要,显示 WPF 工具提示

如何在 ag 网格透视模式下将不同的列数据显示为工具提示?

WPF 数据网格绑定工具提示在表格内容绑定刷新时闪烁

强制 WPF 工具提示留在屏幕上

WPF 透视相机的UpDirection(向上方向)