Програмное изменение свойства MDIChild

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Програмное изменение свойства MDIChild

Сообщение Чудик » 24.12.2004 (Пт) 0:15

Есть дочерняя форма и форма MDI. Необходимо програмно перевести дочернюю форму в независемую. При простом изменении свойства MDIChild=False выскакивает ошибка. :shock: Что делать?
Век живи - век учись!
www.detal-plast.narod.ru

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 24.12.2004 (Пт) 1:03

Ничего, поменять Child на неChild в runtime не получится :arrow:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 24.12.2004 (Пт) 1:24

Может, SetWindowLong() поможет? Хотя конкретно эту задачу я с его помощью ни разу не решал - не было нужды, признаться...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 24.12.2004 (Пт) 17:36

вряд ли это вообще возможно, данный атрибут ставиться в момент создания окна через CreateWindowEx

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.12.2004 (Пт) 17:53

Угу.
.NET решает этот вопрос путём создания копии...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 25.12.2004 (Сб) 0:48

А разве нельзя в VB6 создать копию окна? Только в таком случае (для копии) выдается также ошибка на mdiChild=False.
И вообще-то не хочется верить, что этого нельзя сделать - сильно нужно ...
Ennor писал(а):Может, SetWindowLong() поможет? Хотя конкретно эту задачу я с его помощью ни разу не решал - не было нужды, признаться...

Посмотрел на функцию, но не разобрался. API у меня всегда трудности вызывают. Заранее, конечно, объявил функции и сделал так:
h = GetTopWindow(hwnd)
hh = SetWindowLong(h, a, b)
но, какие константы вместо a и b взять, чтоб mdiChild поменять не нашел...
Век живи - век учись!
www.detal-plast.narod.ru

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 25.12.2004 (Сб) 1:44

Это не так делается.

Сначала ты вытягиваешь текущие атрибуты окна через GetWindowLong(). Потом добавляешь (или убираешь - зависит от конкретной задачи) нужные битовые флаги, и устанавливаешь эту маску стилей окна через SetWindowLong(). Я себе так сбрасывал в рантайме атрибут ShowInTaskbar, правда, код не сохранился.

[edit]Мое чутье меня не обмануло:
MSDN писал(а):WS_EX_MDICHILD - Creates an MDI child window.

Единственное - винда может заартачиться менять этот атрибут. В смысле, просто будет игнорировать посланное. Тут, боюсь, придется шаманить... :)[/edit]

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Програмное изменение свойства MDIChild

Сообщение Чудик » 25.12.2004 (Сб) 19:05

В качестве эксперимента над функцией я пошел по пути, пока более понятного мне (так как я не знаю как убирать битовые стили, решил наоборот добавить - из простой формы сделать дочернюю). Правда в одной умной книжке вычитал, что при WS_EX_MDICHILD окно имеет уменьшенный заголовок и не отображается в панели задач, т.е не совсем то, что надо, зато при WS_CHILD окно является дочерним.
Написал код так:
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetTopWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Const WS_CHILD As Long = &H40000000
Private Const WS_EX_MDICHILD As Long = &H40&
Private Const GWL_STYLE As Long = -16
Private Const WS_VSCROLL As Long = &H200000

Private Sub Command1_Click()
hh& = GetWindowLong(Form2.hwnd, GWL_STYLE)
hh& = hh& Or WS_CHILD
hhh& = SetWindowLong(Form2.hwnd, GWL_STYLE, hh&)

Form2.Refresh
End Sub

Private Sub Form_Load()
Form2.Show
End Sub

WS_CHILD я заменял на WS_EX_MDICHILD - в обоих случаях никаких изменений. В то время как при WS_VSCROLL изменения имели место и полоса прокрутки появлялась, хотя для этого необходимо было сначала свернуть, а потом развернуть форму снова (это не смотря на наличие refresh).
Так что я подошел, понимаю, к тому моменту, который относиться к шаманству, но как это осуществить не знаю- не имею необходимого уровня. Нужны подсказки.
А также буду признателен, если кто-то объяснит мне как можно убирать битовые стили в API функциях.
Век живи - век учись!
www.detal-plast.narod.ru

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Програмное изменение свойства MDIChild

Сообщение tyomitch » 25.12.2004 (Сб) 19:28

Чудик писал(а):А также буду признателен, если кто-то объяснит мне как можно убирать битовые стили в API функциях.

Код: Выделить всё
SetWindowLong hWnd, GWL_STYLE, GetWindowLong (hWnd, GWL_STYLE) And Not WS_VSCROLL


Ещё, ты догадался, что для WS_EX_MDICHILD вместо GWL_STYLE надо использовать GWL_EXSTYLE? Но имхо всё равно не сработает :-(
Изображение

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 27.12.2004 (Пн) 11:34

Стиль окна поменять после создания нельзя.

VB.NET создаёт новое окно, поэтому хендл будет другим.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Програмное изменение свойства MDIChild

Сообщение Чудик » 27.12.2004 (Пн) 14:51

Да, что-то не получается ...
Обидно ... Эх!
Спасибо всем. :cheers:
Век живи - век учись!
www.detal-plast.narod.ru


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList