2011-02-07 2 views
0

Я использую класс, полученный из HwndHost, для размещения окна Win32. Он, в свою очередь, используется в пользовательском элементе управления. Этот пользовательский элемент управления не отображается (видимость), если внутреннее окно Win32 не будет успешно создано. Тем не менее, метод BuildWindowCore, похоже, не вызывается, если окно HwndHost не отображается, поэтому у меня есть курица &.Force BuildWindowCore член производного класса HwndHost, который будет называться

Если производный класс HwndHost не отображается, существует ли другой способ получить метод BuildWindowCore?

+0

Почему вы хотите сначала создать окно Win32? Ожидаете ли вы, что процесс каким-то образом потерпит неудачу? –

+0

Короче говоря, его создание может потерпеть неудачу. В долгосрочной перспективе это связано с нашим устаревшим кодом и тем, как он функционирует. – Charles

ответ

0

Ну, месяц прошел без ответов. Похоже, я нагнал всех, включая меня.

Итак, ответ на .NET 4.0 «Нет, нет способа заставить BuildWindowCore быть вызванным до того, как среда готова к его вызову».

0

Вы можете сами создать окно Win32 и просто использовать HwndHost в качестве обертки, как в приведенном ниже примере.

ref class MyHost : HwndHost 
{ 
private: 
    HWND m_hWnd; 
public: 
    MyHost(HWND hWnd) 
    { 
     m_hWnd = hWnd; 
    } 
protected: 
    virtual HandleRef BuildWindowCore(HandleRef hwndParent) override 
    { 
    // Simply re-parent the window 
    SetParent(m_hWnd, (HWND) hwndParent.Handle.ToPointer()); 
    return HandleRef(this, (IntPtr) m_hWnd); 
    } 

    virtual void DestroyWindowCore(HandleRef hwnd) override 
    { 
    ::DestroyWindow(m_hWnd); 
    } 
}; 
+0

Это может сработать. Сегодня утром я чувствую себя младшим программистом, не думая об этом сам. Благодарю. – Charles

+0

Теперь я помню, почему я не мог этого сделать. Неуправляемое окно создает другие дочерние окна и сообщения начинают летать между ними. Мне нужно обработать некоторые из них в MyHost. Вот почему я не могу создать окно до BuildWindowCore. – Charles

+1

Хотя старый пост я хотел добавить комментарий. Когда я попробовал выше, я получаю зависание, когда я вызываю BuildWindowCore. Я подозреваю, что BuildWindowCore вызывается циклом обработки сообщений WPF, а BuildWindowCore почему-то заканчивает ожидание цикла обработки для обработки сообщения. Однако я вовсе не уверен в этом, просто хотел, чтобы люди, которые читали это, знали, что вы можете видеть то же самое – goneskiing

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