【问题标题】:MDI Child refresh/repaint problems (C#, Winforms, .NET 2.0, VS2005, DevExpress 8.2)MDI 子刷新/重绘问题(C#、Winforms、.NET 2.0、VS2005、DevExpress 8.2)
【发布时间】:2010-09-24 10:27:35
【问题描述】:

嗨,我的一个朋友指着你们。

我有一个 MDI 应用程序(C#、Winforms、.NET 2.0、VS2005、DevExpress 8.2),我的一个表单的行为非常奇怪 - 在与同一表单类的另一个实例重叠的地方没有正确地重新绘制自身。

表单包含一个自定义控件(其中包含各种 DevExpress 控件),并且继承自基本表单(它本身是继承的)。

由于表单继承的问题(那个老栗子),在构造函数中进行了一些控制重新排列。

问题 1(次要):除非调整表单大小,否则此控件重新定位/调整大小似乎都不会生效,因此我在重新排列后将宽度上下微调了一个像素。丑陋,hacky,我真的不想这样做。

问题 2(主要): 如果显示表单然后使用 API 调用 SetParent 将其附加到 MDI 表单,当我显示第二个实例时,两个表单的各个部分在它们重叠的地方没有正确绘制 - 顶部的位在现有的后面 - 这当表单四处移动时问题会变得更糟,使它们基本上无法使用。其他不同类型的子窗体(如果存在)似乎不受影响...

停止新闻:我已经确定它不必是子表单的 2 个实例。只有一个仍然存在问题 - 主要是围绕表单的边缘,例如正在刷新的区域小于表单本身。

如果使用子窗体的 .MDIParent 属性设置父窗体,则不会出现此问题 - 但我们不能这样做,因为窗体可能由非 .Net 应用程序中托管的控件显示。此外,即使现有子项(不同类型)已最大化,我也需要显示未最大化的子表单,并且仅使用 SetParent 发生。

我已经在这种类型的所有表单上尝试了 Refresh() (我有一个保存它们列表的控制器),但没有任何乐趣。我试图从具有相同继承结构的基本应用程序中重现这种效果,但我做不到。显然它与表单有关 - 因为我昨天从头开始重新创建表单,它仍然是相同的,它必须是代码 - 但是什么?

我不是表格绘画等活动中最热门的,所以我错过了什么吗?

【问题讨论】:

  • 你太远了……太大了,我无法咀嚼。 Prob1 尝试使 UI 无效,以便重新绘制。并形成继承......糟糕的举动。
  • 我已经尝试过 Invalidate() - 这只是 Refresh() 但延迟到一个方便的点。 Refresh() dpes 似乎也没有什么好处。表单继承是一个很好的idea。这是 VS 的实现。叹。控件似乎没问题,这就是我受到诱惑的原因。

标签: c# winforms visual-studio-2005 .net-2.0


【解决方案1】:

我知道这是一个旧线程,但我为我解决了这个问题。这可能会对遇到类似问题的人有所帮助。

我的问题: 我们有一个应用程序,其中我们将两个外部应用程序嵌入到一个由拆分器分隔的父窗口中。它用于并排显示来自两个应用程序的信息。我们面临的问题是两个子窗口在父窗口上绘制得很好(使用 SetParent、SetWindowLong 和 MoveWindow),但是在子窗口中移动或执行操作时,它们会出现绘制/刷新问题(更具体地说,父面板将被绘制在子窗口上)

在阅读了大量关于嵌入窗口、SetParent 问题的文章后,MSDN 页面http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx 给了我一个线索。

解决方案: 使用 SetWindowLong(设置样式)时,使用 WS_CLIPCHILDREN 样式 -

::SetWindowLong(hwnd, GWL_STYLE, WS_VISIBLE | WS_CLIPCHILDREN));

这种样式的作用是防止父窗口重新绘制子窗口占用的区域。这完全为我解决了这个问题。

【讨论】:

    【解决方案2】:

    是的,就可以了。更改 FormBorderStyle 需要 Windows 窗体从头开始重新创建窗口,现在在 CreateWindowEx() 调用中使用不同的样式标志。这将使它完全忘记您使用 SetParent() P/Invoke 设置的父级。还有许多其他属性会导致这种情况发生。通过在 OnHandleCreated() 方法的覆盖中进行这些调用来避免您遇到的那种麻烦。

    更好的是,通过将所有控件和逻辑放在 UserControl 中,完全避免麻烦的 API,例如 SetParent()。

    【讨论】:

    • 我很想放弃 MDI,但我们坚持使用它(因此出于上述原因使用 SetParent)。我省略的一个复杂之处是调用表单的 UserControl 也可以在 Powerbuilder MDI 中,因此它必须是 SetParent(至少在这种情况下)。
    【解决方案3】:

    啊哈!

    在显示表单之前,我在代码中更改了 FormBorderStyle。我删除了那条线,问题就消失了......

    这对我有用。 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多