|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
|
|
Ограничение зоны перетаскивания форм/окон21.02.2025, 12:18. Показов 5929. Ответов 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 игре Загрузка форм и окон |
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
||
| 22.02.2025, 18:30 | ||
|
The trick, ну ладно, значит bDefCall = False нужен, ты же видишь я как раз его оставил на всякий случай, ок, ты прав)
Добавлено через 58 секунд
0
|
||
| 22.02.2025, 18:38 | |||||||
|
Не по теме:
Кликните здесь для просмотра всего текста
0
|
|||||||
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
||||||||
| 22.02.2025, 19:05 | ||||||||
|
Добавлено через 22 минуты Не по теме:
Добавлено через 2 минуты Коллекция может всё! Коллекция может всё тоже самое, что и твои словари, плюс ещё и сортировка даже, я говорил уже об этом, но ты скептически к этому отнёсся. Но это уже я в отдельную тему вынес, если кому интересно: Как отсортировать коллекцию на VB6?
0
|
||||||||
|
Модератор
|
||
| 22.02.2025, 21:53 | ||
|
0
|
||
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
|
||||||
| 14.03.2025, 16:13 [ТС] | ||||||
|
Проблемка...
Как в цикле перебрать дочерние формы? Делаю типа:
0
|
||||||
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
||
| 14.03.2025, 17:55 | ||
|
Добавлено через 3 минуты MrRoxMJ, и ещё вот здесь посмотри я нашёл: http://bbs.vbstreets.ru/viewtopic.php?f=1&t=14991 может там ответ будет
0
|
||
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
|
|
| 14.03.2025, 18:43 [ТС] | |
|
хм) поэкспериментировал с вариантами кода...
For Each qq In Forms и For i = 0 To VB.Forms.Count-1 оказывается оба рабочие, но выяснилось, что подсчитывают только видимые на экране дочки. ![]() А у меня то материнская форма запускается пустая и дочки (в данном примере их две, скрыты и вызываются кнопками, так то их будет больше),не вызывать же их всех на экран для пересчёта. Возможно ли как-то обратиться к структуре проекта типа: For Each qq In Project1.Forms , ведь дочки не динамические и по факту уже добавлены в проект. Это нужно лишь для одного: В сабе загрузки материнской формы считывается файл config.txt, в котором каждая строчка - это ИмяФормы,Left,Top,Width,Height. Далее в цикле перебираются все формы и им назначаются "стартовые параметры". А сабе закрытия материнской формы - обратный процесс: перебираются все формы и перезаписывается файл (возможно пользователь двигал окошки, и их параметры изменились). Таким образом при последующем запуске программа запоминает последние позиции и состояния окошек. Можно конечно данные с конфига погрузить в массив и уже в процессе присваивать конкретной форме параметры в момент её вызова на экран... (таким образом мы заменяем процесс перебора форм перебором массива, сравнивая имя текущей формы с записями массива). Но проще было бы конечно подготовить все окошки сразу в момент запуска программы, чем перебирать массив каждый раз при открытии любой формы.
0
|
|
|
Модератор
|
||
| 14.03.2025, 21:14 | ||
|
0
|
||
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
|
||
| 17.03.2025, 07:28 [ТС] | ||
|
Форма же существует. Я ж говорю, это не динамическая форма, и уже добавлена в проект на этапе создания интерфейса. То есть если напрямую по имени оно дочернюю форму полюбому видит и перемещает, а в цикле For Each qq In Forms видит только отображаемые на экране. Странно...
0
|
||
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 17.03.2025, 11:31 | |
|
0
|
|
| 17.03.2025, 14:31 | |||||||
0
|
|||||||
|
Модератор
|
||||
| 17.03.2025, 16:55 | ||||
|
Добавлено через 3 минуты Public Form1 As New Form1 и др. Ты можешь без загрузки формы создать Property у формы и обращаться к нему без загрузки самого окна.
1
|
||||
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
|
||||||
| 19.03.2025, 16:04 [ТС] | ||||||
|
Во, кажись я это поборол таки))
Универсального кода, который бы работал независимо от количества форм в проекте смастерить не получилось (причины описаны выше). Решил вопрос более топорным методом. Единственный недостаток - в модуле нужно не забывать поправлять константу Z согласно количеству форм. Ну то есть на динамические формы я это точно не затачивал. Имеется "референсный" файл конфига (в нём хранятся параметры форм "по умолчанию") и пользовательский файл конфига - он перезаписывается при выходе из программы. Если этот файл отсутствует или повреждён, параметры считываются с референсного конфига. При многопользовательской работе в программе (запуск программы из расшареной сетевой папки по ярлыкам с пользовательских машин) рекомендую для этого пользовательского файла конфига поменять путь на локальную папку типа "C:\Program files", тогда настройки окон будут для каждого пользователя (рабочего места) индивидуальны. Архив проекта в аттаче. Допускаю, что код не идеален, гуру наверняка смогут ещё там причесать барсика и оптимизировать)) ----------------- У меня остался только один трабл: Когда Sizable дочка раскрывается в Maximized состояние, она закрывает собой другие окошки, которые, например, с Fixed границами (В данном примере Form2 накрывает Form1). Это капец как неудобно (для удобства тогда ещё вкладки смастерить надо..). Я попробовал сделать Form1 поверх Form2 - (закоменченые строки в коде) да, это то что нужно. В моём планируемом проекте на базе этого только одна дочерняя форма будет разворачиваться на полный экран. И только ради этой формы добавлять для всех остальных форм код чтобы были ПОВЕРХ...? Не лучшее решение. Как сделать, чтобы MDIChild форма была ВСЕГДА ВНИЗУ всех остальных форм? Гуглил интернет - там везде TOPMOST примеры. А мне наоборот надо))))))) Искал по ключевым словам "Lower most" "Most Under" ...не умею наверно искать)) Быть может в строчке
0
|
||||||
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
||
| 20.03.2025, 02:39 | ||
|
При клике на любое окно это окно автоматически становится окном верхнего уровня
0
|
||
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
|
|
| 27.03.2025, 08:32 [ТС] | |
|
Друзья, а вот такой ещё вопрос вдогонку.
Возникла идея - Что если использовать меню материнской формы как полосу вкладок дочерних окон? Я знаю, что если дочка имеет собственное меню, то оно заменяет меню матери. Предположим, я НЕ буду использовать в дочках их меню. Полоса меню будет только в MDI форме Есть ли некая такая команда, типа: MDIMother.Menu.Add (Form1.Name) ? То есть при открытии она добавляет в строку меню матери пункт со своим именем. А команда этого пункта меню - перевод фокуса на эту дочку.
0
|
|
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 01.04.2025, 15:55 | |
|
MrRoxMJ, да, я думаю это возможно! разобрался с этим уже? рассказывай.
0
|
|
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
|
|
| 01.04.2025, 17:53 [ТС] | |
|
С меню не вышло.
Сделал на Toolbar (компонента из Common Controls 6 или 5). С динамическим добавлением и удалением кнопок в полосе этого бара. Позже если не забуду, прикреплю сюда то что получилось (сейчас у меня с собой нет). Выглядит.... ну такое себе. Кнопки очень ограничены в плане дизайна. С ImageList даже уже заморачиваться не стал. Выделение "вкладки текущего окна" путём enabled-disabled.Плюс надо ещё допиливать момент с обновлением состояния кнопок тулбара в случае когда пользователь переключает окна не по кнопкам, а непосредственно по окнам в клиентской области родительского окна. ...В общем я поглядел, мне это не понравилось, ...и я полностью пересобрал весь проект в VS10 на VB.NET ![]() Там конечно тоже своих недостатков хватает, но понравилось, что в MDI проекте менюха для дочерних окон идёт, что называется, "прямо из коробки". Да и как-то поприятней всё выглядит))
0
|
|
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
|
|
| 02.04.2025, 07:50 [ТС] | |
|
ой, а ведь и правда
![]() Жаль видимо нет возможности перебора этого windowlist (...ну у меня такое не получилось), типа: MDIMother.Mnu1.Windowlist(0) = ... Тогда можно было бы с ним сотворить всякое, например попробовать "раскидать" в строку вкладок/динамических кнопок.
0
|
|
| 02.04.2025, 07:50 | |
|
Помогаю со студенческими работами здесь
60
Проектирование форм окон Ограничение инстансов Swing окон Ограничение разворота всех окон Ограничение раскрывания окон программ Визуальный стиль окон форм Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|