2013-05-21 2 views
2

표준 제목 표시 줄이있어 사용자가 양식을 잡고 이동할 수 있습니다. 특정 상황에서는이 이동을 가로 전용으로 제한하기를 원하므로 마우스가 실제로 움직이는 방법과 관계없이 양식은 동일한 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 좌표에서 벗어나지 않도록하는 방법이 있습니까?

+0

이 어떤 이유로 나를 위해 작동하지 않습니다 – nsg

답변

3

트랩 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);    
    } 
} 
+0

불행하게도,'Moving' 또는'LocationChanging' 이벤트가 없다면, 아마도 이것이 최선의 선택 일 것입니다. +1 – JosephHirn

+0

이것은 올바르게 작동합니다. 고마워, 넌 정말 대단해. – nsg

3

적절한 경우 마우스의 Y 좌표를 사용하여 X 좌표를 정적 값으로 대체하면됩니다. 예 :

+0

(약간 점을 명확히하기 위해 편집). 사용자가 제목 표시 줄을 잡고 주변에서 이동할 때 양식이 ... MouseMove를받지 못합니다. 오직 ... 이동. 그리고 그때까지 형태는 이미 움직였습니다. – nsg

+0

만약 그것이 작동한다면 나는 수평 이라기보다는 수직 운동이라고 부릅니다. – vidstige

관련 문제