65.9K
CodeProject 正在变化。 阅读更多。
Home

夜视

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.33/5 (3投票s)

2012 年 2 月 22 日

CPOL

1分钟阅读

viewsIcon

20977

一个具有 80% 不透明度的窗口,在鼠标指针处有一个孔。

引言

我经常用笔记本电脑看电影。但我使用的是22英寸的液晶显示器,而不是笔记本电脑的屏幕。当我关掉房间的灯时,笔记本电脑屏幕的光线会干扰我。我可以关掉笔记本电脑的屏幕,但如果我想在看电影的同时做其他事情,我需要把它打开。这种体验对我来说不太好。所以,我需要一些能够降低屏幕不透明度,但在鼠标指针周围保留一个小透明区域,让我能够使用其他应用程序的东西。因此,我在Media Assistant中引入了夜视模式。

使用代码

为了解决我在Media Assistant中的问题,我使用了一个全屏窗口,其中包含网格。我创建了一个3x3的网格,中心部分代表整个窗口。这意味着我需要随着鼠标移动来移动它。

这是我在窗口中使用的XAML

<Window x:Class="MediaAssistant.Controls.NightVision.NightVisionWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Converters="clr-namespace:MediaAssistant.Converters" Title="NightVisionWindow" WindowState="Maximized" 
        Background="Transparent" AllowsTransparency="True" 
        ResizeMode="NoResize"
        WindowStyle="None" 
        ShowInTaskbar="False"
        MouseMove="WindowMouseMove" Topmost="True"
        KeyDown="KeyDownHandler"
        >
  <Window.Resources>
        <Converters:NightOpacityToTextConverter x:Key="NightOpacityToTextConverter" />
  </Window.Resources>
  <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="{Binding Y}"/>
            <RowDefinition Height="{Binding WholeHeight}"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="{Binding X}"/>
            <ColumnDefinition Width="{Binding WholeWidth}"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <Border Grid.Column="0" Grid.Row="0" Background="Black" Opacity="{Binding NightOpacity}"/>
        <Border Grid.Column="0" Grid.Row="1" Background="Black" Opacity="{Binding NightOpacity}"/>
        <Border Grid.Column="0" Grid.Row="2" Background="Black" Opacity="{Binding NightOpacity}"/>
        <Border Grid.Column="1" Grid.Row="0" Background="Black" Opacity="{Binding NightOpacity}">
            <TextBlock DockPanel.Dock="Top" Text="{Binding NightOpacity, Converter={StaticResource NightOpacityToTextConverter}}" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Bottom"/>
        </Border>
        <Border Grid.Column="1" Grid.Row="1" Background="Transparent" BorderThickness="2" BorderBrush="Black"/>
        <Border Grid.Column="1" Grid.Row="2" Background="Black" Opacity="{Binding NightOpacity}"/>
        <Border Grid.Column="2" Grid.Row="0" Background="Black" Opacity="{Binding NightOpacity}"/>
        <Border Grid.Column="2" Grid.Row="1" Background="Black" Opacity="{Binding NightOpacity}"/>
        <Border Grid.Column="2" Grid.Row="2" Background="Black" Opacity="{Binding NightOpacity}"/>
    </Grid>
</Window>

我使用了转换器来显示当前的不透明度,用户可以控制它。我将高度和宽度与属性绑定,并通过鼠标移动来修改该属性。因此,第一行和第一列会随着鼠标移动而重新调整大小。

这是移动整个窗口的代码,跟随鼠标移动。

private void WindowMouseMove(object sender, MouseEventArgs e)
{
     var position = e.GetPosition(this);
     X = Math.Max(position.X - WholeWidth/2, 0);
     Y = Math.Max(position.Y - WholeHeight/2, 0);
     if(IsActive==false)
          Activate();
}  

我还通过键盘交互控制了不透明度和退出行为。

private void KeyDownHandler(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Escape)
    {
         Close();
    }
    else
    {
          const double delta = 0.05;
          if(e.Key==Key.Left)
          {
               NightOpacity = Math.Max(0, NightOpacity - delta);
          }
          else if(e.Key==Key.Right)
          {
               NightOpacity = Math.Min(1, NightOpacity + delta);
          }
     }
} 
© . All rights reserved.