Изменение размера окна WPF, являющегося дочерним по отношению к CView - PullRequest
2 голосов
/ 06 октября 2011

У меня странная проблема, и мне нужна ваша помощь. У меня есть приложение MFC MDI, и я пытаюсь создать окно WPF как дочерний элемент открытого CView.

Мне удалось это сделать, обработав сообщение OnCreate в моем CView и создав окно WPF. Я также установил CView как родительский элемент окна WPF, чтобы он вел себя как его дочерний элемент.

Вот что я сделал:

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1)
       return -1;

    m_windowWrapper.Create(this->GetSafeHwnd());

    return 0;
}

void CMyWindowWrapper::Create(HWND hParent)
{ 
   m_myWindow = gcnew MyWindow();
   m_myWindow->Show();

   IntPtr^ hChildWnd = m_myWindow->GetHwnd();
   ::SetParent((HWND)hChildWnd->ToPointer(), hParent);
}

public partial class MyWindow : Window
{
    public MyWindow()
    {
       InitializeComponent();
       MouseLeftButtonDown += (o, e) => DragMove();
    }

    public IntPtr GetHwnd()
   {
      return (new System.Windows.Interop.WindowInteropHelper(this)).Handle;
   }
}

Окно WPF появляется, как и ожидалось. Теперь проблема возникает, когда я пытаюсь изменить размер окна WPF. Внезапно элементы управления внутри окна растягиваются и перемещаются так, как если бы новый размер окна WPF соответствовал размеру родительского CView! Я попытался обработать событие SizeChanged и обнаружил, что NewSize был намного больше, чем размер окна WPF, и, скорее всего, был размером вмещающего CView.

Я попытался удалить вызов SetParent, и изменение размера сработало правильно. Интересно, что не так в изменении размера и окне WPF, чьим родителем является CView.

Я загрузил пример приложения, иллюстрирующего проблему: http://cid -a059807de2e23c43.office.live.com / self.aspx / .Public / ResizeProblem.zip

Пожалуйста, помогите мне.

Спасибо.

1 Ответ

0 голосов
/ 27 января 2012

У меня была та же проблема, когда после использования SetParent любое изменение размера или перетаскивание в моем дочернем окне приводило к огромному увеличению размера NewSize.Мое отличие состоит в том, что мое основное приложение - WPF, где я создаю и запускаю дочернее окно WPF в отдельном потоке.

Мой босс нашел эту ссылку 1 , где кто-то прокомментировал, как установить дочернее окно.Владелец родительского объекта с помощью отражения:

typeof(System.Windows.Window).InvokeMember(“_ownerHandle”, BindingFlags.Public |      BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetField, null, YOUR_CHILD_WINDOW, new object[] { YOUR_PARENT_HANDLE });

После использования этого кода и удаления моего SetParent мои проблемы исчезли, и я смог установить в качестве владельца моего дочернего окна мое главное окно WPF, работающее в отдельном потоке.

...