我有一个MDI应用程序(C#,Winforms,.NET 2.0,VS2005,DevExpress 8.2),我的一个表单表现得非常奇怪 - 在与另一个同一表单类的实例重叠的地方没有正确地重新绘制。
表单包含一个自定义控件(包含各种DevExpress控件),并从基本表单(它本身是继承的)继承。
由于表单继承(旧栗子)的问题,在构造函数中有一些控件重新排列。
问题1(次要):除非重新调整窗体大小,否则此控件重新定位/调整大小似乎都没有生效,所以在重新排列后,我将宽度上下移动一个像素。丑陋,hacky,我真的不想这样做。
问题2(专业): 如果显示表单然后使用API调用SetParent附加到MDI表单,当我显示第二个实例时,两个表单的各个部分没有正确绘制它们重叠的位置 - 顶部的一些位于现有位置的后面 - 这个当表单移动时问题变得更糟,使它们基本上不可用。其他类型的其他子形式(如果存在)似乎不受影响......
STOP PRESS:我已经确定它不必是子表单的2个实例。只有一个仍然存在问题 - 主要是围绕表单的边缘,就像正在刷新的区域小于表单本身。
如果使用子表单的.MDIParent属性设置父级,则不会发生此问题 - 但我们无法执行此操作,因为表单可能由非.Net应用程序中托管的控件显示。此外,我需要显示非最大化的子表单,即使现有的子类(不同类型)最大化,并且只发生使用SetParent。
我已经在这种类型的所有形式上尝试过Refresh()(我有一个控制器可以保存它们的列表),但没有快乐。我试图从具有相同继承结构的基本应用程序重现此效果,但我不能。显然它是关于表单的东西 - 因为我昨天从头开始重新创建表单并且它仍然是相同的必须是代码 - 但是什么?
我不是表格绘画活动等最热门的,所以我错过了什么?
答案 0 :(得分:1)
是的,那就行了。更改FormBorderStyle需要Windows窗体从头开始重新创建窗口,现在在CreateWindowEx()调用中使用不同的样式标志。这将使它完全忘记您使用SetParent()P / Invoke设置的父级。还有很多其他属性会导致这种情况发生。避免在重写OnHandleCreated()方法时进行这些调用所带来的麻烦。
更好的是,通过将所有控件和逻辑放在UserControl中,完全避免像SetParent()这样麻烦的API。
答案 1 :(得分:0)
啊哈!
我在显示表单之前更改了代码中的FormBorderStyle。我删除了该行,问题就消失了......
这对我有用。 : - )
答案 2 :(得分:0)
我知道这是一个老线程,但我确实为我解决了这个问题。这可能会帮助有类似问题的人。
我的问题: 我们有一个应用程序,我们在父窗口中嵌入两个外部应用程序,由分割器分隔。它用于并排显示两个应用程序的信息。我们遇到的问题是两个子窗口正好在父窗口上绘制(使用SetParent,SetWindowLong和MoveWindow),但在子窗口中移动或执行操作时,它们会产生绘制/刷新问题(更具体地说,父面板将被绘制在子窗口上)
在阅读了大量有关嵌入Windows,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));
此样式的作用是阻止父窗口重新绘制子窗口占用的区域。这完全解决了我的问题。