그래서, 나에게 미지, hRgn
은 불규칙한 형태를 취할 수 (및 DwmEnableBlurBehindWindow
는 소요 hRgn
, 그러나 나는 그것을 알았다).
... 그리고 소스 코드 :
MainWindow.xaml :
<Window x:Class="IrregularGlassWindow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="500"
Width="500"
Background="#01FFFFFF"
AllowsTransparency="True"
WindowStyle="None"
ResizeMode="NoResize">
<Window.Clip>
<PathGeometry>
<PathFigure StartPoint="250,0">
<ArcSegment Point="250,500"
RotationAngle="180"
Size="250,250"
SweepDirection="Clockwise" />
<ArcSegment Point="250,0"
RotationAngle="180"
Size="250,250"
SweepDirection="Clockwise" />
</PathFigure>
</PathGeometry>
</Window.Clip>
<Grid>
<Ellipse Margin="1"
Width="498"
Height="498"
Stroke="#8FFF"
StrokeThickness="1.25" />
<Ellipse Width="500"
Height="500"
Stroke="#C000"
StrokeThickness="1"/>
</Grid>
</Window>
MainWindow.xaml 그래서, 여기에 내 WPF와 (다소) 호환 솔루션입니다. cs :
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
this.SourceInitialized += MainWindow_SourceInitialized;
this.KeyDown += MainWindow_KeyDown;
}
void MainWindow_KeyDown(object sender, KeyEventArgs e) {
if (e.Key == Key.Escape) this.Close();
}
void MainWindow_SourceInitialized(object sender, EventArgs e) {
var helper = new WindowInteropHelper(this);
var hwnd = helper.Handle;
var src = HwndSource.FromHwnd(hwnd);
src.CompositionTarget.BackgroundColor = Colors.Transparent;
WindowChrome.SetWindowChrome(this, new WindowChrome {
CaptionHeight = 500,
CornerRadius = new CornerRadius(0),
GlassFrameThickness = new Thickness(0),
NonClientFrameEdges = NonClientFrameEdges.None,
ResizeBorderThickness = new Thickness(0),
UseAeroCaptionButtons = false
});
GraphicsPath path = new GraphicsPath(FillMode.Alternate);
path.StartFigure();
path.AddArc(new RectangleF(0, 0, 500, 500), 0, 360);
path.CloseFigure();
var dbb = new DwmBlurBehind(true);
dbb.SetRegion(Graphics.FromHwnd(hwnd), new Region(path));
DwmApi.DwmEnableBlurBehindWindow(hwnd, ref dbb);
}
}
나는 누군가 다른 사람이 나를 때렸다 고 생각하지만 여기는 호다. 내 솔루션 작동 :
창이 SourceInitialized
이벤트가 발생하면 우리는 우리 창에 대한 핸들을 가지고 있음을 의미합니다. 그래서이 함수의 핸들러에서 윈도우 핸들을 얻습니다. 그런 다음 DwmEnableBlurBehindWindow
이라는 dwmapi.dll에서 가져온 함수를 호출합니다. 기본적으로 투명 영역을 특정 영역의 유리로 바꿉니다. DwmBlurBehind
struct는 pinvoke.net에서 가져 왔으며 GDI + System.Drawing.Region
을 hRgn
으로 변환합니다. hRgn
은 DwmEnableBlurBehindWindow
으로 전달되고 투명 부분은 Region
으로 잘립니다. 이 경우 원을 사용했습니다. 그런 다음 XAML은 액센트 테두리에 불과합니다.웬일인지 을 Transparent
으로 설정하면 AllowsTransparency
이 참일 때 히트 테스트가 활성화되지 않습니다. 이유는 모르겠지만, 아마도 코드 숨김과 관련이있을 것입니다.
달리 증명할 수없는 경우 wpf가 아닙니다. 하지만 (스눕을 사용하여) 시도했다면 답을 얻을 수 있습니다. – Will
WPF가 아닌 것을 압니다. 아마 Winapi의 영역에 있지만 WPF와 함께 작동하는 솔루션을 선호합니다. 사실, 나는 hRgn이 대답일지도 모른다고 생각합니다 ... – rookie1024
그것은 술입니다. wpf 솔루션이 없습니다. 또한 라이브러리 (예 : 특수한 창 크롬 라이브러리)를 요청하는 경우에도 문제가 발생합니다. 해킹 윈도우 크롬은 엉덩이에 왕실의 고통이 거의 없다. (내가 본 적이없는 크롬 해킹은 그저 빨지 않았다 ... 크롬). – Will