Hộp lỗi Windows lên cấp độ tiếp theo


15

Bạn biết những hộp Windows mà bạn chỉ có thể làm một việc?

Windows Error Box: Proceeding sẽ xóa nội dung trong ổ cứng của bạn.  Bạn muốn làm gì?  <Tiến hành> <Xóa>

Hãy đưa nó lên cấp độ tiếp theo!

Thử thách

Tạo một hộp thoại với một nút theo con trỏ của bạn ở khắp mọi nơi!

Thông số kỹ thuật

Không có đầu vào có thể được thực hiện. Có thể có đầu ra cho STDOUT hoặc STDERR. Bạn phải mở một cửa sổ bằng một nút (không cần văn bản, nhưng văn bản có thể được chứa trong tiêu đề cửa sổ, hộp thoại hoặc nút). Nút phải có thể nhấp và phải luôn theo dõi dưới con trỏ của bạn để bạn chỉ có thể nhấp vào nút đó. Khi nhấp vào, nó có thể làm bất cứ điều gì bạn muốn, nhưng vui lòng không làm cho máy tính bị sập vì tôi sẽ kiểm tra điều này ... Hộp thoại phải mở miễn là nút không được nhấn, nhưng không cần phải nhấn đóng khi nút được đóng lại.

Giả định mà bạn có thể thực hiện

  • Bạn có thể giả định rằng con trỏ sẽ ở trong khung vẽ.
  • Bạn có thể cho rằng cửa sổ sẽ nằm trong tiêu cự, nhưng bạn không được đặt cửa sổ ra khỏi tiêu cự miễn là không nhấn nút.

Mã giả ví dụ

Dưới đây là một số ví dụ mã giả:

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

Các trường hợp thử nghiệm không thể được cung cấp cho thử thách này

Đây là một thử thách chơi gôn, vì vậy bài nộp hợp lệ ngắn nhất trước ngày 14 tháng 3 (Ngày số Pi) sẽ thắng!

Câu trả lời:


9

MATLAB, 86 63 byte

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

Giải pháp này tận dụng khả năng (thường gây khó chịu) của MATLAB để sử dụng tên thuộc tính một phần miễn là phần được cung cấp là duy nhất chỉ thuộc tính quan tâm.

Giải pháp này sử dụng nội dung dựng sẵn warndlgđể tạo hộp thoại cảnh báo bằng nút "OK". Hàm này trả về một thẻ figuređiều khiển mà sau đó chúng ta có thể sử dụng để đặt WindowButtonMotionFcngọi lại (sử dụng tên ngắn 'WindowButtonM').

Cuộc gọi lại được đánh giá bất cứ khi nào con trỏ được di chuyển trong cửa sổ sẽ nhận được vị trí hiện tại của con trỏ (sử dụng thuộc PointerLocationtính của đối tượng đồ họa gốc , sử dụng tên ngắn của nó 'Po'). Sau đó, chúng tôi cập nhật Positionsố liệu bằng cách sử dụng moveguivà chỉ định vị trí mới của hình sau khi áp dụng độ lệch [99, 20]để con trỏ được đặt trên nút.

Khi nút cuối cùng được nhấp, hình sẽ bị xóa và tất cả các cuộc gọi lại sẽ tự động được giải phóng.

nhập mô tả hình ảnh ở đây


Bạn có thể vui lòng cung cấp một liên kết để kiểm tra mã này? Tôi không có phần mềm Matlab và mã này không hoạt động với Octave (vì nó chỉ tương thích với một số mã Matlab nhất định). Cảm ơn!
HyperNeutrino

3
@AlexL. Thật không may, không có tiện ích trực tuyến miễn phí để hiển thị cách mã này hoạt động. Ngay cả khi có, các điều khiển UI sẽ không được hiển thị trong giao diện web. Tôi đã bao gồm GIF để chứng minh mã làm việc.
Suever

Ổn thỏa. Tôi sẽ không bận tâm kiểm tra sau đó. Làm tốt lắm, có +1.
HyperNeutrino

Một vài vấn đề trên Windows R2014a. Bạn có thể dừng hộp thoại theo sau bằng cách: 1. Di chuyển chuột (cùng với hộp thoại) sang thanh tác vụ (thanh tác vụ của tôi nằm ở bên phải màn hình) và hộp thoại sẽ dừng theo chuột; 2. Di chuyển chuột của bạn đủ nhanh để chuột nằm ngoài hộp thoại ở bất kỳ khung nào, tại thời điểm đó, hộp sẽ dừng theo chuột. Kiểu của hộp thoại rõ ràng cũng phụ thuộc vào thứ khác ... với mã hiện tại, chuột của tôi hầu như không bỏ qua nút OK và tôi phải thay đổi 99 thành 120 để hoạt động. Dù sao, công việc tốt!
Frenzy Li

