Как я могу создать окно со стрелкой, указывающей на другое окно?

#c# #winforms #user-interface

#c# #winforms #пользовательский интерфейс

Вопрос:

Я хотел бы иметь возможность спроектировать что-то похожее на то, что вы видите, когда получаете исключение в Visual Studio, своего рода окно с линией, соединяющей окно с точкой в окне кода. Я включил изображение этого ниже:

Пример

Я замечаю, что всякий раз, когда окно кода теряет фокус, окно исключения исчезает. Однако, когда я сфокусирован, я могу перемещать окно, и стрелка продолжает указывать на цель.

Как это делается? В частности, как я могу провести линию из одного окна в другое?

Я пишу на C # и использую Windows Forms.

Ответ №1:

В вашем примере окно с исключением не всегда исчезает, если текстовое поле теряет фокус!

Проведя небольшое исследование с помощью инструмента Spy (поместите курсор find window точно на строку), вы заметите, что строка, которую вы видите между желтым текстом и окном исключения, содержится в окне (с прозрачным фоном) (с классом window типа «WindowsForms10.Window.8.app.0.34f5582_r41_ad1» в VS 2010). Это окно также имеет стиль WS_POPUP и является точной ограничивающей рамкой линии (его размер и положение точно соответствуют линии).

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

Комментарии:

1. Это имеет наибольший смысл с точки зрения Windows API. Кроме того, отличный метод расследования!

Ответ №2:

Я не знаю точно, как это делается, но вы можете сделать что-то подобное с этой идеей.

  1. Создайте новую форму
  2. Переопределите событие рисования, чтобы оно не отображалось
  3. проведите линию из одного угла в другой (это может варьироваться в зависимости от направления линии
  4. Измените размер и расположите форму так, чтобы линия проходила между вашими двумя точками.
  5. Пока не уверен в части фокусировки!

Комментарии:

1. По сути, это то же самое, что и решение Андрея. Фокусировка — не такая уж большая проблема, но я кое-что заметил и решил, что должен упомянуть об этом.

2. @черт возьми — должно быть, он печатал быстрее меня

3. 🙂 да, я должен признать, что единственное, для чего я использую spy , — это получить дескриптор окна рабочего стола, чтобы я мог запускать заставки на рабочем столе : p