处理窗口缩放

本文介绍如何通过锚定PageLayoutControl和MapControl并利用Windows消息禁用缩放时的数据重绘,来提升控件在窗口缩放过程中的性能表现。

当窗口在运行时进行缩放时,PageLayoutControlMapControl不会自动改变自身的尺寸。要改变控件的尺寸以便它们总是与匹配窗口的范围,你必须将控件定在窗口上。如果PageLayoutControlMapControl包含大量的数据,在窗口缩放期间重绘这些数据显得相当重要。为了提高执行效率,你可以禁止数据重绘直到缩放操作完成后再重绘之。在缩放时,可以用一个可伸缩的位图来替代重绘数据。

1.       在设计模式显示窗体并从属性窗口中选择axPageLayoutControl1。单击Anchor属性,将axPageLayoutControl1锚定在窗体的顶、左、底和右部。

2.       锚定axMapControl控件到窗体的顶、左和底部。

3.       Form_Load事件的开头增加以下代码:

// 当缩放时禁止重绘

this.SetStyle(ControlStyles.EnableNotifyMessage, true);

4.       向类增加以下常量:

        public class Form1 : System.Windows.Forms.Form

     {

         // ……

         private const int WM_ENTERSIZEMOVE = 0x231;

private const int WM_EXITSIZEMOVE = 0x232;

  // ……

}

5.       向重载的OnNotifyMessage方法中增加下列代码:

     protected override void OnNotifyMessage(Message m)

     {

         base.OnNotifyMessage (m);

        

         // 以下为手工添加的代码

         if ( m.Msg == WM_ENTERSIZEMOVE)

         {

             axMapControl1.SuppressResizeDrawing(true, 0);

             axPageLayoutControl1.SuppressResizeDrawing(true, 0);

         }

         else if ( m.Msg == WM_EXITSIZEMOVE)

         {

             axMapControl1.SuppressResizeDrawing(false, 0);

             axPageLayoutControl1.SuppressResizeDrawing(false, 0);

         }

}

6.       生成并运行应用程序,试着缩放窗口。

注:禁止缩放时重画方法是通过检查发送到窗体的Windows消息工作的。当窗口开发缩放时,Windows发送WM_ENTERSIZEMOVE窗口消息。此时,我们禁止在MapControlPageLayoutControl上绘制图形,而是使用“stretchy bitmap”绘制。当Windows发送WM_EXITSIZEMOVE消息时,窗体结束缩放,这时我们全部重绘新的范围。 

在PyQt5中,如果你想要窗口内的内容在缩放时保持其原始的比例,你需要使用固定比例的布局并且计算每个部件的大小以适应新尺寸。以下是一个例子,使用`QSizeConstraint`和`QGraphicsView`来实现在缩放时保持内容比例: ```python from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView from PyQt5.QtGui import QPainter, QImage, QPixmap, QSize class ScaleAwareGraphicsView(QGraphicsView): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.scene = QGraphicsScene() self.setScene(self.scene) self.setSizeConstraint(QGraphicsView.SizeAdjustPolicy.AdjustToContents) self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) def sizeHint(self): size = super().sizeHint() return QSize(size.width(), size.height() * self.scene.devicePixelRatioF()) def minimumSizeHint(self): size = super().minimumSizeHint() return QSize(size.width(), size.height() * self.scene.devicePixelRatioF()) def resizeEvent(self, event): width, height = event.size().width(), event.size().height() if width <= 0 or height <= 0: return self.fitInView(self.scene.itemsBoundingRect(), Qt.KeepAspectRatioByExpanding) # 使用ScaleAwareGraphicsView作为窗口的中心部分 central_widget = ScaleAwareGraphicsView() main_window = QMainWindow() main_window.setCentralWidget(central_widget) main_window.show() ``` 在这个例子中,`ScaleAwareGraphicsView`会自动保持内容的宽高比,并在窗口大小改变时适当地调整视图的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值