【问题标题】:Overlay an InkCanvas on a custom WinForms control在自定义 WinForms 控件上覆盖 InkCanvas
【发布时间】:2015-05-28 18:03:13
【问题描述】:

我有一个显示一些图形的自定义 WinForms 控件。我需要在此控件之上覆盖InkCanvasInkCanvas 应该是“透视”(透明背景,可见墨水)。这个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……

标签: c# wpf winforms inkcanvas


【解决方案1】:

基于 cmets 和缺乏答案,我们可以安全地假设我想做的事情是不可能的,除非我们执行 @Hans Passant 提到的“窗口分层”黑客。

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 2013-03-04
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2012-08-29
    相关资源
    最近更新 更多