2014-04-16 58 views
1

是否可以(以及如何)調整用於在桌面上顯示WPF窗體的混合模式?將WPF窗口與桌面混合

我有一個窗口作爲整個屏幕的覆蓋。這裏的XAML:

<Window x:Class="RedGreenBarsWPF.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Red/Green Overlay" Topmost="True" Height="300" Width="525" AllowsTransparency="True" WindowStyle="None" Background="Transparent" WindowStartupLocation="Manual" IsHitTestVisible="False"> 
    <Canvas Name="canvas" /> 
</Window> 

它不能被點擊,並且它得到調整並移動到覆蓋整個屏幕窗口加載時。然後我畫一些形狀像這樣在畫布上:

System.Windows.Media.Brush red = new SolidColorBrush(System.Windows.Media.Color.FromArgb(200, 255, 0, 0)); 

System.Windows.Size s = new System.Windows.Size(System.Windows.SystemParameters.PrimaryScreenWidth, System.Windows.SystemParameters.PrimaryScreenHeight); 

int lines = 20; 
for (double i = 0; i < s.Width; i += s.Width/lines) 
{ 
    System.Windows.Shapes.Rectangle rect = new System.Windows.Shapes.Rectangle 
    { 
     Width = s.Width/lines, 
     Height = s.Height 
    }; 

    rect.Fill = red; 

    Canvas.SetTop(rect, 0); 
    Canvas.SetLeft(rect, i * 2); 
    canvas.Children.Add(rect); 
} 

這也正是它應該,但不是我想要的。下面是在Photoshop中進行可視化(我貌似「正常」):

enter image description here

我需要找出一種方法來使它看起來像右側,那裏的文本不點亮的紅色方塊由重疊的顏色。我已經搜索了高和低,雖然有庫可以完成這與窗口內的元素,我需要混合模式擴展到整個桌面。如何才能做到這一點?

+0

什麼是你的合併覆蓋和底層圖像的算法?左側的圖像具有一定透明度的紅色部分,黑色和紅色合併在一起,爲您提供「輕鬆」的外觀。右邊的模擬似乎用紅色代替全白色,但是單獨留下黑色。這對二進制黑白圖像工作正常,但是當文本不是黑色或背景不是白色時會發生什麼? –

+0

我試圖用這個自己做實驗......我的想法是爲了做這樣的事情,你必須得到每個矩形中的像素數據,並且如果數據不完全是R = 200(或者其他您指定的紅色值),則可以使該像素完全透明。所以紅色會在完全白色的背景上顯示爲紅色,但會使其他所有內容流血。然而,似乎沒有使用WPF做這件事的好方法(至少我還沒有得到它的權利..) – ryrich

+0

@JohnKoerner我沒有使用任何種類的特定算法來繪製矩形,我只是添加它直接到畫布。文本出現在它後面,因爲alpha值設置爲只有200(255是完全不透明的)。 – Scott

回答

1

您需要使用不同的混合功能。到目前爲止,我相信你沒有簡單的解決方案;這已經被請求,但尚未被WPF支持。

這個other question也是關於對WPF畫筆使用不同的混合函數。它還包含有關如何實現自定義混合(實際上是整個混合庫)的相當不錯(但很長)的教程的鏈接。

這些頁面幾乎包含每個頁面上的源代碼。您需要以下內容來構建它們:(引用).NET 3.5 SP1,DirectX SDK以及CodePlex上WPF Futures內容中的Shader Effects BuildTask和Templates。

我在這裏複製鏈接:

編輯:要捕獲桌面圖像,您可以嘗試使用簡單的FrameworkElement,如Rectangle,具有透明背景(Transparent是筆刷)。然後,您可以使用RenderTargetBitmap類將其轉換爲ImageBrush。下面的代碼片段,應該幫助您開始:

public Brush RectangleToBrush(Rectangle rect) 
{ 
    int w = (int)rect.ActualWidth; 
    int h = (int)rect.ActualHeight; 
    var rtb = new RenderTargetBitmap(w, h, 96d, 96d, PixelFormats.Default); 
    rtb.Render(rect); 

    ImageBrush brush = new ImageBrush(BitmapFrame.Create(rtb)); 

    return brush; 
} 

你或許可以把這個矩形在你的.xaml文件,使用一個網格,使其覆蓋整個窗口:

<Window ...> 
    <Grid> 
     <Rectangle x:Name="DesktopCaptureRectangle"/> 
     <Grid> 
      <!-- Your controls here --> 
     </Grid> 
    </Grid> 
</Window> 

注意:我不確定這個解決方案是否具有良好的性能...

+0

看起來不錯!有什麼辦法可以將桌面本身作爲多輸入着色器的輸入? – Scott

+1

我編輯我的答案,有關如何做到這一點的想法...我沒有實際測試它,所以我不知道它會工作,但你可以試試看。 – Benlitz

+0

我會給它一個機會,非常感謝! – Scott