RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 575142
Accepted
Byulent
Byulent
Asked:2020-10-08 13:21:23 +0000 UTC2020-10-08 13:21:23 +0000 UTC 2020-10-08 13:21:23 +0000 UTC

如何正确判断窗体的右边框?

  • 772

您希望移动控件使其不超出窗体的边界。使用左边框,跟踪边框很容易:

if (PointToClient(p).X >= 0){/*код*/ }

但是当我尝试这样做时:

int w = ActiveForm.Size.Width;
if (PointToClient(p).X <= w){/*код*/ }

该元素仍然超出了右边界。也就是说Size.Width,它不是窗体的右边框。

对此,问题是:如何确定正确的边界?

c#
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    BlackWitcher
    2020-10-08T20:11:29Z2020-10-08T20:11:29Z

    作为答案,我可以提供一个简单的“在额头上”,但仍然是SLN 形式的解决方案。

    在那里,一个面板只是在窗体上运行,从窗体的边缘和顶部面板开始,检查控件(面板)的坐标是否超出设置的边界。

    问题演示

    代码本身:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace RightMargin
    {
        /// <summary>
        /// Description of MainForm.
        /// </summary>
        public partial class MainForm : Form
        {
            public bool MoveActive { get; set; }
            public int deltaX { get; set; }
            public int deltaY { get; set; }
    
            public MainForm()
            {
                InitializeComponent();
                MoveActive = false;
                deltaX = 1;
                deltaY = 1;
            }
    
            void buttonCloseClick(object sender, EventArgs e)
            {
                MoveActive = false;
                Close();
            }
    
            void ButtonStartClick(object sender, EventArgs e)
            {
                MoveActive = true;
                while (MoveActive)
                {
                    int newX = boxPanel.Left + deltaX;
                    int newY = boxPanel.Top + deltaY;
    
                    int maxX = ActiveForm.ClientSize.Width - boxPanel.Size.Width - 1;
                    int maxY = ActiveForm.ClientSize.Height - boxPanel.Size.Height - 1;
    
                    //Проверка координат
                    if (newX < 0)
                    {
                        newX = 0; deltaX = -deltaX;
                    }
                    if (newY < panelMenu.Size.Height)
                    {
                        newY = panelMenu.Size.Height; deltaY = -deltaY;
                    }
                    if (newX > maxX)
                    {
                        newX = maxX; deltaX = -deltaX;
                    }
                    if (newY > maxY)
                    {
                        newY = maxY; deltaY = -deltaY;
                    }
    
                    boxPanel.Left = newX;
                    boxPanel.Top = newY;
                    //Thread.Sleep(2);
                    Application.DoEvents();
                }
            }
    
            void ButtonStopClick(object sender, EventArgs e)
            {
                MoveActive = false;
            }
        }
    }
    
    • 4
  2. rdorn
    2020-10-08T22:15:24Z2020-10-08T22:15:24Z

    您的问题更多是关于数学而不是编程。但是因为缺一不可,我会详细写的。

    去。控件在窗体上的位置和窗体在屏幕上的位置由左上角的位置和属性Control.Location(下图中红点)设置。剩余角的位置可以通过将属性中设置的控件的长度和/或宽度添加Control.Size到坐标来计算Control.Location。

    在此处输入图像描述

    这样,为了让控件始终完全保持在父控件(窗体也是控件)的边界内,坐标值Control.Location不应该超出图中绿色区域的边界。这个区域的大小很容易根据控件和父控件的大小计算出来。

    它仍然只考虑一点。控件可以具有特定的边框样式,这对于窗体尤其重要。该属性Control.Size设置控件的外部尺寸,因此如果您使用它们来确定可用的绘图区域,则子控件将落在框架或表单标题下。这不是你想看到的结果。考虑到控件、框架、标题等的设计尺寸,定义了该属性Control.ClientSize,其中包含可用于绘制子元素的区域的实际尺寸(仔细阅读图中的标题)。

    • 2
  3. Arhadthedev
    2020-10-08T13:49:21Z2020-10-08T13:49:21Z

    正确确定了右边界。您只是检查一个特定点的可见性 - 控件的左上角。

    此外,检查也不严格,捕获超出右边界的一个像素(因为坐标在 0 ≤ x < (width) 范围内,因为从零开始计数)。

    最后,检查元素左边框相对于零的位置以及右边框相对于表单宽度的位置是有意义的。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5