WPFは、Win32APIのは、WebBrowserコントロールを上に置かれてみましょう使用しています

WPFのウェブブラウザでWebBrowserコントロールは、すべてのコントロールの前でそうHwndHostを使用します。だから、ウェブブラウザは、コントロールのすべての同じレベルをカバーします。

今、この状況は、Win32APIのを使用することによって回避することができます。

 

最も重要なのは、これらのWin32APIです。

[DLLIMPORT(" user32.dllの" )]
         パブリック 静的 にextern  BOOL SetWindowRgn(のIntPtr hWndは、のIntPtr HRGN、BOOL 再描画)。
[DLLIMPORT(" GDI32.DLL " )]
         パブリック 静的 にexternのIntPtr CreateRectRgn(int型左、int型トップ、int型 RectRightBottom_X、int型RectRightBottom_Y)。
 [DLLIMPORT(" GDI32.DLL " )]
         パブリック 静的 にextern  int型CombineRgn(のIntPtr hrgnDst、のIntPtr hrgnSrc1、のIntPtr hrgnSrc2、int型 iモード)。
[DLLIMPORT( "GDI32.DLL")]
        パブリック静的にextern BOOL DeleteObjectの(のIntPtr objectHandle)。

何かの適切なを言います:

setwindowrgnアクティブ描画領域が設けられています。

createrectrgnは、四角形を作成することです

これは、2つの長方形の統合ですcombinergn、缶組合、交差点やSRC1一部SRC2は、最終的な結果でしょうhrgnDstには、含まれていません。

全体のイベントは、有効な描画領域を設定し続けるために使用WebBrowserコントロールの親をsizechangedました。

 

 

直接コード上のI、

Win32APIのクラス

[DLLIMPORT(" User32.dllの" )]
         パブリック 静的 にextern  BOOL SetWindowRgn(のIntPtr hWndは、のIntPtr HRGN、BOOL 再描画);
         ///  <まとめ> 
        /// 矩形を作成するには、4つのパラメータは、元々のX1、Y1、X2とY2の意味であります左上のX1、Y1座標、右コーナーX2を下げ、Y2座標、便宜上、私はWPFを使用するが変更された
         /// 左矩形平均距離は左
         /// 矩形との距離の上部縁ことトップ手段
         /// rectrightbottom_x X矩形手段の右下隅の座標
         /// rectrightbottom_y手段Yは、矩形の右下隅の座標
         ///  </要約> 
        ///  <PARAM名=「左」> </ PARAM> 
        ///  <PARAM NAME = "トップ「> </ param>の
        /// <PARAM名= "RectRightBottom_X"> </ PARAM> 
        ///  <PARAM NAME = "RectRightBottom_Y"> </ PARAM> 
        ///  <戻る> </戻り> 
        [DLLIMPORT(" GDI32.DLL " )]
         パブリック 静的 EXTERN IntPtr CreateRectRgn(int型左、int型トップ、int型 RectRightBottom_X、int型RectRightBottom_Y)。

 [DLLIMPORT( "GDI32.DLL")]
        パブリック静的にextern BOOL DeleteObjectの(のIntPtr objectHandle)。
[DLLIMPORT(
" GDI32.DLL " CombineRgn(のIntPtr hrgnDst、のIntPtr hrgnSrc1、のIntPtr hrgnSrc2、INT iモード); // マージオプション: // 。RGN_AND = 1; // RGN_OR = 2; // 。RGN_XOR = 3; // 。RGN_DIFF = 4; // 。RGN_COPY = 5。 } {領域をコピーします

 

追加のプロパティカテゴリ:

クラスATCH 
    { 
        パブリック 静的 読み取り専用たDependencyProperty PanelProperty = DependencyProperty.RegisterAttached(" パネル"typeof演算(パネル)、typeof演算(ATCH)、新しい PropertyMetadata(NULL ))。

        パブリック 静的 ボイド SetPanel(のDependencyObjectのD、パネル値)=> d.SetValue(PanelProperty、値)。

        パブリック 静的パネルGetPanel(のDependencyObjectのD)=> パネル)d.GetValue(PanelProperty)。


        公共の 静的な 読み取り専用のDependencyProperty NameProperty = DependencyProperty.RegisterAttached(" 名前"typeof演算(のFrameworkElement)、typeof演算(ATCH)、新しい PropertyMetadata(ヌル新しいPropertyChangedCallback(OnNamePropertyChanged))); 

        パブリック 静的 ボイド SetNameメソッド(のDependencyObject D、FrameworkElementの値)=> d.SetValue(NameProperty、値)。

        パブリック 静的のFrameworkElement関連項目GetName(のDependencyObjectのD)=> のFrameworkElement)d.GetValue(NameProperty)。


        プライベート 静的 ボイドはOnNamePropertyChanged(のDependencyObject dを、DependencyPropertyChangedEventArgs電子)
        { 
            VAR = Bd.GetValue(PanelProperty)。
            もし(bがある ヌル!||(bがあるパネル)|| e.NewValueがある nullのリターンVaRのパネル= B としてパネル。
            VaRのウェブ= D などのWebブラウザー。
            VAR UI = e.NewValue などのFrameworkElement。
            SetRect(パネル、ウェブ、UI); 
            panel.SizeChanged + =(送信者、引数)=> 
            { 
                SetRect(パネル、ウェブ、UI)。
            }。

        }
        プライベート静的のIntPtr C1。
        プライベート 静的 無効SetRect(パネルパネル、Webブラウザーウェブ、FrameworkElementのUI)
        { 
            のIntPtrハンドル = web.Handle。
            Win32API.DeleteObject(C1)。
            Win32API.SetWindowRgn(ハンドル、IntPtr.Zero、真の); 

            RECT PanelRect = 新しいのRect(サイズ(panel.ActualWidth、panel.ActualHeight)); 

            C1 = Win32API.CreateRectRgn((INT0、(INT0、(INT)PanelRect.BottomRight.X、(INT )PanelRect.BottomRight.Y)。

            RECT UIRect= 新しいのRect(サイズ(ui.ActualWidth、ui.ActualHeight)); 

            VAR D1 =(int型)ui.TransformToAncestor(パネル).Transform(新しいポイント(00 ))、X。

            VAR D2 =(INT)ui.TransformToAncestor(パネル).Transform(新しいポイント(00 ))、Y。

            VAR D3 =(INT)(D1 + UIRect.Width)。

            VAR D4 =(INT)(D2 + UIRect.Height)。

            VAR C2 = Win32API.CreateRectRgn(D1、D2、D3、D4)。

            Win32API.CombineRgn(C1、C1、C2、4 )。

            Win32API.SetWindowRgn(ハンドル、C1、)。
        } 
    }

 

コードXAML

<グリッド> 
        <WEBブラウザソース= " http://www.baidu.com "   ローカル:ATCH.Panel = " {RelativeSourceバインディング= {RelativeSourceモード= FindAncestor、AncestorLevel = 1、AncestorType =グリッド}} "ローカル:ATCH.Name = " {バインディングのElementName = BTN} " /> 
        <ボタンX:NAME = " BTN "高さ= " 50 "幅= " 100 "コンテンツ= " 覆盖测试"   /> 
    </グリッド>

 

スクリーンショット1:

 

スクリーンショット2:

 

 

おすすめ

転載: www.cnblogs.com/T-ARF/p/12004980.html