滚动条的问题

本文详细介绍了如何使用 C# 编程语言通过 WinAPI 函数实现滚动条的定位和窗口大小的调整,包括获取滚动条位置、设置滚动条位置、发送消息等操作,并通过实例展示了具体的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体实现:当出现滚动条时,定位到中心位置     

const int EM_LINESCROLL = 0x00B6;
        [DllImport("user32.dll")]
        static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);
        [DllImport("user32.dll")]
        static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
        [DllImport("user32.dll")]
        static extern int GetScrollPos(IntPtr hwnd, int nbar);
        [DllImport("user32", CharSet = CharSet.Auto)]
        private static extern bool PostMessage(IntPtr hWnd, int nBar, int wParam, int lParam);
        [DllImport("user32", CharSet = CharSet.Auto)]
        private static extern bool GetScrollRange(IntPtr hWnd, int nBar, out int lpMinPos, out int lpMaxPos);
        [DllImport("user32.dll")]
        static extern bool SetScrollRange (IntPtr hwnd, int iBar, int iMin,int  iMax,bool bRedraw) ;
   //  [DllImport("user32.dll")]
   //static extern bool GetScrollRange(IntPtr hwnd,int ibar,out int X ,out int y);
private const int SB_HORZ = 0x0;
private const int SB_VERT = 0x1;
private const int WM_HSCROLL = 0x114;
private const int WM_VSCROLL = 0x115;
private const int SB_THUMBPOSITION = 4;

 

 public int HScrollPos
        {
            get { return GetScrollPos((IntPtr)this.scrollpanel.Handle, SB_HORZ); }
            set { SetScrollPos((IntPtr)this.scrollpanel.Handle, SB_HORZ, value, true); }
        }

        /// <summary>
        /// Gets and Sets the Vertical Scroll position of the control.
        /// </summary>
        public int VScrollPos
        {
            get { return GetScrollPos((IntPtr)this.scrollpanel.Handle, SB_VERT); }
            set { SetScrollPos((IntPtr)this.scrollpanel.Handle, SB_VERT, value, false); }
        }

 

 

private void 放大_Click_1(object sender, EventArgs e)
        {

            btnSmaller.Enabled = true;
            int CtlWidth = axPhRemoteCtrl.Size.Width;
            int CtlHeight = axPhRemoteCtrl.Size.Height;
            int HeightConstX = CtlWidth / 10, HeightConstY = CtlHeight / 10;
            int CenterPointX = CtlWidth / 20, CenterPointY = CtlHeight / 20;
           

            this.axPhRemoteCtrl.Dock = DockStyle.None;
            this.axPhRemoteCtrl.Size = new Size(CtlWidth + HeightConstX, CtlHeight + HeightConstY);

            VScrollPos += CenterPointY;
            SendMessage(this.scrollpanel.Handle, WM_VSCROLL, SB_THUMBPOSITION + 0x10000 * CenterPointY, 0);
            HScrollPos += CenterPointX;
            SendMessage(this.scrollpanel.Handle, WM_HSCROLL, SB_THUMBPOSITION + 0x10000 * CenterPointX, 0);

            this.scrollpanel.Invalidate();
        }
 private void 缩小_Click(object sender, EventArgs e)
        {
            GetScrollRange(this.scrollpanel.Handle, SB_HORZ, out hx, out hy);
            GetScrollRange(this.scrollpanel.Handle, SB_VERT, out vx, out vy);
            MessageBox.Show(hx+ " "+ hy + " "+vx + " "+ vy );
            this.btnLarger.Enabled = true;
            int CtlWidth = axPhRemoteCtrl.Size.Width;
            int CtlHeight = axPhRemoteCtrl.Size.Height;
            int HeightConstX = -CtlWidth / 10, HeightConstY = -CtlHeight / 10;
            int CenterPointX = -CtlWidth / 20, CenterPointY = -CtlHeight / 20;
            if (this.scrollpanel.Width >= (CtlWidth + 2*HeightConstX) || scrollpanel.Height >= (CtlHeight + 2*HeightConstY))
            {
                //MessageBox.Show(this.scrollpanel.Width + " >= " + (CtlWidth + HeightConstX) + "||" + scrollpanel.Height + ">=" + (CtlHeight + HeightConstY));
                this.axPhRemoteCtrl.Dock = DockStyle.Fill;
                this.btnSmaller.Enabled = false;
                return;
            }

            this.axPhRemoteCtrl.Dock = DockStyle.None;
            this.axPhRemoteCtrl.Size = new Size(CtlWidth + HeightConstX, CtlHeight + HeightConstY);
            VScrollPos += CenterPointY;
            SendMessage(this.scrollpanel.Handle, WM_VSCROLL, SB_THUMBPOSITION + 0x10000 * CenterPointY, 0);
            HScrollPos += CenterPointX;
            SendMessage(this.scrollpanel.Handle, WM_HSCROLL, SB_THUMBPOSITION + 0x10000 * CenterPointX, 0);

            this.scrollpanel.Invalidate();
        }

内容概要:本文针对火电厂参与直购交易挤占风电上网空间的问题,提出了一种风火打捆参与大用户直购交易的新模式。通过分析可再生能源配额机制下的双边博弈关系,建立了基于动态非合作博弈理论的博弈模型,以直购电价和直购电量为决策变量,实现双方收益均衡最大化。论文论证了纳什均衡的存在性,并提出了基于纳什谈判法的风-火利益分配方法。算例结果表明,该模式能够增加各方收益、促进风电消纳并提高电网灵活性。文中详细介绍了模型构建、成本计算和博弈均衡的实现过程,并通过Python代码复现了模型,包括参数定义、收益函数、纳什均衡求解、利益分配及可视化分析等功能。 适合人群:电力系统研究人员、能源政策制定者、从事电力市场交易的工程师和分析师。 使用场景及目标:①帮助理解风火打捆参与大用户直购交易的博弈机制;②为电力市场设计提供理论依据和技术支持;③评估不同政策(如可再生能源配额)对电力市场的影响;④通过代码实现和可视化工具辅助教学和研究。 其他说明:该研究不仅提供了理论分析,还通过详细的代码实现和算例验证了模型的有效性,为实际应用提供了参考。此外,论文还探讨了不同场景下的敏感性分析,如证书价格、风电比例等对市场结果的影响,进一步丰富了研究内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值