【发布时间】:2015-05-28 18:03:13
【问题描述】:
我有一个显示一些图形的自定义 WinForms 控件。我需要在此控件之上覆盖InkCanvas。 InkCanvas 应该是“透视”(透明背景,可见墨水)。这个InkCanvas 允许用户在显示的图形上绘制草图。
我知道 WPF/WinForms 互操作中的空域问题(事实上,托管在 WPF 窗口中的 WinForms 元素将始终位于所有其他组件之上)。所以显然我无法在 WPF 中达到预期的效果。我决定反过来解决这个问题(在 WinForms 表单中托管 InkCanvas 并在我的自定义控件上覆盖 InkCanvas)。
问题是 WinForms ElementHost 不能被“透视”(不能设置透明度)。我尝试使用以下覆盖派生 ElementHost
protected override CreateParams CreateParams
{
get
{
const int WS_EX_TRANSPARENT = 0x20;
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
return cp;
}
}
但这会使整个事物完全透明(草图不再可见)。
如何让“透视”InkCanvas 在 WinForms 控件上覆盖可见墨迹?
【问题讨论】:
-
由于“空域”问题,我认为您不能这样做。这是有关该主题的资源,不确定它是否完全适用于您的问题...blogs.msdn.com/b/dwayneneed/archive/2013/02/26/…
-
ElementHost 创建一个“空域”,它不能删除一个。唯一可行的方法是在现有的窗口之上再添加一个透明的无边框窗口。
-
谢谢你们。我明白了……如果是这样,那我会考虑在图形查看器用户控件中创建自己的 InkCanvas……