次のレベルへのWindowsエラーボックス


15

1つのことしかできないWindowsボックスを知っていますか?

Windowsエラーボックス:続行すると、ハードドライブの内容が削除されます。 何をしたいですか? <続行> <削除>

これを次のレベルに進めましょう!

チャレンジ

どこにでもカーソルの後に続くボタンを備えたダイアログボックスを作成してください!

スペック

入力は受け付けられません。STDOUTまたはSTDERRに出力される場合があります。1つのボタンでウィンドウを開く必要があります(テキストは必要ありませんが、テキストはウィンドウタイトル、ダイアログボックス、またはボタンのいずれかに含まれる場合があります)。ボタンはクリック可能でなければならず、クリックできるように常にカーソルの下に置かなければなりません。クリックすると、何でもできますが、これをテストするため、コンピューターをクラッシュさせないでください...ボタンが押されていない限り、ダイアログボックスは開いたままにしておく必要がありますが、ボタンが閉じられたときに閉じる。

あなたができる仮定

  • カーソルが描画キャンバス内にとどまると想定できます。
  • ウィンドウのフォーカスが維持されると想定することもできますが、ボタンが押されない限り、ウィンドウのフォーカスを外してはなりません。

擬似コードの例

疑似コードの例を次に示します。

Open Dialog Box
Add Button to Dialog Box at position X, Y
WHILE True:
    SET Dialog Box to CursorX - X, CursorY - Y

このチャレンジにはテストケースを提供できません

これはコードゴルフのチャレンジなので、3月14日(Pi Day)までに最短の有効な提出が勝ちます!

回答:


9

MATLAB、86 63バイト

set(warndlg,'WindowButtonM',@(s,e)movegui(get(0,'Po')-[99,20]))

このソリューションは、提供されるパーツが対象のプロパティのみに固有である限り、部分的なプロパティ名を使用するMATLABの(通常は迷惑な)機能を利用します。

このソリューションでは、ビルトインwarndlgを使用して、「OK」ボタンのある警告ダイアログを作成します。この関数はfigureWindowButtonMotionFcnコールバックを設定するために使用できるハンドルを返します(短い名前を使用'WindowButtonM')。

ウィンドウ内でカーソルが移動されるたびに評価されるコールバックは、カーソルの現在位置を取得します(ルートグラフィックスオブジェクトのPointerLocationプロパティを使用し、その短い名前を使用)。次に、のオフセットを適用した後、図の新しい位置を使用して指定して図のを更新し、カーソルがボタン上に配置されるようにします。'Po'Positionmovegui[99, 20]

ボタンが最終的にクリックされると、図が削除され、すべてのコールバックが自動的に解放されます。

enter image description here


このコードをテストするためのリンクを提供していただけますか?Matlabソフトウェアを持っていませんが、このコードはOctaveで動作しません(特定のMatlabコードとのみ互換性があるため)。ありがとう!
ハイパーニュートリノ

3
@AlexL。残念ながら、このコードの動作を示す無料のオンラインユーティリティはありません。たとえあったとしても、UIコントロールはWebインターフェースでレンダリングされません。コードが機能することを示すためにGIFを含めました。
Suever

わかった。私はテストを気にしません。お疲れ様でした、+ 1。
ハイパーニュートリノ

Windows R2014aのいくつかの問題。次の方法でダイアログボックスを停止できます。1.マウスを(ダイアログとともに)タスクバーに移動すると(タスクバーは画面の右側にあります)、ダイアログボックスはマウスの追跡を停止します。2.任意のフレームでダイアログボックスの外にマウスが来るようにマウスを十分に速く動かします。この時点で、ボックスはマウスの追従を停止します。ダイアログボックスのスタイルも明らかに他のものに依存しています...現在のコードでは、マウスは[OK]ボタンをほとんど見逃しており、動作するには99から120に変更する必要があります。とにかく、良い仕事です!
フレンジーリー

これが私の視点から見たものです。私のマウスはその赤い十字線の近くにあります。
フレンジーリー

4

C#(Windowsフォームアプリケーション)、200 114バイト

