Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Почему дочерняя форма не едет влево


Автор: transparent 21.6.2011, 16:49
Захотел я сделать как в студии VS. А именно если у Вас окошко свойств находится в состояние "автоматически скрывать" - то когда наводишь на панельку мышь - то выезжает окошко свойств (допустим это форма 2)

Так вот, решил я так же сделать..
С помощью АПИ функции SetParent сделал вторую форму дочерней по отношению к главной(первой), и при загрузки второй формы(а вызвается она наведением мыши на бутон на первой форме) - поставил включение таймера - а в таймере что то вроде этого Me.left -=1 ..

Но форма почему то вообще вниз и вправо улезает, при чем так присходит как если из главной формы установить родителя (при помощь Сетпарент), так и из второй (при загрузке второй формы - вторая форма устанавливается как дочерняя)

Почему она не двигается влево как положенно?

ПС, Если не использовать АПИ функцию то код для отправления второй формы влево - работает нормально....Но не подходит, так как нужно чтобы форма 2 не выходила за рамки первой формы, и могла заходить за края первой формы(так красивее вообщем)


Автор: diadiavova 21.6.2011, 19:43
Загрузи вот этот проект 
http://sourceforge.net/projects/dockpanelsuite/
и не парься. То, что ты хочешь сделать на самом деле не так просто реализуется.

Автор: transparent 21.6.2011, 20:04
diadiavova, И что мне дает этот проект? Верю что не просто так. Но если бы мне понять почему так окно не правильно едет, то было бы легче справиться, по крайней мере в моем направлении

Автор: diadiavova 21.6.2011, 20:11
Цитата(transparent @  21.6.2011,  21:04 Найти цитируемый пост)
 И что мне дает этот проект?

То, что не придется изобретать велосипед.
Цитата(transparent @  21.6.2011,  21:04 Найти цитируемый пост)
 Но если бы мне понять почему так окно не правильно едет, то было бы легче справиться, по крайней мере в моем направлении 

Если интересно как это устроено, возьми этот проект и посмотри код. Оупенсорс все таки.

Автор: transparent 21.6.2011, 21:29
Цитата

Оупенсорс все таки.

я скачал там тока ехешник и длл

Автор: diadiavova 21.6.2011, 21:33
Там на панели навигации есть пункт Code

Добавлено через 2 минуты и 50 секунд
А точнее скачай отсюда
http://sourceforge.net/projects/dockpanelsuite/files/DockPanel%20Suite/2.4.0/
Качай ту ссылку, в имени которой присутствует слово Source

Автор: transparent 21.6.2011, 21:38
не пойму где...Там есть только один пунктик с code и то там не одно слово

Автор: diadiavova 21.6.2011, 21:39
Ну вот по этой ссылке грузи
http://sourceforge.net/projects/dockpanelsuite/files/DockPanel%20Suite/2.4.0/DockPanel_2.4_Source.zip/download

