2008-11-28 61 views
1

Hiya - 由我的一位朋友指出你们。我有一个MDI应用程序(C#,Winforms,.NET 2.0,VS2005,DevExpress 8.2),我的一个表单行为非常奇怪 - 没有正确重绘自身,它与同一个表单类的另一个实例重叠。MDI儿童刷新/重新绘制问题(C#,Winforms,.NET 2.0,VS2005,DevExpress 8.2)

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

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

问题1(次要):除非重新调整窗体大小,否则此控件重新定位/调整大小似乎不起作用,所以在重新排列后我将宽度向上和向下微移一个像素。丑,哈克,我真的很喜欢不必这样做。

问题2(主要): 如果显示窗体,然后使用API​​调用SetParent附加到MDI窗体,当我显示第二个实例时,两个窗体的各个部分在它们重叠的位置未正确绘制 - 最重要的是落后于现有的 - 当表格移动时,这个问题变得更糟,使得它们基本上不可用。其他儿童形式(如果存在)的不同类型似乎不受影响...

停止按钮:我已经确定它不必是2个子窗体的实例。只有一个问题还存在问题 - 主要是在表单的边缘,比如正在刷新的区域比表单本身小。

如果使用子窗体的.MDIParent属性设置父项,则不会发生此问题 - 但由于窗体可能由托管在非.Net应用程序中的控件显示,因此我们无法执行此操作。此外,即使现有的(不同类型的)子项最大化,并且只能使用SetParent,我也需要显示非最大化的子窗体。

我已经尝试刷新()在这种类型的所有形式(我有一个控制器,它们的列表),但没有喜悦。我试图从具有相同继承结构的基本应用程序中重现此效果,但我不能。显然这是关于表单的东西 - 因为我昨天从头重新创建表单,它仍然是一样的,它必须是代码 - 但是什么?

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

+0

你太......太大了,我咀嚼不了。 Prob1尝试使用户界面无效,以便重新绘制。和形式继承...坏行为。 – Gishu 2008-11-28 10:45:18

+0

我试过Invalidate() - 这只是Refresh(),但延迟到一个方便的点。刷新()似乎并没有做很多好事。 表单继承是一个好主意*。这是VS的实现sux。叹。控制似乎没问题,这就是我被诱惑的原因。 – kpollock 2008-11-28 11:54:12

回答

0

啊哈!

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

这会为我做。 :-)

1

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

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

0

我知道这是一个古老的线程,但我确实为我解决了这个问题。这可能会帮助有类似问题的人。

我的问题: 我们有我们在通过分离器分离的父窗口中嵌入两个外部应用程序的应用程序。它用于并排显示来自两个应用程序的信息。我们面临的问题是两个子窗口在父窗口上绘制得很好(使用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)); 

这个款式确实是它可以防止父窗口的重新绘制的子窗口所占用的面积。这完全解决了我的问题。