Коробки помилок 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 березня (День Пі) виграє!

Відповіді:


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]так, щоб курсор розміщувався на кнопці.

Коли кнопка остаточно натиснута, цифра видаляється і всі зворотні дзвінки автоматично відпускаються.

enter image description here


Чи можете ви надати посилання для тестування цього коду? У мене немає програмного забезпечення Matlab, і цей код не працює з Octave (оскільки він сумісний лише з певним кодом Matlab). Спасибі!
HyperNeutrino

3
@AlexL. На жаль, не існує безкоштовної онлайн-утиліти для показу того, як працює цей код. Навіть якби вони були, елементи управління інтерфейсом не збираються відображатись у веб-інтерфейсі. Я включив GIF, щоб продемонструвати працюючий код.
Suever

Добре. Я не буду турбувати тестування тоді. Гарна робота, мати +1.
HyperNeutrino

Кілька питань про Windows R2014a. Ви можете зупинити діалогове вікно: 1. Перемістивши мишу (разом із діалоговим вікном) на панель завдань (моя панель завдань знаходиться в правій частині екрана), і діалогове вікно перестане слідувати за мишкою; 2. Перемістіть мишу досить швидко, щоб миша опинилася поза діалоговим вікном у будь-якому кадрі, і в цей момент вікно перестане слідувати за мишкою. Стиль діалогового вікна також, очевидно, залежить від чогось іншого ... при поточному коді миша ледь не пропускає кнопку ОК, і мені потрібно змінити 99 на 120, щоб працювати. У всякому разі, хорошої роботи!
Frenzy Li

Це я бачу з моєї точки зору. Моя миша десь біля того червоного перехрестя.
Шалений Лі

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 ++, якщо ви перевантажили +оператора. Ще дуже лаконічний.
Carcigenicate


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 (вкрадено із Завади ) Мені не подобаються бібліотеки awt>.>

Я поголив 44 байти, видаливши тут основний метод. Основний метод не потрібен, якщо його запускати як аплет. Цього можна досягти за допомогою програми "Запустити як аплет Java" або за допомогою відключення диспетчера безпеки та використання appletviewer , який постачається разом із JDK (якщо ви все ще не можете переглядати аплети у веб-браузерах. Я не думаю, що хром дозволяє це) .

вискочити


Приємна робота, +1! Я згоден, бібліотеки awt трохи некрасиві, але це гольфіст.
HyperNeutrino

Ви можете зберегти 24 байти, видалившиimport java.awt.event.*;
Завада

@Zavada Підстановочний *код не рекурсивно імпортує підпакети. Мені потрібно java.awt.eventдля MouseAdapterіMouseEvent
Poke

Вибачте, у мене була загальна мозкова думка!
Завада

1

Ява, 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та змістити розташування миші, щоб зробити кнопку натиснутою.

Діалог


Це не зовсім працює; Я не можу натиснути кнопку, оскільки курсор постійно знаходиться в лівому верхньому куті вікна. Виправте це! :)
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. Натомість він створює підроблений і створює манекен (не функціонуючу) кнопку посередині.

Це дозволив ОП у коментарях.

Використовує бібліотеку 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]))

Підроблений діалог


Я спокушаюсь не підтверджувати це, тому що ваш представник - 1000, і це виглядає так приємно ... Я буду вважати це правильним рішенням (просто тому, що я вже підтвердив подібне рішення, яке не створює " справжнє "вікно), тому майте +1. : P
HyperNeutrino

@HyperNeutrino Спасибі, хоч це і є великим надмірним завданням, і рівний 1 кп приємний. Мені це було весело! Можливо, я створять AWT-версію занадто просто для порівняння. Мабуть, буде приблизно на половину довжини.
Carcigenicate

Ви можете просто зачекати 2 к до того часу! : D
HyperNeutrino

0

Мопс / Тонкий + CSS / SCSS / МЕНШЕ / 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'}}

Декомпілював, Ungolfed і пояснив фрагмент:

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

Математика 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/


Я збираюся сказати, що це недійсне, оскільки воно не створює нічого подібного до законного "вікна", а також ви не можете сказати, що це призначено для вікна з кнопкою. Однак це цікаве рішення!
HyperNeutrino

@HyperNeutrino Я оновив свою відповідь. Що ти думаєш про це?
corvus_192

Добре. Це відповідає моїм стандартам зараз. Майте +1
HyperNeutrino
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.