2013-05-14 2 views
3

화면의 특정 영역을 "마스크 해제"하는 데 사용되는 시스템 트레이 응용 프로그램을 만들고 싶습니다 (BPM 카운터와 같은 일부 DJ 소프트웨어의 일부를 숨기는 데 사용) 따라서 사용자는 연습 할 때 BPM을 숨기고 키를 눌러 나타낼 수 있습니다. 효과적으로 gaffer 테이프 조각을 모니터에 붙이는 것과 동일하지만 불쾌한 잔여 물을 남기지 않아도됩니다!C에서 부동 개체를 만드는 가장 좋은 방법 #

요구 사항은 다음과 같습니다

  1. 사용자들이 오프 마스크하려면 화면에 사각형의 숫자를 그릴 수 있어야합니다. (어쩌면 설정/편집 모드 사용)
  2. 사각형은 항상 맨 위에 있어야합니다 (모달의 종류 ...)
  3. 사용자는 아래의 응용 프로그램과 상호 작용할 수 있어야합니다. 키 입력은 사용자가 다음 표시하고이 문제를 접근하는 가장 좋은 방법의

확실하지 때마다 다시 그릴 필요없이 (사각형을 숨기는 사이를 전환 할 수 있어야한다

  • 디제이 소프트웨어를 작동합니다 -에 대한 생각 직사각형을 콘텐트 나 콘트롤이없는 수많은 형태로 만든다. 이것을 달성하기위한 더 좋은 방법이 있는가? (패널이나 사각형 등)

  • 답변

    3

    이상적으로는 layered form을 사용하고 싶었지만 표준 양식을 사용하면 여기에 쓰거나 작성하는 것이 훨씬 쉬워졌습니다. StackOverflow.

    UX는별로 멀지 않지만 그다지 중요하지 않습니다. 일반적인 생각을 말하면됩니다. 자신 만의 인터페이스를 자유롭게 채택해야합니다.

    enter image description here

    public sealed partial class GafferTape : Form 
    { 
        private Point _startLocation = Point.Empty; 
        private Point _cursorLocation = Point.Empty; 
        private bool _drawing; 
        private Rectangle _regionRectangle; 
        private readonly List<Rectangle> _rectangles = new List<Rectangle>(); 
    
        public bool AllowDrawing { get; set; } 
    
        public GafferTape() 
        { 
         InitializeComponent(); 
    
         //TODO: Consider letting the designer handle this. 
         FormBorderStyle = FormBorderStyle.None; 
         WindowState = FormWindowState.Maximized; 
         TopMost = true; 
         DoubleBuffered = true; 
         ShowInTaskbar = false; 
         Cursor = Cursors.Cross; 
         BackColor = Color.White; 
         Opacity = 0.4; 
         TransparencyKey = Color.Black; 
    
         //TODO: Consider letting the designer handle this. 
         MouseDown += OnMouseDown; 
         MouseUp += OnMouseUp; 
         MouseMove += OnMouseMove; 
         Paint += OnPaint; 
    
         AllowDrawing = true; 
    
        } 
    
        private void OnMouseDown(object sender, MouseEventArgs mouseEventArgs) 
        { 
         //I don't allow the user to draw after the rectangles have been drawn. See: buttonInvert_Clic 
         if (AllowDrawing) 
         { 
          _startLocation = mouseEventArgs.Location; 
          _drawing = true; 
         } 
        } 
    
        private void OnMouseUp(object sender, MouseEventArgs mouseEventArgs) 
        { 
         _drawing = false; 
         DialogResult = DialogResult.OK; 
         _rectangles.Add(_regionRectangle); 
        } 
    
        private void OnMouseMove(object sender, MouseEventArgs mouseEventArgs) 
        { 
         if (_drawing == false) 
          return; 
    
         _cursorLocation = mouseEventArgs.Location; 
    
         _regionRectangle = new Rectangle(Math.Min(_startLocation.X, _cursorLocation.X), 
                 Math.Min(_startLocation.Y, _cursorLocation.Y), 
                 Math.Abs(_startLocation.X - _cursorLocation.X), 
                 Math.Abs(_startLocation.Y - _cursorLocation.Y)); 
    
         Invalidate(); 
        } 
    
        private void OnPaint(object sender, PaintEventArgs paintEventArgs) 
        { 
         foreach (Rectangle rectangle in _rectangles) 
          paintEventArgs.Graphics.FillRectangle(Brushes.Black, rectangle); 
    
         paintEventArgs.Graphics.FillRectangle(Brushes.Black, _regionRectangle); 
        } 
    
        private void buttonInvert_Click(object sender, EventArgs e) 
        { 
         Opacity = 100; 
         TransparencyKey = Color.White; 
         AllowDrawing = false; 
         Cursor = Cursors.Default; 
        } 
    } 
    
    +0

    정말 멋지다! 단 한가지는 버튼이 그려지는 곳을 볼 수 없다는 것입니다. – Ben

    +0

    저는 디자이너를 사용하여 버튼을 배치하고'Anchor' 속성'Top, Left'을 사용했습니다. 미안하다 : C –

    +0

    Spot on! 이 건배 - 꼭 필요한 것. – Ben

    0

    는 여기에 내가 그것을 할 것입니다 방법에 대한 개요입니다 :

    1. 는 바탕 화면의 스크린 샷을 가져 가라.
    2. 최대화, 경계선없는 양식으로 표시하십시오.
    3. 사용자가 사각형을 선택할 수 있도록 허용합니다. 한 번에 둘 이상을 그릴 수있는 "Rubberbanding"및 Paint() 이벤트를 찾습니다.
    4. 선택한 Rectangle을 GraphicsPath에 추가하고 Form의 Region() 속성을 설정합니다. 이것은 문자 그대로 직사각형이 아닌 부분을 제거합니다.
    5. CreateParams()에서 WS_EX_TRANSPARENT 및 WS_EX_NOACTIVATE 플래그를 설정합니다. 이렇게하면 마우스 이벤트가 사각형을 "아래로"넘어갈 수 있습니다.
    6. TopMost()를 True로 설정하십시오.
    7. 키 누르기에서 양식을 토글하려면 RegisterHotKey()를 사용하십시오.
    0

    당신은 팝업을 사용할 수 있습니다.

    <Window x:Class="WpfApplication2.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow"> 
        <Grid> 
         <ToggleButton x:Name="Button" Content="Show/Hide" Height="25"/> 
         <Popup Width="300" Height="300" IsOpen="{Binding Path=IsChecked, ElementName=Button}" Placement="Absolute" PlacementRectangle="1,1,1,1"/> 
        </Grid> 
    </Window> 
    

    그것은/표시 버튼을 누를 때마다 지정된 위치 (화면의 왼쪽 상단 모서리)에서 지정된 크기 (최대 300x300)의 블랙 팝업을 숨길 예를 들어, WPF에서 당신은 followning을 수행 할 수 있습니다 enter image description here

    원하는 경우 이동식 또는 크기 조정할 수 있습니다. 나는 더 쉬운 해결책을 생각할 수 없다.

    관련 문제