void F(){var p=Cursor.Position;MouseMove+=(r,t)=>{Controls.Add(new Button());Location=new Point(p.X-30,p.Y-40);};}

非ゴルフ

void F()
{
     Controls.Add(new Button());

     MouseMove += (r, t) =>
     {
        var p = Cursor.Position;
        Location = new Point(p.X - 30, p.Y - 40);
     };
}

古い200バイトのソリューション:

public void F(){var t=this;var b=new Button();b.Click+=delegate{t.Close();};t.Controls.Add(b);t.Show();for(;;){Application.DoEvents();t.Location=new Point(Cursor.Position.X-30,Cursor.Position.Y-40);}}

非ゴルフ

    public void F()
    {
        var t = this;
        var b = new Button();

        b.Click += delegate
        {
            t.Close();
        };

        t.Controls.Add(b);
        t.Show();

        for (;;)
        {
            Application.DoEvents();
            t.Location = new Point(Cursor.Position.X - 30, Cursor.Position.Y - 40);
        }
    }

enter image description here


1
よくやった!+1 :)
HyperNeutrino

1
待ってください... C#では、次のようにしてイベントリスナーを追加できEvent += listenerます。それは素晴らしいです:
ETHproductions

@ETHproductions は、演算子をオーバーロードした場合、おそらく C ++でもこれを実行できます+。まだ非常に簡潔です。
発癌性


1

Java 7、294 289 286 264 220バイト

import java.awt.*;public class B extends java.applet.Applet{Button b;public B(){add(b=new Button());}public void paint(Graphics g){Point p=MouseInfo.getPointerInfo().getLocation();b.setLocation(p.x-9,p.y-65);repaint();}}

MouseInfoのおかげで-22バイト(盗まれた ました)私はawtライブラリが好きではありません>。>

ここでmainメソッドを削除することで、44バイトを削減しました。これがアプレットとして起動される場合、mainメソッドは必要ありません。これは、Eclipseの「Run As Java Applet」またはセキュリティマネージャーを無効にし、JDKに付属のappletviewerを使用することで実現できます(Webブラウザーでアプレットを表示できる場合を除きます。これはChromeでは許可されません) 。

popup


素敵な仕事、+ 1!私は同意します、awtライブラリは少しいですが、ゴルファーです。
ハイパーニュートリノ

削除することで24バイトを節約できますimport java.awt.event.*;
ザバダ

@Zavada *ワイルドカードはサブパッケージを再帰的にインポートしません。私が必要とするjava.awt.eventためMouseAdapterMouseEvent
ポケ

申し訳ありませんが、私は完全な頭脳を持っています!
ザヴァダ

1

Java、172 199 235バイト

ゴルフ:

import java.awt.*;interface D{static void main(String[]z){new javax.swing.JDialog(){{setSize(9,99);setVisible(1>0);add(new Button());a();}void a(){for(Point p;;p=MouseInfo.getPointerInfo().getLocation(),setLocation(p.x-9,p.y-70));}};}}

ゴルフをしていない:

import java.awt.*;
interface D{
    static void main(String[]z){
        new javax.swing.JDialog(){
            {
                setSize(9,99);
                setVisible(1>0);
                add(new Button());
                a();
            }
            void a(){

                for(;;) {
                    Point p = MouseInfo.getPointerInfo().getLocation();
                    setLocation(p.x-9,p.y-70);
                }
            }
        };

    }
}

説明:新しいJDialogの宣言で二重中括弧の初期化を使用します。これは、JDialogの拡張子を除外することでバイトを節約しました(publicから除外するバイトを保存できますmain)。JDialogの匿名サブクラス内で、(の1>0代わりに使用してtrue)表示して呼び出しますa()。これは、ループが正常に実行された場合に初期化子にコンパイル時エラーがあるため必要です。マウスリスナーの追加に関連する余分なコードをすべて使用するのではなく、MouseInfoを使用することにしました。

編集:追加するにはカウントを27増やす必要がありました add(new java.awt.Button());。JDialogsには、技術的には暗黙のボタンがあると思っていましたが、間違っているようです。