Автор: transparent 21.6.2011, 21:40
Слушай, Дядь Вов, а почему почти все примеры в МСДН сделаны с console...Это предполагает что примеры нужно запускать как "консольное приложение" (то есть наверно не запускать , а создавать не винформс а консольное приложение"), да?

Добавлено через 3 минуты и 32 секунды
оо, спасиб, теперь есть, там тока c#?

Автор: diadiavova 21.6.2011, 21:54
Цитата(transparent @  21.6.2011,  22:40 Найти цитируемый пост)
Слушай, Дядь Вов, а почему почти все примеры в МСДН сделаны с console...

Не все. Просто для примера это удобнее: ничего лишнего и на надо объяснять что должно быть на форме.
Цитата(transparent @  21.6.2011,  22:40 Найти цитируемый пост)
то предполагает что примеры нужно запускать как "консольное приложение" (то есть наверно не запускать , а создавать не винформс а консольное приложение"), да?

Если ты хочешь скопипастить и чтоб работало, то да. Но вообще примеры даются для того, чтобы ты мог разобраться в вопросе и написать свой код: хошь в консоли, хошь в винформе, хош в впф, или как угодно еще. 
Цитата(transparent @  21.6.2011,  22:40 Найти цитируемый пост)
 там тока c#? 

Да. Можешь поискать еще, на сорсфорже или на кодплексе. Это называется интерфейс Doking. В принципе есть и другие реализации, но под винформы это лучшее, что мне попадалось.

Автор: transparent 21.6.2011, 21:58
спасибо, погляжу, а что такое впф 

Автор: diadiavova 21.6.2011, 22:00
http://msdn.microsoft.com/ru-ru/library/ms754130.aspx

Автор: transparent 21.6.2011, 22:08
спасиб, погляжу, это же не то же что и WMI? WMI  это же скрипт? а это что в 2 словах?

Автор: diadiavova 21.6.2011, 22:12
Цитата(transparent @  21.6.2011,  23:08 Найти цитируемый пост)
а это что в 2 словах? 

Замена винформам.

Автор: transparent 22.6.2011, 18:38
Коду конечно обалделдеть скока....

А в моем случае с простенькой панелькой не поможешь Дядь Вовsmile
Задача то ерунда, нужно лишь понять почему форма не едет влево при SetParent

Автор: diadiavova 22.6.2011, 18:58
Цитата(transparent @  22.6.2011,  19:38 Найти цитируемый пост)
нужно лишь понять почему форма не едет влево при SetParent 

Возможно потому, что это не предусмотрено? smile 

Автор: transparent 24.6.2011, 15:26
Код

Public Class Form2

    Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Integer, ByVal hWndNewParent As Integer) As Integer

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SetParent(Me.Handle.ToInt32, Form1.Handle.ToInt32)
        Me.Location = New Point(Form1.ClientSize.Width, Form1.ClientRectangle.Size.Height - Me.Height)

        Timer1.Interval = 30
        Timer1.Start()

        'без сетпарента
        'Me.Location = New Point(Form1.Left + Form1.Width - Me.Width, Me.Top + Form1.ClientSize.Height - Me.Height)
        ' или за границей видимости(формы1) Me.Location = New Point(Form1.Left + Form1.Width, Me.Top + Form1.ClientSize.Height - Me.Height)
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If Me.Left < Form1.Width - Me.Width Then
            sender.stop()
        End If
        Me.Left = Me.Left - 3
    End Sub

End Class



вызываю форм2 из форм1 как то так
Код

   Dim ff As New Form2
здесь я пробывал устанавливать родителя/сына в форме1, но эффект тоже
        'SetParent(Form2.Handle.ToInt32, Me.Handle.ToInt32)
        'Form2.Location = New Point(Me.ClientSize.Width - Form2.Width, Me.ClientRectangle.Size.Height - Form2.Height)
        Form2.Show(Me)

Это происходит загрузка второй формы, которая сразу же становится дочерней, и встает справого края первой формы, и должна двигаться влево, а она двигается вправо smile 

Если не использовать Сетпарент функцию то все в порядке как и должно быть...Но там мне не нравится, да и писать дополнительно нужно...ЧТобы форма вторая не была видна сначала а потом покускам начала проявляться и был эффект как в студии....
А сетпарентом этого делать ненужно, форма2 является дочерней(как если бы мы сделал мди проект), и если она за краем формы 1 - то ее правый край(формы2) не виден, в отличие если бы форма2 была не дочерней, она бы просто вставала рядом с форм1 и ехала..

Можете хотя бы потестить у себя, может чего надумаете, а?

Автор: diadiavova 24.6.2011, 15:41
transparent, можешь хотя бы объяснить зачем ты этим занимаешься? Ты ведь видел реализацию, там все не так просто, неужели тебе мало? Я могу объяснить как разместить форму внутри другого контейнера(если тебе это нужно, хотя я не уверен, что понял чего ты хочешь), только зачем тебе это?

Автор: transparent 24.6.2011, 16:14
Объясни если можешь! Буду рад.

А зачем?Ну хочу чтобы форма ехала и всего то...А при применении этой функции все сбивается нафик..И меня это бесит, вот и пытаюсь разобраться в чем дело
Я же не пытаюсь сделать как в том проекте на #, мне это хотя бы реализовать..

Автор: diadiavova 24.6.2011, 16:22
У формы есть свойство TopLevelControl (если не ошибаюсь с названием). Если  ты установишь его в Fale, то сможешь добавить в любой контейнер тем же способом, которым добавляется любой другой контрол( добавлением формы в коллекцию Controls контейнера или присвоением контейнера свойству Parent формы).

Автор: transparent 24.6.2011, 17:23
show(me)  не подойдет добавить так ?

Автор: diadiavova 24.6.2011, 17:35
Цитата(transparent @  24.6.2011,  18:23 Найти цитируемый пост)
show(me)  не подойдет добавить так ? 

Если тебя устроит результат, делай так. Зачем ты тогда спрашиваешь как сделать, если у тебя есть свое решение?

Автор: transparent 24.6.2011, 19:16
затем что такой результат не устраивает

Добавлено через 11 минут и 6 секунд
топлевел, топлевелконтрол, поюзал, нифига не выходит со вторым вообще, а с первым пропадает форма либо первая, либо вторая

Автор: diadiavova 24.6.2011, 21:27
Цитата(transparent @  24.6.2011,  20:16 Найти цитируемый пост)
 нифига не выходит со вторым вообще, а с первым пропадает

С каким вторым? С каким первым? Ты о чем вообще? smile 

Автор: transparent 24.6.2011, 22:18
способом!
Я не понял как ты хотел сделать.
Я сделал так. Form2.Toplevel = false - и форма2 пропадает при загрузке, а ToplevelControl - получает родительский элемент....

Автор: diadiavova 24.6.2011, 22:23
Сделай так же как в аттаче.

Автор: transparent 24.6.2011, 23:41
   Dim f2 As New Form2
        f2.TopLevel = False
        Me.Controls.Add(f2)
        f2.Show()

Вообще все исчезает...

Ты создаешь новую форму...А у меня она уже создана...

Автор: diadiavova 25.6.2011, 00:00
Цитата(transparent @  25.6.2011,  00:41 Найти цитируемый пост)
Ты создаешь новую форму...А у меня она уже создана... 

И что ты предлагаешь, чтобы у меня в приложении появлялась форма из твоего приложения что ли? smile
Сделай так же. Почему у меня ничего не исчезает? Запусти мой проект из папки дебаг и посмотри, там все появляется.

Автор: transparent 25.6.2011, 01:35
да запускал я..думаешь совсем чтоли дуб...если мы с тобой плохо понимаем друг друга, это еще не говорит о том что кто то из нах странный, это я думаю мягкоговоря, и ты понимаешь что ты так думаешь на меня а я на тебя...
Я дотошный, а ты не можешь сразу ответить на обычные вещи, хоть и в обученических целях.

У твоего проекта все в порядке. Но мне нужен другой результат. Если испольщзовать твой код, то моя форма пропадает, если же поменять переменные объектов(имена) то происходит практически тоже самое)

Что тут необчного? Мне нужно чтобы вторая форма отобразилась в контейнере первой, и не выходила за рамки первой, не просто по указанию, а потому что она является дочерней, со всеми истекающими отсюда(всегда поверх родильской, если задвинуть за грань первой - то дочерняя на половину пропадет(на ту половину на которую завели за край первой))....ну и т.д. А ты предложил создание новой формы и т.д. А моя форма уже создана. И  с ней это не проходит...НО имхо я могу и тормозить и не догонять, я человек, тем более дотошный, бу

Автор: diadiavova 25.6.2011, 08:59
Цитата(transparent @  25.6.2011,  02:35 Найти цитируемый пост)
думаешь совсем чтоли дуб

user posted image
Цитата(transparent @  25.6.2011,  02:35 Найти цитируемый пост)
это еще не говорит о том что кто то из нах странный

Ты однозначно странный, даже не сомневайся. Если бы не думал, что ты странный, то уже забанил бы тебя за троллинг.
Цитата(transparent @  25.6.2011,  02:35 Найти цитируемый пост)
Я дотошный, а ты не можешь сразу ответить на обычные вещи, хоть и в обученических целях.

Да я тебе сразу отвечаю и причем по нескольку раз, а ты один хрен переспрашиваешь. Возьми тему про функции, я тебе что непонятно сразу объяснил, что после Return возвращается результат, а после присвоения нет? И перечитай, какую белиберду ты после этого начал писать? Или в теме про конфиг, ну несколько раз написал, что не из папки дебаг удалил файл, так нет же опять 25 - "а помнишь, ты писал, что удалил из дебага?". Ты считаешь это нормально? Еще при живом общении можно подумать, что ты чего-то не расслышал, но здесь кто мешает перечитать, если не понял с первого раза? smile 
Цитата(transparent @  25.6.2011,  02:35 Найти цитируемый пост)
У твоего проекта все в порядке. Но мне нужен другой результат.

