Как создать форму, что бы события кликов мыши проходили сквозь неё?


#1

Вот есть форма System.Window.Forms.From, и нужно, что бы изображение отображалось на экране передним планом с Top.Most, но события кликов мыши её не трогали, а действовали на нижнее окно. Как это сделать? Пересмотрел свойства System.Window.Forms.From, но ничего путного не нашёл.


#2

Сомневаюсь что это возможно… А что именно вы этим добиваетесь?


#3

А нельзя это нижнее окно на самом деле сделать верхним и прозрачным? И проблема уйдет. А так, я не слышал, чтобы та же Microsoft игралась с координатами неактивного окна.


#4

main.pas (2,4 КБ)

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


#5

Сделал с

g.DrawEllipse(new Pen(color.Green,2), new RectangleF((size.Width - n )div 2 , (size.Height - n) div 2, n, n)); //n = 40

получилось весьма неплохо. Я просто границы отрисовал,а в центре область пустая.


#6

Вы так и не объяснили чего добиваетесь. Какое то выделение курсора?


#7

При наложении окна на экран в качестве Form.TopMost верхнего окна при клике на него происходила смена фокуса. Курсор мышки всегда остаётся в центре экрана при практичном использовании, поэтому для решения проблемы я сделал FillEllipse вместо DrawEllipse уже вокруг курсора, а оставшаяся область формы, в том числе центральная, не отображается и не реагирует на события (её как бы не существует). main v 2.0.pas (2,1 КБ). Таким образом, вопрос исчерпан.

Но есть новый, уже касательно другой темы. Мне нужно считать свойства с файла для записи в класс (т.е. что бы по началу шло название свойства, а потом его значение. Очень бы хотелось, что бы можно было по названию свойства в классе парсерить файл):

///Файл свойств, примерный вид

<--------------->

radius 40

dx 0

dy 0

<---------------->

Как это сделать? И как удобнее? Может через формат .csv или .cfg?

<---------------->

radius;40;

dx;0;

dy;0; ///пример записи .csv

<---------------->


#8

Какая разница какое расширение. Расширение нужно только проводнику (тому что отображает папки как окна), чтоб знать, какой .exe запускать передавая ему в качестве первого аргумента командной строки путь к данному файлу.

В вашем случае, есть 2 варианта:

  1. Сделать всё руками. Это будет быстрее, хоть и придётся написать чуток муторного кода.
  2. Сделать через рефлекцию:
type
  t1=class
    a,b: byte;
  end;

const
  BindFlags =
    System.Reflection.BindingFlags.Static or
    System.Reflection.BindingFlags.Instance or
    System.Reflection.BindingFlags.Public or
    System.Reflection.BindingFlags.NonPublic;

begin
  var o := new t1;
  var t := typeof(t1);//o.GetType;
  
  var f1_a := t.GetField('a', BindFlags);
  var f2_b := t.GetField('b', BindFlags);
  
  f1_a.SetValue(o, byte(3));
  f2_b.SetValue(o, byte(5));
  
  writeln(o.a);
  writeln(o.b);
end.

#9

Премного вам благодарен!

image

Как организовать цикл нашёл на сайте; даже в конструкторе класса получилось реализовать считывание. Спасибо за помощь, вопрос исчерпан.


#10

Вообще, почитайте как использовать сериализаторы. Так должно быть лучше. Вот, к примеру, бинарный: