|
1
1
Windows绘制模型非常符合您的要求。它将绘制背景(onpaint background)与前景(onpaint)分开。但这并不意味着你只能画一次背景,然后就可以完成了。窗口表面无效会同时调用这两者。最重要的是,要使消除混叠效果正常工作,它们只能在已知的背景色下看起来很好。 Punt并在onpaintbackground()重写中绘制图像。通过分配BackgroundImage属性,可以让控件自动为您执行此操作。您可能需要将DoubleBuffer属性设置为true,以避免在绘制背景时看到闪烁,从而暂时擦除前景像素。如果需要更新前台,请调用invalidate()。 要完整,你的幻想实际上是可能的。你需要用一个顶层的分层窗口覆盖图像。对于设置了transparencykey属性的窗体,这很容易实现。下面是一个示例实现:
一个有趣的工件:最小化表单并重新恢复它看起来,呃,很特别。 |
|
|
2
1
gdi+不是保留模式,因此您需要在每个绘制上重新绘制整个控件。所以不幸的是,你不能只拥有两个“东西”并对其中一个应用旋转。您对GDI+的最佳选择可能是:
然后在绘制处理程序中使用graphics.drawimage快速重新绘制1,使用graphics.rotateTransform设置旋转变换,并绘制线。您应该能够使用双缓冲(controlStyles.doubleBuffer)使其看起来平滑。 至于“完全不同”的方式,嗯,你所说的“幻想”被称为“Windows演示基金会”。WPF确实有一个保留模式的图形系统,可以更方便地处理“旋转一层,同时保持另一层不变”。您可以使用elementHost控件在WinForms中承载WPF。粗略的想法是使用网格在图像上覆盖画布,向画布添加线条对象,将画布的renderTransform设置为RotateTransform,并将RotateTransform的角度绑定到其他控件的值。但是,这确实会引起项目考虑(目标平台、学习曲线)和技术考虑(加载WPF DLL的初始开销、互操作约束)。 |