SetWindowPos не отрабатывает
От: MoreGore  
Дата: 09.12.13 12:35
Оценка:
Я хочу встроить окно браузера в свое приложение.
Для этого я использую вот такой код:

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 по какой то причине не выставляет правильный размер браузерного
окна, каким бы образом я не пытался обновить его. Однако если я изменю
размер контейнера, то браузерное окно сразу же принимает правильный размер.

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

Спасибо.
winapi c# .net setwindowpos
Re: SetWindowPos не отрабатывает
От: alexey_ma Израиль  
Дата: 09.12.13 13:54
Оценка:
Здравствуйте, MoreGore, Вы писали:

MG>Я хочу встроить окно браузера в свое приложение.

Какой браузер?. Если IE, то почему бы не вставить IE-контрол как обычный ActiveX.
Re[2]: SetWindowPos не отрабатывает
От: MoreGore  
Дата: 09.12.13 14:08
Оценка:
_>Какой браузер?. Если IE, то почему бы не вставить IE-контрол как обычный ActiveX.

Mozilla. Само собой оно живет в разных процессах.
Проблема не в самом браузере, а в том что размер окна при встраивании не изменяется.
Но изменяется при ресайзе. Мне же нужно чтоб изменялся непосредственно после эмбеда.
Re[3]: SetWindowPos не отрабатывает
От: alexey_ma Израиль  
Дата: 09.12.13 14:42
Оценка:
Здравствуйте, MoreGore, Вы писали:

_>>Какой браузер?. Если IE, то почему бы не вставить IE-контрол как обычный ActiveX.


MG>Mozilla. Само собой оно живет в разных процессах.

Для мозылы тоже ActiveX есть.Mozilla ActiveX Control
MG>Проблема не в самом браузере, а в том что размер окна при встраивании не изменяется.
MG>Но изменяется при ресайзе. Мне же нужно чтоб изменялся непосредственно после эмбеда.
Дык сделайте резайз на пиксель непосредственно после эмбеда.
Re[4]: SetWindowPos не отрабатывает
От: MoreGore  
Дата: 09.12.13 14:46
Оценка:
_>Дык сделайте резайз на пиксель непосредственно после эмбеда.

Это да, но меня больше интересовал вопрос почему не срабатывает стандартный метод.
Re[5]: SetWindowPos не отрабатывает
От: alexey_ma Израиль  
Дата: 09.12.13 15:06
Оценка:
Здравствуйте, MoreGore, Вы писали:

_>>Дык сделайте резайз на пиксель непосредственно после эмбеда.


MG>Это да, но меня больше интересовал вопрос почему не срабатывает стандартный метод.

Не знаю, но я б наверное для ресайза чайлд окна использовал MoveWindow а не SetWondowPos
Re[6]: SetWindowPos не отрабатывает
От: Carc Россия http://www.amlpages.com/home.php
Дата: 09.12.13 15:10
Оценка:
Здравствуйте, alexey_ma, Вы писали:

_>Здравствуйте, MoreGore, Вы писали:


_>>>Дык сделайте резайз на пиксель непосредственно после эмбеда.


MG>>Это да, но меня больше интересовал вопрос почему не срабатывает стандартный метод.

_>Не знаю, но я б наверное для ресайза чайлд окна использовал MoveWindow а не SetWondowPos
А причем тут MoveWindow? Это то же самое — только менее гибкое.
А вот SWP_NOZORDER тут не может влиять?
Aml Pages Home
Re: SetWindowPos не отрабатывает
От: VladFein США  
Дата: 09.12.13 15:18
Оценка:
Здравствуйте, MoreGore, Вы писали:

MG>SetWindowPos по какой то причине не выставляет правильный размер браузерного

MG>окна, каким бы образом я не пытался обновить его. Однако если я изменю
MG>размер контейнера, то браузерное окно сразу же принимает правильный размер.