Đây là những gì tôi nhìn thấy từ quan điểm của tôi. Con chuột của tôi ở đâu đó gần cái crosshair đỏ đó.
Frenzy Li

4

C # (Ứng dụng biểu mẫu Windows), 200 114 byte

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

Không chơi gôn

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

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

Giải pháp 200 byte cũ:

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);}}

Không chơi gôn

    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);
        }
    }

nhập mô tả hình ảnh ở đây


1
Làm tốt lắm! +1 :)
HyperNeutrino

1
Đợi .... vậy trong C #, bạn có thể thêm người nghe sự kiện bằng cách thực hiện Event += listener? Thật tuyệt vời :-)
Sản phẩm điện tử

@ETHproductions có thể cũng có thể làm điều đó trong C ++ nếu bạn quá tải +toán tử. Vẫn rất cô đọng.
Carcigenicate

1

AutoHotkey, 122 115 byte

MsgBox
WinWait,%A_ScriptName%
Loop{
MouseGetPos,x,y
WinGetPos,a,b
ControlGetPos,c,d,,,Button1
WinMove,x+a-c,y+b-d
}

Bản giới thiệu


2
Đẹp và đơn giản. Làm tốt lắm! +1
HyperNeutrino

1

Java 7, 294 289 286 264 220 byte

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();}}

-22 byte nhờ MouseInfo (bị đánh cắp từ Zavada ) Tôi không thích các thư viện awt>.>

Tôi đã loại bỏ 44 byte bằng cách loại bỏ phương thức chính ở đây. Phương thức chính là không cần thiết nếu điều này được đưa ra như một applet. Điều này có thể đạt được thông qua "Run As Java Applet" của nhật thực hoặc bằng cách vô hiệu hóa trình quản lý bảo mật và sử dụng appletviewer , đi kèm với JDK (trừ khi bạn vẫn có thể xem các applet trong trình duyệt web. Tôi không nghĩ chrome cho phép điều này) .

cửa sổ bật lên


Làm tốt lắm, +1! Tôi đồng ý, các thư viện awt hơi xấu, nhưng nó golf hơn.
HyperNeutrino

Bạn có thể lưu 24 byte bằng cách xóaimport java.awt.event.*;
Zavada

@Zavada Ký *tự đại diện không nhập đệ quy các gói con. Tôi cần java.awt.eventcho MouseAdapterMouseEvent
Chọc

Xin lỗi, tôi đã có một bộ não hoàn toàn!
Zavada

1

Java, 172 199 235 byte

Chơi gôn

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));}};}}

Ung dung:

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);
                }
            }
        };

    }
}

Giải thích: Tôi sử dụng khởi tạo cú đúp trong tuyên bố của tôi về một JDialog mới. Điều này đã lưu các byte bằng cách loại trừ phần mở rộng của JDialog (cho phép tôi lưu các byte loại trừ publickhỏi main). Bên trong lớp con ẩn danh của JDialog tôi làm cho nó hiển thị (sử dụng 1>0thay vì true) và gọi a(), điều này là cần thiết bởi vì bộ khởi động có lỗi thời gian biên dịch nếu vòng lặp được đặt trong đó. Tôi đã chọn sử dụng MouseInfo thay vì tất cả các mã thừa liên quan đến việc thêm trình nghe chuột.

Chỉnh sửa: Phải tăng số lượng lên 27 để thêm add(new java.awt.Button());. Tôi nghĩ rằng JDialogs có một nút ngụ ý bởi tính kỹ thuật, nhưng tôi dường như đã sai.

Chỉnh sửa 2: Phải thêm setSizevà bù vị trí chuột để làm cho nút có thể nhấp.

Hộp thoại


Điều này không hiệu quả lắm; Tôi không thể nhấn nút vì con trỏ liên tục ở góc trên bên trái của cửa sổ. Hãy sửa lỗi này! :)
HyperNeutrino

Xin lỗi, nên sửa ngay!
Zavada

Vâng. Hoạt động ngay! +1
HyperNeutrino

Tôi không biết / nhớ MouseInfo là một điều. Đây là một câu trả lời gọn gàng.
Chọc

1
@ Xin cảm ơn. Tôi đã thấy câu trả lời của bạn bằng cách sử dụng các applet, và tôi có một sự căm ghét vô lý đối với các applet, vì vậy tôi cảm thấy nó sẽ dễ thương khi thực hiện cú swing. Câu trả lời của bạn rất hay :)
Zavada 27/2/2017

0

Xử lý sửa đổi Js 102 108 byte

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

Hãy thử trực tuyến! Chỉ cần cập nhật liên kết của tôi!

Nó chỉ vẽ một hình chữ nhật theo con chuột của bạn và một hình chữ nhật nhỏ hơn bên trong nó mà bạn nhấp vào và nó chuyển sang màu đỏ. Nó hoạt động nhưng không tuyệt vời. Phiên bản này nếu rất nghiêm ngặt về niềng răng và tất cả những điều đó :(


Bạn có thể loại bỏ các dấu ngoặc xung quanh fill
Kritixi Lithos

@KritixiLithos Tôi thực sự không thể :(
Christopher

Đây là phiên bản ngôn ngữ nghiêm ngặt
Christopher

Bạn có thể sử dụng một loại Xử lý khác để lưu byte sau đó
Kritixi Lithos

@KritixiLithos thực sự sau đó tôi cũng sẽ phải thiết lập kích thước màn hình và điều đó sẽ thêm byte. ?. (Lưu ý Side Tôi chỉ bị đuổi khỏi chat cho" nội dung không phù hợp bất kỳ ý tưởng tại sao Đó là một bot quá chat.stackexchange.com/messages/35631789/history là lý do tại sao
Christopher

0

Clojure, 525 byte

(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])

không tạo ra một hộp thoại Windows chính hãng. Thay vào đó, nó xây dựng một cái giả và tạo ra một nút giả (không hoạt động) ở giữa.

Điều này đã được OP cho phép trong các ý kiến.

Sử dụng thư viện 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]))

Hộp thoại giả


Tôi không muốn nâng cấp điều này vì đại diện của bạn là 1000 và nó trông rất tuyệt ... Tôi sẽ coi đây là một giải pháp hợp lệ (đơn giản vì tôi đã xác thực một giải pháp tương tự không tạo ra " cửa sổ thực "), vì vậy có +1. : P
HyperNeutrino

@HyperNeutrino Cảm ơn, mặc dù điều này là quá mức cần thiết cho nhiệm vụ, và một đại diện thậm chí 1k là tốt. Tôi đã rất vui vẻ với nó! Có lẽ tôi sẽ tạo một phiên bản AWT quá chỉ để so sánh. Có lẽ sẽ giống như một nửa chiều dài.
Carcigenicate

Bạn chỉ có thể chờ 2k để rồi! : D
HyperNeutrino

0

Pug / Slim + CSS / SCSS / LESS / Bút stylus + ES6 Javascript (98 byte)

Hãy thử trực tuyến!

Pug (10 UTF-8 byte)

button#a X

Bút stylus (18 UTF-8 byte)

#a{position:fixed}

JS (70 UTF-8 byte)

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

Dịch ngược, Ungolfed và giải thích Snippet:

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

Toán học 226 byte

Vị trí chuột liên quan đến màn hình được theo dõi bởi mặt trước và vị trí cửa sổ của sổ ghi chép được di chuyển bất cứ khi nào chuột di chuyển. Khá đơn giản, nhưng các lệnh rất dài về mặt chữ cái, như thường thấy với Mathicala. Nhấp vào OK sẽ đóng hộp thoại.

{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 Khi bạn hoàn tất kiểm tra, hãy chạy tùy chọn này để xóa tùy chọn giao diện người dùng.

SetOptions[$FrontEndSession,FrontEndEventActions->None]

màn hình hoạt hình


Bạn có thể thêm một gif để chứng minh chức năng? Tôi không thể kiểm tra Mathicala. Cảm ơn!
HyperNeutrino

-1

Javascript (ES6) + HTML + CSS, 139 byte

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'}}

Vì bạn không thể định vị các hộp thoại cảnh báo, tôi đã tạo hộp thoại siêu lạ mắt tùy chỉnh của mình trong HTML. Các javascript đăng ký một trình xử lý sự kiện trên đối tượng cửa sổ và đặt vị trí theo tọa độ của sự kiện.

Dùng thử trực tuyến: https://jsfiddle.net/1yohswje/


Tôi sẽ nói điều này không hợp lệ, vì nó không tạo ra bất cứ thứ gì tương tự như một "cửa sổ" hợp pháp, và cũng vậy, bạn không thể nói rằng nó có nghĩa là một cửa sổ có nút. Tuy nhiên, nó là một giải pháp thú vị!
HyperNeutrino

@HyperNeutrino Tôi đã cập nhật câu trả lời của mình. Bạn nghĩ gì về điều này?
corvus_192

Đồng ý. Điều đó tuân thủ các tiêu chuẩn của tôi bây giờ. Có +1
HyperNeutrino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.