|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
|
|
Ограничение зоны перетаскивания форм/окон21.02.2025, 12:18. Показов 7115. Ответов 60
Метки нет (Все метки)
Коллеги, добрый день.
Задача такая. Внутри MDIForm есть слева "меню" (безрамочная MDIChild форма), а на "рабочем поле" программы будут открываться разные дочерние окна, которые не должны закрывать собой меню. Нужно ограничить перемещение остальных дочерних форм влево до ширины "меню". А также запоминать их положение. Решить задачу простым методом видимо не вариант, поскольку события "Form_Move" в барсике не предусмотрено, а все остальные типа MouseDown+MouseMove, DragDrop работают только над полем формы, но не над заголовком, за который эта форма перетаскивается. По ходу пьесы, чтобы всю скатерть предполагаемого кода не дублировать во все формы в программе, было решено основную исполняемую часть поместить в модуль и сделать универсальной для всех форм, с идентификацией форм по hwnd или ещё как... Я покурил этот вопрос, нашел примеры на API. Сделал меню всегда поверх остальных (в случае работающего ограничителя это не нужно, но если не получится, то пусть остальные окошки подлазят ПОД меню.) Но поскольку в API я мало что понимаю, никак не могу адаптировать код перетаскивания под свою задачу. Оно работает, перетаскивание форм ограничивает. Но хорошо работает только с одной. Даже при наличии двойного условия If Form1.Visible = True And Form1.Left < 2000 Then формы вылазят все, достаточно только сдвинуть (видимую, одну из) форму ! Менять формам свойство Visible=false тоже бесполезно, они всё равно вылазят. Запоминание положения я потом доработаю. Переменные WL и WT сделаю массивами и координаты всех форм буду туда распределять. Сейчас задача разобраться с Function WinProc. Видимо тут засада, а у меня не хватает знаний API. Помогите пжлст ![]() Прикрепил архив проекта.
0
|
|
| 21.02.2025, 12:18 | |
|
Ответы с готовыми решениями:
60
1. Обмен данными с рабочей книгой MS Excel. 2. Проектирование форм окон Ограничение зоны на карте в 2D игре Загрузка форм и окон |
| 22.02.2025, 12:55 | ||
|
0
|
||
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
|
| 22.02.2025, 12:58 | |
|
0
|
|
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
||
| 22.02.2025, 13:10 | ||
|
0
|
||
| 22.02.2025, 13:12 | ||
|
0
|
||
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
||||
| 22.02.2025, 13:26 | ||||
|
Добавлено через 7 минут а ты пробовал вызывать .Show Добавлено через 1 минуту
0
|
||||
| 22.02.2025, 13:44 | |||
|
В словаре сохраняешь ID хука с ключем - hWnd. Но можно, конечно id каждого хука в свойстве формы хранить и не использовать словарь.
0
|
|||
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
|||
| 22.02.2025, 13:57 | |||
|
Добавлено через 4 минуты
0
|
|||
| 22.02.2025, 14:11 | ||||
|
Добавлено через 1 минуту Ну тут, учитывая небольшое количество окно использовать вместо словаря, конечно массив, тупо поиск по массиву
0
|
||||
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
|
| 22.02.2025, 14:12 | |
|
Я вообще всегда пользовался простыми массивами для списков, пока не познакомился с коллекциями
0
|
|
|
Модератор
|
||||||
| 22.02.2025, 14:13 | ||||||
Сообщение было отмечено HackerVlad как решение
Решение
1
|
||||||
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
||
| 22.02.2025, 14:48 | ||
|
Единственная сложность массивов это удалять строчки, если это не последняя и не первая строчка то довольно большой скрипт получается для удаления строк "из середины" массива...
Добавлено через 33 минуты Добавлено через 40 секунд Я даже и не знал что так можно, пробовал выставлять элементы любые на MDI форме были только ошибки и ничего не получалось...
0
|
||
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
|
||
| 22.02.2025, 15:38 [ТС] | ||
Реально откровение и для меня!)))) Спасибо, The trick. После первых тщетных попыток закинуть на MDI форму каких либо контролов типа фрейма или кнопки понял что туда вообще ничего нельзя поместить кроме дочерних форм. Сейчас как раз сидел думал как бы поженить скроллбары с панелькой. Они когда появляются улезают под панельку, а при ресайзе наоборот. И тут вдруг узнаю про чудесную штуку - в VB6 это предусмотрено прямо в стоке! И ничего не надо допиливать! ...Ну почти ничего)) И ведь она ещё и сдвигает дочерние окна, у которых стартовые координаты 0:0 вправо, чтобы не заслонять собой. + Бонусом фича пикчербокса - на фон панельки можно картинку даже поставить. Окей, перевожу панельку на пикчербокс))
0
|
||
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
|
| 22.02.2025, 16:34 | |
|
Я сначала подумал что ВАУ код The trick'а совершенный, но оказалось не так. Всё же один глюк прям сразу видно, когда распахиваешь MDI форму во весь экран то с левого края появляется граница окна, которой не должно быть. А у меня в моём коде такого глюка нет.
Добавлено через 3 минуты Это некрасиво, и это особенно будет заметно, если у пользователя жирные границы окон, как у меня в семёрке.
0
|
|
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
|
| 22.02.2025, 16:36 | |
|
Чтобы Вы понимали о чём я говорю...
0
|
|
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
||||||
| 22.02.2025, 18:12 | ||||||
|
Этот глюк лечится, скорее всего, моими магическими числами)
Добавлено через 1 минуту Там вся фишка в том, что во время разворачивания формы не надо применять код ограничения передвижения формы. Добавлено через 50 минут Да, как я и думал, этот глюк лечится моими магическими числами, поменяйте событие m_cHookChild_WndProc:
Добавлено через 26 минут testuser2, а в VBA нету коллекций? Там только словари?
1
|
||||||
|
Модератор
|
||||
| 22.02.2025, 18:18 | ||||
|
Нужно всего лишь тестировать состояние If (tWndPos.flags And SWP_NOMOVE) = 0 And IsZoomed(hwnd) = 0 Then
0
|
||||
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
|
|
| 22.02.2025, 18:20 [ТС] | |
|
Пересобрал с пикчербоксом.
Есть засада. Объясните мне как обращаться к фреймам, если даже любое упоминание имени формы в "if" сразу делает её видимой? Экспериментирую с Form1. Проблема проявляется так: если закрыть форму кнопкой "крестика", то при дальнейшей попытке ресайза материнского окна форма1 сразу же появляется. Если же скрыть форму через "Form1.visible = false" (кнопка в панели), то можно ресайзить окно как угодно без выскакивающих форм, и после если вызвать Form1, она появится в правильном месте рабочего поля. Я добавлял строку "Form1.visible = false" и в саб "Form_Unload", и в саб "OFF" - всё это бестолку, выскакивает зараза. Это ж в дальнейшем в программе сколько обращений будет к формам, они ж постоянно все выпрыгивать будут?! Это какая-то особенность MDIChild форм? Сколько ранее я делал программ где несколько форм (но обычных), с ними такой беды не замечал. Создал новый "голый" проект с MDIChild формами... обратился к свойству формы и она выскочила. ((
1
|
|
| 22.02.2025, 18:20 | |
|
Проектирование форм окон Ограничение инстансов Swing окон Ограничение разворота всех окон Ограничение раскрывания окон программ Визуальный стиль окон форм Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|