Я понятия не имею, какой именно результат тебе нужен. Я тебе написал, что если тебе надо разместить форму в другом контейнере, то могу описать как это сделать и там ничего не было о том, что напишу как получить тот результат, который тебе нужен.
Цитата(transparent @  25.6.2011,  02:35 Найти цитируемый пост)
Если испольщзовать твой код, то моя форма пропадает

Скорей всего она просто находится за пределами видимости, установи локейшн так чтобы она не вылазила за пределы контейнера.
Цитата(transparent @  25.6.2011,  02:35 Найти цитируемый пост)
если же поменять переменные объектов(имена) то происходит практически тоже самое)

А что по-твоему должно измениться при изменении имен? Каким образом имена должны влиять на поведение smile 
Цитата(transparent @  25.6.2011,  02:35 Найти цитируемый пост)
всегда поверх родильской, если задвинуть за грань первой - то дочерняя на половину пропадет(на ту половину на которую завели за край первой

А ты в моем примере пробовал двигать дочернюю форму?

Автор: transparent 25.6.2011, 12:28
пробовал..Хорошо получается. Попробуй создать форму (в дизайнере), а потом с ней проделать тоже самое

Автор: diadiavova 25.6.2011, 14:58
Цитата(transparent @  25.6.2011,  13:28 Найти цитируемый пост)
 Попробуй создать форму (в дизайнере), а потом с ней проделать тоже самое 

По-твоему я это пробую впервые что ли? smile Какая разница-то?

Автор: diadiavova 25.6.2011, 15:18
Вот тебе пример. Любуйся.

Автор: transparent 26.6.2011, 20:23
ну я все так же и сделал, но у меня она куда то исчезает.....МОжет и правду у нее координаты уносятся

Автор: diadiavova 26.6.2011, 20:52
Цитата(transparent @  26.6.2011,  21:23 Найти цитируемый пост)
ну я все так же и сделал, но у меня она куда то исчезает.....МОжет и правду у нее координаты уносятся 

Почему не работает у тебя я тебе расскажу когда свой хрустальный шар найду.

Автор: transparent 26.6.2011, 21:36
вообщем если вызываю этим способом из тоолстрип то формы исчезают. Сейчас на кнопку поставил, и все нормально, но на форме ричтекстбокс - и он его перекрывал, почему? То есть форма2 была под ричтекстбоксом..

Автор: diadiavova 26.6.2011, 21:43
Это зависит от порядка добавления элементов в форму: если ричтекстбокс ты добавил позже, то он будет сверху. Вообще у всех контролов(включая форму) есть методы BringToFront и SendToBack. Вызови у своей формы первый из них и она окажется сверху.

Автор: transparent 29.6.2011, 18:44
diadiavova,  А почему теперь когда я ставлю какой нить код в событие(формы2) допустим нажатия мышки по форме 2 - то код не срабатывает, ?
И как сие исправить?

Автор: diadiavova 29.6.2011, 18:49
Цитата(transparent @  29.6.2011,  19:44 Найти цитируемый пост)
А почему теперь когда я ставлю какой нить код в событие(формы2) допустим нажатия мышки по форме 2 - то код не срабатывает, ?

Потому что ты что-то делаешь неправильно
Цитата(transparent @  29.6.2011,  19:44 Найти цитируемый пост)
И как сие исправить? 

Сделать правильно.

Автор: transparent 29.6.2011, 20:02
сделал как ты и писал

Вызываю вторую форму из первой формы по клику по кнопке
Код

Dim chF As New Form2
        chF.TopLevel = False
        Me.Controls.Add(chF)
        chF.BringToFront()
        chF.Size = New Size(chF.Width, Me.ClientSize.Height - (ToolStrip1.Height + StatusStrip1.Height))
        chF.Location = (New Point(Me.ClientSize.Width, Me.ClientSize.Height - (chF.Height + ToolStrip1.Height - 3)))
        chF.Show()


Форма появилась. Все нормально. Пытаюсь сделать так: когда мышь ушла с формы2 то форма2 закрывается, да или просто месадж хотя бы отобразит

Код

Private Sub Form2_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
        Close()
    End Sub

Автор: diadiavova 29.6.2011, 22:29
Надо же: достаточно было дать телепатический ответ на твой телепатический вопрос, как ты сразу все понял.
Цитата(transparent @  29.6.2011,  21:02 Найти цитируемый пост)
Пытаюсь сделать так: когда мышь ушла с формы2 то форма2 закрывается, да или просто месадж хотя бы отобразит

В данном случае ты подписываешься на событие главной формы, той в которой написан код, да и закрываешь ты тоже ее.
Разве ты не понимаешь, что каждое событие связано с каким-то объектом? У главной формы свой набор событий, у дочерней - свой, пусть они даже одинаковые, но происходят в разное время. Тебе надо подписаться на событие дочерней формы и закрывать тоже ее, а не главную. Для этого объявлять переменную надо на уровне класса, а не внутри метода и с ключевым словом WithEvents. Тогда она будет доступна в списке объектов и студия создаст обработчик. Можно сделать и внутри метода, но с помощью оператора AddHandler (смотри в документации). И не Close, а chF.Close, если ты хочешь закрыть именно ее.

Автор: transparent 30.6.2011, 17:54
не получается...:(
Пробовал по разному...но все это больше смахивает на бред

Так я тоже пробовал chF.Close,
Цитата

и закрывать тоже ее, а не главную

Хотя бы главная закрылась smile а то ничего не происходит(но это мне не нужно)

И на уровне класса объявлял, и обработчики добавлял(не единовременно)

Мне кажется тут дело в toplevel and controls.add...или нет?
Но в любом случае я что то делаю не так...

Приводить примеры тут не буду, так как я быстро набрасывал код в проект и стирал, дабы написать следующий



Можешь привести рабочий пример, плиз

Автор: diadiavova 30.6.2011, 20:27
Вот это пишешь на уровне класса
Код

Dim WithEvents chF As New Form2

Вот это в обработчике события Load главной формы
Код

        chF.TopLevel = False
        Me.Controls.Add(chF)
        chF.BringToFront()
        chF.Size = New Size(chF.Width, Me.ClientSize.Height - (ToolStrip1.Height + StatusStrip1.Height))
        chF.Location = (New Point(Me.ClientSize.Width, Me.ClientSize.Height - _
                                                                 (chF.Height + ToolStrip1.Height - 3)))
        chF.Show()


Так выглядит обработчик
Код

Private Sub Form2_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles chF.MouseLeave
        chF.Close()
    End Sub

Почти все скопировал у тебя, малость изменив. Если не сработает, попробуй с другим событием(например Click), поскольку я не знаю наверняка, поддерживает ли форма MouseLive

Автор: diadiavova 30.6.2011, 21:44
Я попробовал это сделать сам и поначалу тоже возникла эта проблема. Потом оказалось, что дело было в том, что сама форма там была не видна. То есть она была залита другим контролом и по сути на саму форму не попадала мышь, поэтому события не происходили.

Автор: transparent 1.7.2011, 13:37
Цитата

Вот это пишешь на уровне класса

Все это я и так делалsmile

Цитата

Я попробовал это сделать сам и поначалу тоже возникла эта проблема. Потом оказалось, что дело было в том, что сама форма там была не видна. То есть она была залита другим контролом и по сути на саму форму не попадала мышь, 

Вот и у меня таже проблема...
Только вторая форма видна, и мышь на нее нажимается(по крайней мере ее можно смело таскать), а вот события нажатия не происходит

И что же ты в итоге сделал? Ты мне это на задачку оставил что ли? Может на нее нужно фокус передать , отя это не пройдет, она может иполучит фокус, да только его все равно мы не увидим
Так как же ты это дело исправил?

Автор: diadiavova 1.7.2011, 13:52
Цитата(transparent @  1.7.2011,  14:37 Найти цитируемый пост)
Только вторая форма видна, и мышь на нее нажимается(по крайней мере ее можно смело таскать), а вот события нажатия не происходит

При чем тут видна или нет? И при чем тут можно ее таскать или нет? Я же пояснил, что значит была не видна форма
Цитата(diadiavova @  30.6.2011,  22:44 Найти цитируемый пост)
 То есть она была залита другим контролом и по сути на саму форму не попадала мышь

Если у тебя на форме, например, расположена какая-нибудь панель, то мышкой ты водишь не над формой, а над этой панелью и происходят события панели, а не формы. Чониясна? События формы происходить будут только если видна клиентская часть формы, то есть та, на которой расположены контролы.

Автор: transparent 1.7.2011, 16:45
ну и как исправить ситуацию? я не могу понять

Автор: diadiavova 1.7.2011, 17:04
Цитата(transparent @  1.7.2011,  17:45 Найти цитируемый пост)
ну и как исправить ситуацию? 

Вообще-то ситуацию ты как бы и не описал. Для того, чтобы отлавливалось вышеозначенное событие, тебе придется либо очистить форму, либо отлавливать события тех элементов управления, которые на ней расположены. Вообще в винформах такая задача общего решения не имеет. Тут надо смотреть по конкретному случаю. Но общий принцип в том, что отлавливаешь события контролов, расположенных на форме. В впф все проще.

Автор: transparent 2.7.2011, 12:59
да что же это такое люди творится то а...smile
Ты можешь кодом помочь? чтобы я понял как можно сделать так:-
Вызвал я вторую форму - далее навел на нее мышь, после того как мышь увел - эта (вторая) форма исчезла(клосе, найд, не важно)..

Автор: diadiavova 2.7.2011, 13:30
Цитата(transparent @  2.7.2011,  13:59 Найти цитируемый пост)
Ты можешь кодом помочь?

Не думаю, что тебе это поможет. Я тебе проблему разжевал уже просто дальше некуда. Могу просто выложить пример, в котором будет простейший код и все будет работать, но готов биться об заклад, что ты тут же нарисуешься и начнешь жаловаться, что мой пример работает, а твой не хочет. Ты не читаешь, что я тебе пишу, а ждешь готовых решений, а когда получаешь их, просто не можешь ими воспользоваться. Я тебе объяснил причину, но что тебе еще надо я понять не могу.

Пример тебе выкладываю, поскольку он элементарен, но вообще помогать тебе, честно говоря не хочется: во-первых, ты не понимаешь ответов и еще возмущаешься, что тебе не разжевали; а во-вторых, ты уже изрядно меня утомил. Я вообще думаю, что программирование - это не твое, не стоит тебе этим заниматься.

Автор: transparent 2.7.2011, 15:10
спасибо, посмотрю
Цитата

программирование - это не твое, не стоит тебе этим заниматься.

больше я тебя не потревожу smile 

Автор: diadiavova 2.7.2011, 15:32
Цитата(transparent @  2.7.2011,  16:10 Найти цитируемый пост)
больше я тебя не потревожу

А ты меня и так не тревожишь. Вопросы задавай, тут и кроме меня есть и другие участники, которые могут ответить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)