2013-09-02 4 views
0

Хорошо, поэтому многие люди задавали этот вопрос так или иначе, но, похоже, не так много ответов, кроме переданного родительского объекта при вызове ребенка. Проблема в том, что у меня нет доступа к родительскому коду.Как получить доступ к родительской форме?

Вот моя ситуация.

Некоторый код, к которому у меня нет доступа, я просто использую dll (родительскую форму), вызывает функцию в моем коде (дочерняя форма).

Моя функция выполняет вызов стороннего SDK (не так важно), которому нужна родительская форма в качестве одного из параметров. Кроме того, у меня нет доступа к стороннему коду, только через некоторые библиотеки C++.

Могла ли моя дочерняя форма знать ее родителя, или она обречена быть сиротой?

+2

Является ли 'ParentForm' собственность не работает для вас? –

+0

Или как насчет ['FindForm()'] (http://stackoverflow.com/questions/6793707)? –

+1

Что значит «родительская форма»? Если у вашей дочерней формы есть родительский элемент, родительская форма будет содержать ее, то есть дочерняя форма не может быть удалена из «Границ» в «Родительской форме». Я думаю, вы имеете в виду «форму владельца». –

ответ

2

В наиболее общий случай (так как ваша форма находится где-то в библиотеке DLL, и вы должны пройти родительскую форму в программное обеспечение 3-й партии) - WinAPI - вы можете получить родительский дескриптор окна с GetParent функции

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633510(v=vs.85).aspx

Нечто подобное:

[DllImport("user32.dll", 
      EntryPoint = "GetParent", 
      CharSet = CharSet.Auto)] 
internal static extern IntPtr GetParent(IntPtr hWnd); 

... 

IntPtr parentHandle = GetParent(myForm.Handle); // <- If you have a form 

... 

IntPtr myFormHandle = ... 
IntPtr myFormParentHandle = GetParent(myFormHandle); // <- If you have WHND only 

// If there's a .net form with myFormParentHandle Handle you can retrieve it 
// Otherwise (e.g. form is not a .net one) you get null 
Form parentForm = Control.FromHandle(myFormParentHandle) as Form; 
+0

, похоже, это может быть билет. Можно ли преобразовать этот intptr обратно в его объект? Т.е., могу ли я получить родительскую форму ? – user1934821

+1

@ user1934821 Да 'Form parent = (Form) Control.FromHandle (parentHandle)' –

1

Может быть, я что-то отсутствует, но вы можете просто использовать ContainerControl.ParentForm

var parent = myForm.ParentForm; 

Или (если вы на самом деле не имеют форму, чтобы допросить, но есть контроль, а):

var parent = myForm.Parent; 

См http://msdn.microsoft.com/en-us/library/system.windows.forms.control.parent.aspx

Затем API дескриптор Windows, для этого родителя будет:

IntPtr handle = parent.Handle; 

, который вы можете передать на свой SDK стороннего производителя.

См http://msdn.microsoft.com/en-us/library/system.windows.forms.control.handle.aspx

Если вам нужно проверить, что родитель действительно форма:

Form form = myForm.Parent as Form; 

if (form != null) 
    // Do something with form. 

Но, как люди говорили: Вы просто должны быть в состоянии использовать myForm.ParentForm

+0

Форма 'Parent' или' ParentForm' формы бесполезна, когда 'TopLevel' истинно , по умолчанию «TopLevel» является истинным. Я думаю, вы имеете в виду 'Владелец' –

+0

[Ханс Пассант рекомендует использовать _not_' ParentForm', но 'FindForm()' вместо этого) (http://stackoverflow.com/a/6794596/107625). –

+0

@SriramSakthivel OP просил родительскую форму, а не владельца, хотя? –

0

ли ваша форма появляться поверх другого? Попробуйте Form.Owner собственности.

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

+0

Да, недостаток интеграции одной старой системы с другой. :( – user1934821

0

Лучше (для вашего умственного рассудка) передать родительскую форму всю необходимую информацию в формы ребенка, поэтому вам нужно только подумать одним способом (родительская форма передает некоторую информацию ребенку, ребенок передает информацию + дополнительная информация следующему ребенку и т. д.)

Сделайте форму/класс, который зависит от других форм, называется жесткой связью и его проблемой является поддержание программного обеспечения.

+0

это не вариант, потому что у меня нет доступа к родительскому коду – user1934821

Смежные вопросы