|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
|
|
Ограничение зоны перетаскивания форм/окон21.02.2025, 12:18. Показов 6382. Ответов 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 игре Загрузка форм и окон |
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 22.02.2025, 18:30 | ||
|
The trick, ну ладно, значит bDefCall = False нужен, ты же видишь я как раз его оставил на всякий случай, ок, ты прав)
Добавлено через 58 секунд
0
|
||
| 22.02.2025, 18:38 | |||||||
|
Не по теме:
Кликните здесь для просмотра всего текста
0
|
|||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||||
| 22.02.2025, 19:05 | ||||||||
|
Добавлено через 22 минуты Не по теме:
Добавлено через 2 минуты Коллекция может всё! Коллекция может всё тоже самое, что и твои словари, плюс ещё и сортировка даже, я говорил уже об этом, но ты скептически к этому отнёсся. Но это уже я в отдельную тему вынес, если кому интересно: Как отсортировать коллекцию на VB6?
0
|
||||||||
|
Модератор
|
||
| 22.02.2025, 21:53 | ||
|
0
|
||
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
|
||||||
| 14.03.2025, 16:13 [ТС] | ||||||
|
Проблемка...
Как в цикле перебрать дочерние формы? Делаю типа:
0
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 14.03.2025, 17:55 | ||
|
Добавлено через 3 минуты MrRoxMJ, и ещё вот здесь посмотри я нашёл: http://bbs.vbstreets.ru/viewtopic.php?f=1&t=14991 может там ответ будет
0
|
||
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
|
|
| 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
Сообщений: 76
|
||
| 17.03.2025, 07:28 [ТС] | ||
|
Форма же существует. Я ж говорю, это не динамическая форма, и уже добавлена в проект на этапе создания интерфейса. То есть если напрямую по имени оно дочернюю форму полюбому видит и перемещает, а в цикле For Each qq In Forms видит только отображаемые на экране. Странно...
0
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 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
Сообщений: 76
|
||||||
| 19.03.2025, 16:04 [ТС] | ||||||
|
Во, кажись я это поборол таки))
Универсального кода, который бы работал независимо от количества форм в проекте смастерить не получилось (причины описаны выше). Решил вопрос более топорным методом. Единственный недостаток - в модуле нужно не забывать поправлять константу Z согласно количеству форм. Ну то есть на динамические формы я это точно не затачивал. Имеется "референсный" файл конфига (в нём хранятся параметры форм "по умолчанию") и пользовательский файл конфига - он перезаписывается при выходе из программы. Если этот файл отсутствует или повреждён, параметры считываются с референсного конфига. При многопользовательской работе в программе (запуск программы из расшареной сетевой папки по ярлыкам с пользовательских машин) рекомендую для этого пользовательского файла конфига поменять путь на локальную папку типа "C:\Program files", тогда настройки окон будут для каждого пользователя (рабочего места) индивидуальны. Архив проекта в аттаче. Допускаю, что код не идеален, гуру наверняка смогут ещё там причесать барсика и оптимизировать)) ----------------- У меня остался только один трабл: Когда Sizable дочка раскрывается в Maximized состояние, она закрывает собой другие окошки, которые, например, с Fixed границами (В данном примере Form2 накрывает Form1). Это капец как неудобно (для удобства тогда ещё вкладки смастерить надо..). Я попробовал сделать Form1 поверх Form2 - (закоменченые строки в коде) да, это то что нужно. В моём планируемом проекте на базе этого только одна дочерняя форма будет разворачиваться на полный экран. И только ради этой формы добавлять для всех остальных форм код чтобы были ПОВЕРХ...? Не лучшее решение. Как сделать, чтобы MDIChild форма была ВСЕГДА ВНИЗУ всех остальных форм? Гуглил интернет - там везде TOPMOST примеры. А мне наоборот надо))))))) Искал по ключевым словам "Lower most" "Most Under" ...не умею наверно искать)) Быть может в строчке
0
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 20.03.2025, 02:39 | ||
|
При клике на любое окно это окно автоматически становится окном верхнего уровня
0
|
||
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
|
|
| 27.03.2025, 08:32 [ТС] | |
|
Друзья, а вот такой ещё вопрос вдогонку.
Возникла идея - Что если использовать меню материнской формы как полосу вкладок дочерних окон? Я знаю, что если дочка имеет собственное меню, то оно заменяет меню матери. Предположим, я НЕ буду использовать в дочках их меню. Полоса меню будет только в MDI форме Есть ли некая такая команда, типа: MDIMother.Menu.Add (Form1.Name) ? То есть при открытии она добавляет в строку меню матери пункт со своим именем. А команда этого пункта меню - перевод фокуса на эту дочку.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 01.04.2025, 15:55 | |
|
MrRoxMJ, да, я думаю это возможно! разобрался с этим уже? рассказывай.
0
|
|
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
|
|
| 01.04.2025, 17:53 [ТС] | |
|
С меню не вышло.
Сделал на Toolbar (компонента из Common Controls 6 или 5). С динамическим добавлением и удалением кнопок в полосе этого бара. Позже если не забуду, прикреплю сюда то что получилось (сейчас у меня с собой нет). Выглядит.... ну такое себе. Кнопки очень ограничены в плане дизайна. С ImageList даже уже заморачиваться не стал. Выделение "вкладки текущего окна" путём enabled-disabled.Плюс надо ещё допиливать момент с обновлением состояния кнопок тулбара в случае когда пользователь переключает окна не по кнопкам, а непосредственно по окнам в клиентской области родительского окна. ...В общем я поглядел, мне это не понравилось, ...и я полностью пересобрал весь проект в VS10 на VB.NET ![]() Там конечно тоже своих недостатков хватает, но понравилось, что в MDI проекте менюха для дочерних окон идёт, что называется, "прямо из коробки". Да и как-то поприятней всё выглядит))
0
|
|
|
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
|
|
| 02.04.2025, 07:50 [ТС] | |
|
ой, а ведь и правда
![]() Жаль видимо нет возможности перебора этого windowlist (...ну у меня такое не получилось), типа: MDIMother.Mnu1.Windowlist(0) = ... Тогда можно было бы с ним сотворить всякое, например попробовать "раскидать" в строку вкладок/динамических кнопок.
0
|
|
| 02.04.2025, 07:50 | |
|
Помогаю со студенческими работами здесь
60
Проектирование форм окон Ограничение инстансов Swing окон Ограничение разворота всех окон Ограничение раскрывания окон программ Визуальный стиль окон форм Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb">
<style>
<!]>
</ style>
<g id="bush">
</ g>
</ svg>
function fn(){
let rost;/ / высота древа
let xx=165,yy=210,w=256;
|
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов,
содержащихся в реализации модуля. По-умолчанию все члены модуля доступны:
module Foo
let x = 10
let boo () = printfn "boo"
. . .
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|