MG>Подскажите, что нужно сделать чтоб правильный размер браузерного окна

MG>применялся сразу же после встраивания?

SWP_FRAMECHANGED?
Re[2]: SetWindowPos не отрабатывает
От: MoreGore  
Дата: 09.12.13 15:20
Оценка:
Тут вот странное что то.
Я делаю вызов MoveWindow через одну миллисекунду после эмбеда,
и о чудо — окошко ресайзится как надо...

WTF?
Re[7]: SetWindowPos не отрабатывает
От: alexey_ma Израиль  
Дата: 09.12.13 15:37
Оценка:
Здравствуйте, Carc, Вы писали:


_>>>>Дык сделайте резайз на пиксель непосредственно после эмбеда.


MG>>>Это да, но меня больше интересовал вопрос почему не срабатывает стандартный метод.

_>>Не знаю, но я б наверное для ресайза чайлд окна использовал MoveWindow а не SetWondowPos
C>А причем тут MoveWindow? Это то же самое — только менее гибкое.
Ну да, он ж все равно окно в Z-ордере не двигает.
C>А вот SWP_NOZORDER тут не может влиять?
Думаю что нужно SWP_FRAMECHANGED.
Re[8]: SetWindowPos не отрабатывает
От: MoreGore  
Дата: 09.12.13 17:32
Оценка:
_>Думаю что нужно SWP_FRAMECHANGED.

SWP_FRAMECHANGED не лечит тоже.

Тут почему то пауза сыграла роль. Наверное что то с обработкой эвентов.
Re[3]: SetWindowPos не отрабатывает
От: CEMb  
Дата: 10.12.13 02:52
Оценка:
Здравствуйте, 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);


бонус для выкидывания из таскбара:
    SetWindowLong(hWnd, GWL_EXSTYLE,  pWndItem->m_dwExStyle | WS_EX_TOOLWINDOW);
    ShowWindow(hWnd, SW_HIDE);
    ShowWindow(hWnd, SW_SHOW);

не знаю почему, без этого не работает, разбираться не стал, хотя и WS_EX_TOOLWINDOW устанавливается ранее, просто hide/show не помогает

При ресайзе родителя код такой:

    SetWindowPos((*itw)->m_hWnd, 0, rtb.left, rtb.top, rtb.right-rtb.left, rtb.bottom-rtb.top, SWP_NOACTIVATE|SWP_NOZORDER);

rtb тут — рект обрабляющего табконтрола.

Btw, интересно, стоит ли допилить программу, которая будет на себя другие окна собирать в закладочки?
Re[4]: SetWindowPos не отрабатывает
От: MoreGore  
Дата: 10.12.13 12:29
Оценка:
Спасибо, попробую сегодня ваш вариант.
Re[8]: SetWindowPos не отрабатывает
От: Carc Россия http://www.amlpages.com/home.php
Дата: 12.12.13 10:27
Оценка:
Здравствуйте, alexey_ma, Вы писали:

_>Здравствуйте, Carc, Вы писали:



_>>>>>Дык сделайте резайз на пиксель непосредственно после эмбеда.


MG>>>>Это да, но меня больше интересовал вопрос почему не срабатывает стандартный метод.

_>>>Не знаю, но я б наверное для ресайза чайлд окна использовал MoveWindow а не SetWondowPos
C>>А причем тут MoveWindow? Это то же самое — только менее гибкое.
_>Ну да, он ж все равно окно в Z-ордере не двигает.
Ну дык этот флаг имеет интересное поведение. Тут где-то в недрах Реймонда Чена выискалось, что этим флагом можно управлять в порядке обхода по Tab на диалоге, что-то вроде такого
SetWindowPos(hwndНашегоОкошка, hwndПослеКогоПоTab, 0,0,0,0,SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOSIZE);

Век живи, век учись. Я такого фокуса не знал для диалогов. Может есть и еще какие-то потаенные поведения на этом флаге?
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.