|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
|
|
Ограничение зоны перетаскивания форм/окон21.02.2025, 12:18. Показов 6780. Ответов 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
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 22.02.2025, 12:58 | |
|
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 22.02.2025, 13:10 | ||
|
0
|
||
| 22.02.2025, 13:12 | ||
|
0
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||
| 22.02.2025, 13:26 | ||||
|
Добавлено через 7 минут а ты пробовал вызывать .Show Добавлено через 1 минуту
0
|
||||
| 22.02.2025, 13:44 | |||
|
В словаре сохраняешь ID хука с ключем - hWnd. Но можно, конечно id каждого хука в свойстве формы хранить и не использовать словарь.
0
|
|||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||
| 22.02.2025, 13:57 | |||
|
Добавлено через 4 минуты
0
|
|||
| 22.02.2025, 14:11 | ||||
|
Добавлено через 1 минуту Ну тут, учитывая небольшое количество окно использовать вместо словаря, конечно массив, тупо поиск по массиву
0
|
||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 22.02.2025, 14:12 | |
|
Я вообще всегда пользовался простыми массивами для списков, пока не познакомился с коллекциями
0
|
|
|
Модератор
|
||||||
| 22.02.2025, 14:13 | ||||||
Сообщение было отмечено HackerVlad как решение
Решение
1
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 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
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 22.02.2025, 16:34 | |
|
Я сначала подумал что ВАУ код The trick'а совершенный, но оказалось не так. Всё же один глюк прям сразу видно, когда распахиваешь MDI форму во весь экран то с левого края появляется граница окна, которой не должно быть. А у меня в моём коде такого глюка нет.
Добавлено через 3 минуты Это некрасиво, и это особенно будет заметно, если у пользователя жирные границы окон, как у меня в семёрке.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 22.02.2025, 16:36 | |
|
Чтобы Вы понимали о чём я говорю...
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||
| 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 окон Ограничение разворота всех окон Ограничение раскрывания окон программ Визуальный стиль окон форм Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|