|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
|
|
Ограничение зоны перетаскивания форм/окон21.02.2025, 12:18. Показов 5829. Ответов 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 окон Ограничение разворота всех окон Ограничение раскрывания окон программ Визуальный стиль окон форм Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|