Окна поверх всех и перемещения окна не за заголовок.

Внезапно узнал что такие простые вещи вызывают сложности. Решил показать как это делать. В этом нет ничего сложного. Метод универсальный и его можно повторить на любом языке. У меня под рукой Delphi и С#. Потому покажу на примере этих языков. Как вы сможете убедится - код абсолютно одинаковый.
Начнем с того как сделать так, что бы ваша программа была "поверх всех". Делается это очень просто и не требует ни какого программирования. В свойствах формы нужно задать нужной свойство.
В Delphi это FormStyle = fsStayOnTop, а в C# соответсвенно TopMost = True. Это все. Теперь ваша программа будет поверх всех других. при этом не потребовалось вообще программировать. Да, это можно сделать и программно. Скажу больше - можно так же на чистом WinAPI создать окно и задавать параметры окна. Можно сделать через стили (SetWindowLong например).
Теперь как двигать окно не за заголовок, а за само окно. Это тоже очень простая задача, хотя и требует программирования.
Для начала покажу "продвинутый" но не очень правильный метод. Продвинутый он потому что требует глубокого понимания WinAPI (конечно если вы не просто копируете код, а пробуете понять что же он делает). Не углубляясь в подробности, скажу что данный код просто "обманывает" ОС. В момент нажатия кнопки мыши, мы делаем "захват" мыши и сообщаем ОС что мышка в данный момент на заголовке. Так же оговорюсь, что не смотря на краткость и красивость этого кода, он может давать сбой при некоторых условиях. По этой причине лучше использовать другой, универсальный способ.
Универсальный способ потребует большего программирования. Вам нужно объявить 3 переменные. Флаг - нажата ли в данным момент кнопка мыши и 2 переменные для координат - в каком месте нажата кнопка. Далее нужно создать 3 обработчика события формы: нажатие кнопки мыши, перемещение мыши и отпускание кнопки мыши.
При нажатии копки, мы устанавливаем флаг - кнопка нажата.
При перемещении мыши, проверяем - если флаг нажатия установлен, тогда перемещаем форму с поправкой координат.
При отпускании копки - снимаем флаг нажатия.
Вот собственно и все. Код не учитывает разницу между левой и правой кнопкой, потому перетаскивание будет работать для обоих кнопок.

Окна поверх всех и перемещения окна не за заголовок. - 858048446439
Окна поверх всех и перемещения окна не за заголовок. - 858048548327
Окна поверх всех и перемещения окна не за заголовок. - 858048717543
Окна поверх всех и перемещения окна не за заголовок. - 858048724967
Окна поверх всех и перемещения окна не за заголовок. - 858048728295

Комментарии

  • 30 июл 2017 17:06
    В предыдущие 15 лет меня этому не учили. Поэтому я знаю это только сейчас. А вообще подобные действия рассматриваются в учебнике по Visual C++ 6.0.
  • 30 июл 2017 17:11
    А вам не кажется, что владелец сайта и рекламодатель ведут себя по-свински, считая пользователя быдлом? Единственная польза от которого - напичкать его рекламой на том сайте, который он смотрит? И вам не кажется странным, что реклама думает, что самая главная на сайте - это она? И даже главнее пользователя?
    Меня как человека думающего это возмущает. Я хочу думать об информации, а не о том, что мне там впихивают насильно. Сайтовладелец и рекламодатель это игнорят.
  • 30 июл 2017 17:13
    Например, я переводчик. Перевожу статьи музыкального развлекательного сайта "Vocaloid News Network":
    http://www.vocaloidnews.net/ru/открыт-конкурс-дизайна-2018-racing-miku/
  • 30 июл 2017 17:15
    И вот я открываю сайт переводчика "Мультитран":
    https://www.multitran.ru/
    И тут меня атакует реклама - слева, справа, сверху! И я, чтобы начать соображать - а какое слово мне выбрать - обязан ознакомиться с рекламой. Хотя не хотел! И придётся мне, как и 20 лет назад, пользоваться бумажным словарём... Но ни для кого не секрет, что информация в словарях не обновляется 20 лет.
  • 30 июл 2017 18:35
    Потому что много  чего 15 лет назад не было.  Именно по этой причине я и говорю  - не стоит изучать старые технологии. Учите новые.
  • 30 июл 2017 18:39
    Меня реклама не напрягает. Я ее просто не замечаю. Привык вычленять нужное.
    А что вам собственно мешает использовать блокировщик рекламы такой как AdBlock? Вообще то уже все давно придумано :-)
  • 30 июл 2017 18:42
    Вы используйте нормальный переводчик, например google. Там вообще нет рекламы. Там собственно вообще ничего нет https://translate.google.ru/
  • 30 июл 2017 20:08
    Разговор этот бесконечный. Закругляемся.
  • 30 июл 2017 20:33
    Ну почему же бесконечный. :-) Я вам просто совет даю. Очень странно что вы не знаете о таком популярном переводчике как google. Между тем он многое умеет. например сам определяет язык. Может переводить сайт нажатием одной кнопки. Проговаривать голосом.
    А например Skype может переводить голос "на лету". Вы говорите по русски, а собеседник слышит английскую речь.
    Про блокировщики рекламы вы меня тоже честно говоря удивили. Они появились как только появилась реклама в интернете.
    Не бойтесь менять привычки. :-)