簡體   English   中英

如何限制表格水平移動?

[英]How to restrict form movement to horizontal?

我有一個帶有標准標題欄的標准表單,用戶可以抓住它並在其中移動表單。 在某些情況下,我只想將此移動限制為水平,因此,無論鼠標實際如何移動,表單都將保持在相同的Y坐標上。

為此,我捕獲了移動事件,當我檢測到與Y的偏差時,將表單移回原始Y。

private void TemplateSlide_Move(object sender, EventArgs e)
{
    int y = SlideSettings.LastLocation.Y;
    if (y != this.Location.Y)
    {
        SlideSettings.LastLocation = new Point(this.Location.X, y);
        this.Location=Settings.LastLocation;
    }
}

但這會引起很多閃爍。 另外,由於窗體實際上偏離期望的Y有一小段時間,因此會導致其他與我的程序有關的問題。

有沒有一種方法可以防止表單偏離所需的Y坐標?

在適當的情況下,只需使用鼠標的Y坐標,用您的靜態值替換X坐標即可。 例如

... // e.g Mouse Down
originalX = Mouse.X; // Or whatever static X value you have.

... // e.g Mouse Move
// Y is dynamically updated while X remains static
YourObject.Location = new Point(originalX, Mouse.Y);

陷阱WM_MOVING並相應地修改LPARAM中的RECT結構。

就像是:

public partial class Form1 : Form
{

    public const int WM_MOVING = 0x216;

    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    private int OriginalY = 0;
    private int OriginalHeight = 0;
    private bool HorizontalMovementOnly = true;

    public Form1()
    {
        InitializeComponent();
        this.Shown += new EventHandler(Form1_Shown);
        this.SizeChanged += new EventHandler(Form1_SizeChanged);
        this.Move += new EventHandler(Form1_Move);
    }

    void Form1_Move(object sender, EventArgs e)
    {
        this.SaveValues();
    }

    void Form1_SizeChanged(object sender, EventArgs e)
    {
        this.SaveValues();
    }

    void Form1_Shown(object sender, EventArgs e)
    {
        this.SaveValues();
    }

    private void SaveValues()
    {
        this.OriginalY = this.Location.Y;
        this.OriginalHeight = this.Size.Height;
    }

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_MOVING:
                if (this.HorizontalMovementOnly)
                {
                    RECT rect = (RECT)System.Runtime.InteropServices.Marshal.PtrToStructure(m.LParam, typeof(RECT));
                    rect.Top = this.OriginalY;
                    rect.Bottom = rect.Top + this.OriginalHeight;
                    System.Runtime.InteropServices.Marshal.StructureToPtr(rect, m.LParam, false);
                }
                break;
        }
        base.WndProc(ref m);            
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM