Окна ошибок Windows на следующий уровень

15

Вы знаете те окна Windows, где вы можете сделать только одну вещь?

Окно ошибок Windows: Продолжение удалит содержимое вашего жесткого диска.  Что ты хочешь делать?  <Продолжить> <Удалить>

Давайте перейдем на следующий уровень!

Вызов

Сделайте диалоговое окно с кнопкой, которая следует за вашим курсором везде!

Спекуляции

Вход не может быть принят. Может быть вывод на STDOUT или STDERR. Вы должны открыть окно одной кнопкой (текст не требуется, но текст может содержаться либо в заголовке окна, либо в диалоговом окне, либо в кнопке). Кнопка должна быть кликабельной, и она всегда должна следовать под вашим курсором, чтобы вы могли только щелкнуть по ней. После нажатия он может делать все, что угодно, но, пожалуйста, не заставляйте его разбивать компьютер, потому что я буду проверять это ... Диалоговое окно должно оставаться открытым до тех пор, пока кнопка не нажата, но это не нужно закрыть, когда кнопка закрыта.

Предположения, которые вы можете сделать

  • Вы можете предположить, что курсор останется внутри холста для рисования.
  • Вы можете предположить, что окно останется в фокусе, но вы не должны ставить окно не в фокусе, пока кнопка не нажата.

Пример псевдокода

Вот несколько примеров псевдокода:

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

Тестовые случаи не могут быть предоставлены для этой задачи

Это соревнование по коду для гольфа, поэтому выигрывает самое короткое время подачи заявок до 14 марта (день Пи)!

HyperNeutrino
источник

Ответы:

9

MATLAB, 86 63 байта

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

В этом решении используется способность MATLAB (обычно раздражающая) использовать частичные имена свойств, если предоставленная часть уникальна только для интересующего свойства.

Это решение использует встроенную warndlgфункцию для создания диалогового окна предупреждения с кнопкой «ОК». Эта функция возвращает figureдескриптор, который мы затем можем использовать для установки WindowButtonMotionFcnобратного вызова (используя короткое имя 'WindowButtonM').

Обратный вызов, который оценивается каждый раз, когда курсор перемещается в пределах окна, получает текущую позицию курсора (используя PointerLocationсвойство корневого графического объекта , используя его короткое имя 'Po'). Затем мы обновляем изображение Positionфигуры, используя moveguiи определяя новое местоположение фигуры после применения смещения, [99, 20]чтобы курсор помещался на кнопку.

Когда кнопка наконец нажата, фигура удаляется и все обратные вызовы автоматически освобождаются.

введите описание изображения здесь

Suever
источник
Не могли бы вы предоставить ссылку для проверки этого кода? У меня нет программного обеспечения Matlab, и этот код не работает с Octave (поскольку он совместим только с определенным кодом Matlab). Благодарность!
HyperNeutrino
3
@AlexL. К сожалению, нет бесплатной онлайн-утилиты, показывающей, как работает этот код. Даже если бы они были, элементы управления пользовательского интерфейса не будут отображаться в веб-интерфейсе. Я включил GIF, чтобы продемонстрировать работающий код.
17
Хорошо. Я не буду беспокоиться о тестировании тогда. Хорошая работа, есть +1.
HyperNeutrino
Пара вопросов по Windows R2014a. Вы можете остановить диалоговое окно следующим образом: 1. Переместите курсор мыши (вместе с диалоговым окном) на панель задач (моя панель задач находится на правой стороне экрана), и диалоговое окно перестанет следовать за мышью; 2. Двигайте мышь достаточно быстро, чтобы мышь находилась за пределами диалогового окна в любом кадре, после чего окно перестанет следовать за мышью. Стиль диалогового окна также, очевидно, зависит от чего-то другого ... с текущим кодом моя мышь едва не пропускает кнопку ОК, и мне нужно изменить 99 на 120, чтобы работать. Во всяком случае, хорошая работа!
Безумие Ли
Это то, что я вижу с моей точки зрения. Моя мышь где-то рядом с этим красным перекрестием.
Безумие Ли
4

C # (Windows Form Application), 200 114 байтов

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

Un-Golfed

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

Un-Golfed

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

введите описание изображения здесь

Оливер
источник
1
Молодец! +1 :)
HyperNeutrino
1
Подождите .... так что в C # вы можете добавить прослушиватель событий, выполнив Event += listener? Это
круто
@ETHproductions Возможно, это можно сделать и в C ++, если вы перегружаете +оператор. Все еще очень кратко.
Carcigenicate
1

AutoHotkey, 122 115 байт

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

демонстрация

Кодос Джонсон
источник
2
Красиво и просто. Молодец! +1
HyperNeutrino
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();}}

-22 байта благодаря MouseInfo (украдено из Zavada ) мне не нравятся библиотеки awt>.>

Я сбрил 44 байта, удалив основной метод здесь. Основной метод не нужен, если он запускается как апплет. Это может быть достигнуто с помощью eclipse «Запускается как Java-апплет» или путем отключения диспетчера безопасности и использования appletviewer , который поставляется с JDK (если вы все еще не можете просматривать апплеты в веб-браузерах. Я не думаю, что Chrome позволяет это) ,

неожиданно возникнуть

совать
источник
Отличная работа, +1! Я согласен, библиотеки AWT немного уродливы, но в них есть гольф.
HyperNeutrino
Вы можете сэкономить 24 байт, удаливimport java.awt.event.*;
Závada
@Zavada Подстановочный *знак не рекурсивно импортирует подпакеты. Мне нужно java.awt.eventдля MouseAdapterиMouseEvent
Пок
Извиняюсь, у меня был полный бред!
Завада
1

Ява, 172 199 235 байт

Golfed:

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

Ungolfed:

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и сместить местоположение мыши, чтобы сделать кнопку нажатой.

диалог

Зэвэда
источник
Это не совсем работает; Я не могу нажать кнопку, потому что курсор постоянно находится в верхнем левом углу окна. Пожалуйста, исправьте это! :)
HyperNeutrino
Извинения, должны быть исправлены сейчас!
Завада
Ага. Работает сейчас +1
HyperNeutrino
Я не знал / помню, MouseInfo была вещь. Это аккуратный ответ.
Poke
1
@ Poke Спасибо. Я видел твой ответ с помощью апплетов, и у меня беспричинная ненависть к апплетам, поэтому я чувствовал, что было бы мило делать это на качелях. Ваш ответ хорош, хотя :)
Завада
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. Вместо этого он создает поддельную и в середине создает фиктивную (неработающую) кнопку.

Это было разрешено ФП в комментариях.

Использует библиотеку 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]))

Поддельный диалог

Carcigenicate
источник
Я испытываю желание не высказывать это, потому что ваш представитель 1000, и это выглядит так здорово ... Я собираюсь посчитать это правильным решением (просто потому, что я уже проверил подобное решение, которое не создает " реальное "окно"), поэтому есть +1. : P
HyperNeutrino
@HyperNeutrino Спасибо, несмотря на то, что это грубое излишнее задание, и даже повторение в 1 тыс. Хорошо. Мне было весело с этим! Может быть, я создам версию AWT тоже только для сравнения. Вероятно, будет как половина длины.
Carcigenicate
Вы можете просто подождать 2к до! : D
HyperNeutrino
0

Мопс / Тонкий + CSS / SCSS / LESS / Stylus + 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. Нажатие ОК закроет диалог.

{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]

анимация экрана

Келли Лоудер
источник
Можете ли вы добавить GIF для подтверждения функциональности? Я не могу проверить Mathematica. Благодарность!
HyperNeutrino
-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/

corvus_192
источник
Я собираюсь сказать, что это неверно, потому что оно не создает ничего похожего на законное «окно», и, кроме того, вы не можете сказать, что это окно с кнопкой. Тем не менее, это интересное решение!
HyperNeutrino
@HyperNeutrino Я обновил свой ответ. Что ты думаешь об этом?
corvus_192
Ok. Это соответствует моим стандартам сейчас. Имейте +1
HyperNeutrino