編集2:setSizeボタンをクリック可能にするために、マウスの位置を追加およびオフセットする必要がありました。

Dialog


これはまったく機能しません。カーソルが常にウィンドウの左上隅にあるため、ボタンを押すことができません。これを修正してください!:)
HyperNeutrino

謝罪、今すぐ修正する必要があります!
ザバダ

うん。今すぐ動作します!+1
HyperNeutrino

MouseInfoがモノであることを知りませんでした。これはきちんとした答えです。
ポケ

1
@ポケありがとう。アプレットを使用してあなたの答えを見ましたが、アプレットに対する不当な憎しみを持っているので、スイングで行うのがかわいいと感じました。あなたの答えはいいです:)
ザバダ

0

変性処理のJs 102 108バイト

draw=function(){background(0);rect(mouseX,mouseY,9,9);rect(mouseX,mouseY,4,4);if(mouseIsPressed){fill(9);}};

オンラインでお試しください!リンクを更新しました!

マウスに続く長方形と、クリックすると内側にある小さな長方形が描画されるだけで、赤に変わります。動作しますが、驚くほどではありません。このバージョンは、中括弧とそのすべてに非常に厳しい場合:(


あなたは、塗りつぶしの周りに括弧を削除することができます
KritixiのLithos

@KritixiLithos私は実際にはできません:(
クリストファー

これは厳密に型指定された言語バージョンです
クリストファー

次に、別のタイプの処理を使用してバイトを保存できます
KritixiのLithos

@KritixiLithosは、実際には画面サイズを設定する必要があり、それによってバイトが追加されます。(サイドノートは、「不適切なコンテンツが理由として考えられないので、チャットから追い出されました。それはボットでもありました。chat.stackexchange.com/messages/35631789/historyなぜだった
クリストファー・

0

Clojure、525バイト

(ns d(:require[quil.core :as q][quil.middleware :as m]))(def w 500)(def h 200)(def t 30)(def n 200)(def m 100)(q/defsketch d :size[999 999]:setup(fn[](q/stroke 0 0 0)(q/text-font(q/create-font""(* t 1.3))){:x 0 :y 0}):draw(fn[{x :x y :y}](let[r q/rect f q/fill o(- x(/ w 2))p(- y (/ h 2))](q/background 99 99 99)(f 0 0 255)(r o p w h)(f 200 200 200)(r o(+ p t)w(- h t))(f 255 0 0)(r(-(+ o w)t)p t t)(f 255 255 255)(q/text"X"(- (+ o w) t)(+ p t))(r(- x(/ n 2))(- y (/ m 2))n m))):mouse-moved(fn[_ e]e):middleware[m/fun-mode])

ない正規のWindowsダイアログを作成。代わりに、偽のボタンを作成し、中央にダミーの(機能しない)ボタンを作成します。

これはコメントでOPによって許可されました。

Quilライブラリを使用します。

(ns bits.golf.following-dialog
  (:require [quil.core :as q]
            [quil.middleware :as m]))

(def width 500)
(def height 200)

(def top-bar-height 30)

(def b-width 200)
(def b-height 100)

(defn -main []
  (q/defsketch d
    :size [999 999]
    :setup (fn []
             ; Set the border color
             (q/stroke 0 0 0)

             ; Set the font size
             (q/text-font (q/create-font "" (* top-bar-height 1.3)))

             ; The initial state
             {:x 0 :y 0})

    :draw (fn [{x :x y :y}]
            (let [r q/rect ; Shortcut functions for brevity
                  f q/fill

                  ; The top-left coordinates of the window
                  window-x  (- x (/ width 2))
                  window-y (- y (/ height 2))]

              ; Wipe the previous screen
              (q/background 99 99 99)

              ; Blue top bar
              (f 0 0 255)
              (r window-x
                 window-y
                 width height)

              ; Grey window background
              (f 200 200 200)
              (r window-x
                 (+ window-y top-bar-height)
                 width (- height top-bar-height))

              ; Red top right "button"
              (f 255 0 0)
              (r (- (+ window-x width)
                    top-bar-height)
                 window-y
                 top-bar-height top-bar-height)

              ; The X
              (f 255 255 255)
              (q/text "X" (- (+ window-x width) top-bar-height)
                          (+ window-y top-bar-height))

              ; The main "button"
              (r (- x (/ b-width 2))
                 (- y (/ b-height 2))
                 b-width
                 b-height)))

    ; When the mouse is moved, set the current state to the event object, which
    ;  conveniently has :x and :y properties
    :mouse-moved (fn [_ e] e)

    ; Needed for ease of state management. May try to factor out.
    :middleware [m/fun-mode]))

Fake Dialog


あなたの担当者が1000人でとてもいいように見えるので、これを支持しないように誘惑します...これを有効なソリューションとして数えます(単に、「」を作成しない同様のソリューションを既に検証したからです実際の」ウィンドウ)、+ 1があります。:P
HyperNeutrino

@HyperNeutrinoありがとう、これはタスクにとってはひどくやり過ぎですが、1kの担当者でさえもいいです。楽しかった!たぶん、比較のためにAWTバージョンも作成します。おそらく長さの半分になります。
発がん性物質

それまで2k待つだけです!:D
HyperNeutrino

0

パグ/スリム+ CSS / SCSS / LESS /スタイラス+ ES6 Javascript(98バイト)

オンラインでお試しください!

パグ(10 UTF-8バイト)

button#a X

スタイラス(18 UTF-8バイト)

#a{position:fixed}

JS(70 UTF-8バイト)

onmousemove=e=>{with(a.style){top=e.clientY+'px';left=e.clientX+'px'}}

逆コンパイル、アンゴルフ、スニペットの説明:

document.addEventListener('mousemove', function(e) {
  // Get element with an id of "id"
  var el = document.getElementById("id");
  // Set the vertical position
  el.style.top = e.clientY + 'px';
  // Set the horizontal position
  el.style.left = e.clientX + 'px';
})
/* Get element with an id of "id" */

#id {
  /* Position it relative to the viewport*/
  position: fixed;
}
<!-- A basic HTML button with an ID of "id" -->
<button id='id'>
  X
</button>


0

Mathematica 226バイト

画面に対するマウスの位置はフロントエンドによって追跡され、マウスが移動するたびにダイアログノートブックのウィンドウの位置が移動します。非常に簡単ですが、Mathematicaの場合のように、コマンドは文字の面で非常に長くなります。[OK]をクリックすると、ダイアログが閉じます。

{s,d,w}={SetOptions,Dynamic,WindowMargins->m};With[{p=d@MousePosition["ScreenAbsolute"]},
m=d@{{p[[1]]-50,0},{0,p[[2]]-35}}];s[$FrontEndSession,FrontEndEventActions->{"MouseMoved":>s[a,w]}];a=CreateDialog[{DefaultButton[]},w];

PSテストが終了したら、これを実行してフロントエンドオプションを削除します。

SetOptions[$FrontEndSession,FrontEndEventActions->None]

screen animation


機能を証明するためにgifを追加できますか?Mathematicaをテストできません。ありがとう!
ハイパーニュートリノ

-1

Javascript(ES6)+ HTML + CSS、139バイト

HTML:

<d id=d><button>X

CSS:

d{background:red;padding:9px;position:absolute

Javascript:

onmousemove=e=>{with(d.style){top=e.clientY-20+'px';left=e.clientX-20+'px'}}

警告ダイアログを配置できないため、カスタムの超豪華なダイアログをHTMLで作成しました。javascriptは、ウィンドウオブジェクトにイベントハンドラーを登録し、位置をイベントの座標に設定します。

オンラインで試してください:https : //jsfiddle.net/1yohswje/


正当な「ウィンドウ」に似たものは何も作成しないため、これは無効であると言います。同様に、ボタンを備えたウィンドウであることを伝えることもできません。しかし、それは興味深い解決策です!
ハイパーニュートリノ

@HyperNeutrino答えを更新しました。これについてどう思いますか?
corvus_192

OK。今では私の基準に準拠しています。+1
HyperNeutrino
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.