Я хочу встроить окно браузера в свое приложение.
Для этого я использую вот такой код:
UInt32 FAppThreadID;
// Attach container app input thread to the running app input thread, so that
// the running app receives user input.
FAppThreadID = GetWindowThreadProcessId(window, new IntPtr());
AttachThreadInput(GetCurrentThreadId(), FAppThreadID, true);
// Changing parent of the running app to our provided container control
SetParent(window, container);
SendMessage(container, WM_UPDATEUISTATE, UIS_INITIALIZE, 0);
UpdateWindow(window);
// Make the running app to fill all the client area of the container
SetWindowPos(window, 0, 0, 0, 1000, 1000, SWP_NOZORDER);
SetForegroundWindow(window);
Окно браузера встраивается и функционирует, но проблема с размерами.
SetWindowPos по какой то причине не выставляет правильный размер браузерного
окна, каким бы образом я не пытался обновить его. Однако если я изменю
размер контейнера, то браузерное окно сразу же принимает правильный размер.
Подскажите, что нужно сделать чтоб правильный размер браузерного окна
применялся сразу же после встраивания?
Здравствуйте, MoreGore, Вы писали:
MG>Я хочу встроить окно браузера в свое приложение.
Какой браузер?. Если IE, то почему бы не вставить IE-контрол как обычный ActiveX.
_>Какой браузер?. Если IE, то почему бы не вставить IE-контрол как обычный ActiveX.
Mozilla. Само собой оно живет в разных процессах.
Проблема не в самом браузере, а в том что размер окна при встраивании не изменяется.
Но изменяется при ресайзе. Мне же нужно чтоб изменялся непосредственно после эмбеда.
Здравствуйте, MoreGore, Вы писали:
_>>Какой браузер?. Если IE, то почему бы не вставить IE-контрол как обычный ActiveX.
MG>Mozilla. Само собой оно живет в разных процессах.
Для мозылы тоже ActiveX есть.Mozilla ActiveX Control MG>Проблема не в самом браузере, а в том что размер окна при встраивании не изменяется. MG>Но изменяется при ресайзе. Мне же нужно чтоб изменялся непосредственно после эмбеда.
Дык сделайте резайз на пиксель непосредственно после эмбеда.
Здравствуйте, MoreGore, Вы писали:
_>>Дык сделайте резайз на пиксель непосредственно после эмбеда.
MG>Это да, но меня больше интересовал вопрос почему не срабатывает стандартный метод.
Не знаю, но я б наверное для ресайза чайлд окна использовал MoveWindow а не SetWondowPos
Здравствуйте, alexey_ma, Вы писали:
_>Здравствуйте, MoreGore, Вы писали:
_>>>Дык сделайте резайз на пиксель непосредственно после эмбеда.
MG>>Это да, но меня больше интересовал вопрос почему не срабатывает стандартный метод. _>Не знаю, но я б наверное для ресайза чайлд окна использовал MoveWindow а не SetWondowPos
А причем тут MoveWindow? Это то же самое — только менее гибкое.
А вот SWP_NOZORDER тут не может влиять?
Здравствуйте, MoreGore, Вы писали:
MG>SetWindowPos по какой то причине не выставляет правильный размер браузерного MG>окна, каким бы образом я не пытался обновить его. Однако если я изменю MG>размер контейнера, то браузерное окно сразу же принимает правильный размер.
MG>Подскажите, что нужно сделать чтоб правильный размер браузерного окна MG>применялся сразу же после встраивания?
_>>>>Дык сделайте резайз на пиксель непосредственно после эмбеда.
MG>>>Это да, но меня больше интересовал вопрос почему не срабатывает стандартный метод. _>>Не знаю, но я б наверное для ресайза чайлд окна использовал MoveWindow а не SetWondowPos C>А причем тут MoveWindow? Это то же самое — только менее гибкое.
Ну да, он ж все равно окно в Z-ордере не двигает. C>А вот SWP_NOZORDER тут не может влиять?
Думаю что нужно SWP_FRAMECHANGED.
Здравствуйте, MoreGore, Вы писали:
MG>Тут вот странное что то. MG>Я делаю вызов MoveWindow через одну миллисекунду после эмбеда, MG>и о чудо — окошко ресайзится как надо...
MG>WTF?
У меня и SetWindowPos работает. Попрбовал IE, FireFox, Opera, Chrome, все нормально ресайзятся.
Код при добавлении такой:
SetWindowLong(hWnd, GWL_EXSTYLE, pWndItem->m_dwExStyle | WS_EX_TOOLWINDOW);
ShowWindow(hWnd, SW_HIDE);
SetWindowLong(hWnd, GWL_STYLE, pWndItem->m_dwStyle & ~(WS_CAPTION|WS_POPUP));
//чтобы окно внутри не ресайзилось мышой и чем другим, можно так:
//SetWindowLong(hWnd, GWL_STYLE, pWndItem->m_dwStyle & ~(WS_CAPTION|WS_POPUP|WS_THICKFRAME));
SetWindowLong(hWnd, GWL_EXSTYLE, pWndItem->m_dwExStyle &~ (WS_EX_APPWINDOW|WS_EX_CONTROLPARENT));
SetParent(hWnd, m_hWnd);
SetWindowPos(hWnd, HWND_TOP, rtb.left, rtb.top, rtb.right-rtb.left, rtb.bottom-rtb.top, SWP_SHOWWINDOW);
Здравствуйте, alexey_ma, Вы писали:
_>Здравствуйте, Carc, Вы писали:
_>>>>>Дык сделайте резайз на пиксель непосредственно после эмбеда.
MG>>>>Это да, но меня больше интересовал вопрос почему не срабатывает стандартный метод. _>>>Не знаю, но я б наверное для ресайза чайлд окна использовал MoveWindow а не SetWondowPos C>>А причем тут MoveWindow? Это то же самое — только менее гибкое. _>Ну да, он ж все равно окно в Z-ордере не двигает.
Ну дык этот флаг имеет интересное поведение. Тут где-то в недрах Реймонда Чена выискалось, что этим флагом можно управлять в порядке обхода по Tab на диалоге, что-то вроде такого