3

画面の特定の領域を「マスクオフ」するために使用されるシステムトレイアプリを作成したい (これは、BPM カウンターなどの一部の DJ ソフトウェアの一部を非表示にするために使用されるため、ユーザーは練習中に BPM を非表示にしてから、明らかにする鍵。) 事実上、粘着テープをモニターに貼り付けるのと同じですが、厄介な残留物はありません!

要件は次のとおりです。

  1. ユーザーは、画面上でマスクしたい場所に多数の長方形を描画できる必要があります。(おそらくセットアップ/編集モードを使用)
  2. 長方形は常に上にある必要があります (一種のモーダルですが...)
  3. ユーザーは、以下のアプリケーションと対話できる必要があります。つまり、マウス クリックとキーの押下は、DJ ソフトウェアで機能する必要があります。
  4. ユーザーは、長方形の表示と非表示を切り替えることができる必要があります (毎回再描画する必要はありません)。

これにアプローチする最善の方法がわからない - 長方形をコンテンツやコントロールのないフォームの数だけにすることを考えました。これを達成するためのより良い(グラフィカルな方法)はありますか?パネルか長方形か何か?

4

3 に答える 3

3

理想的には、階層化されたフォームを使用したかったのですが、標準フォームを使用する方がはるかに簡単に記述でき、ここ StackOverflow で提示できます。

UX は素晴らしいとは言えませんが、それは問題ではありません。一般的なアイデアを提供するだけです。独自のインターフェースを自由に採用してください。

ここに画像の説明を入力

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;
    }
}
于 2013-05-14T13:00:58.500 に答える
0

これが私がそれを行う方法の概要です:

  1. デスクトップのスクリーンショットを撮ります。
  2. 最大化されたボーダレス フォームで表示します。
  3. ユーザーが長方形を選択できるようにします。「Rubberbanding」と Paint() イベントを調べて、一度に複数を描画します。
  4. 選択した Rectangles を GraphicsPath に追加し、フォームの Region() プロパティを設定します。これにより、長方形ではないフォームの部分が文字通り削除されます。
  5. CreateParams() で、WS_EX_TRANSPARENT フラグと WS_EX_NOACTIVATE フラグを設定します (これにより、マウス イベントが四角形を通過して下のアプリに到達できるようになります)。
  6. TopMost() を True に設定します。
  7. キーを押したときにフォームを切り替えるには、RegisterHotKey() を使用します。
于 2013-05-14T12:59:49.083 に答える
0

ポップアップを使用できます。たとえば、wpf では次のことができます。

<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)の黒いポップアップを表示/非表示にします。ここに画像の説明を入力

必要に応じて、移動可能および/またはサイズ変更可能にすることができます。もっと簡単な解決策は考えられません。

于 2013-05-14T13:15:53.663 に答える