| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > WPF и Silverlight > WebBrowser: непрозрачность при прозрачном окне |
| Автор: V0fka 7.7.2014, 19:44 |
| Привет! Есть окно, в котором находится WebBrowser, который должен отображать html текст, который ему передается в виде строки. Понадобилось сделать скругленные углы у окна. Для этого помимо всего прочего сделал Background="Transparent" и AllowsTransparency="True". Окно обрело нужный вид. Но появилась беда: содержимое WebBrowser-а стало "невидимым". Искал в интернете информацию по теме, пишут, что WPF-ный веббраузер очень "деревянный" и по нормальному с ним так сделать то, что мне надо - не получится. Подскажите, пожалуйста, как можно решить эту проблему? |
| Автор: V0fka 8.7.2014, 12:52 | ||||||||
Ilya81, вот беда.
Пошарил в интернете и нашел вот это: http://wpfchromium.codeplex.com/releases/view/49484 . Но там один проект, как я понял, на С++ и когда я пробую всё решение открыть в Visual Studio, то этот проект пишется как "недоступен" и без него не запускается другой. Не могли бы вы глянуть хотя б 1 глазом туда?
Проблема в том, сам html в этом браузере не отображается. Причем, если я на html отображаю там ссылку, то при наведении курсора туда он принимает соответствующий вид. И ссылка даже на клик реагирует. Но она просто невидимая (прозрачная?) получается (как и все остальное содержимое). Я понял, что лучше показать XAML
Может я уже тут неправильно что-то делаю?
Цель: сделать не прямоугольные края. Если это можно сделать без установки прозрачности окна - я готов рассмотреть любые другие методы. Но, к сожалению, я других не нашел. |
| Автор: Ilya81 8.7.2014, 14:21 |
Какой именно? Там их несколько. А если оставить только AllowsTransparency="True", выводится? Т. е. сделать не всё окно прозрачным? Смысл DockPanel не понял, думаю, хватило б Grid. |
| Автор: V0fka 9.7.2014, 10:07 |
Cjc.AwesomiumWrapper Получается вот что: ![]() А если только Background="Transparent" тогда так: ![]() То, где выводится qqq - это веб браузер. |
| Автор: Ilya81 9.7.2014, 11:27 |
Посмотрел получше, вроде это единственный проект на C++. Компоненты для С++ установлены? Это требует какой-то модификации? И какой, если требует? |
| Автор: V0fka 9.7.2014, 13:49 | ||
Целенаправленно для С++ ничего не ставилось. Я даже не в курсе что надо ставить. Простите, не понял. Что "это" и о какой модификации речь? Тот скрин, который я приводил вторым (Background="Transparent") не устраивает тем, что там есть "темные" уголки по краям, которые не являются прозрачными. |
| Автор: Ilya81 9.7.2014, 14:36 | ||||
В Visual Studio там есть установка компонентов для C++ и много ещё каких. Т. е. нужно запустить установщик в режиме изменения установленных компонентов.
Понятно. В принципе, можно сделать два окна и следить за координатами/размерами верхнего, а нижнее без значка со скруглёнными углами чуть больших размеров. |
| Автор: V0fka 10.7.2014, 09:25 | ||||
Доустановил таким образом "Microsoft Foundation Classes для С++", но всеравно не завелось. Попробовал удалить/добавить заново конкретно этот проект - но тоже не помогло. Видно не судьба.
Был бы очень признательный если бы вы рассказали подробней или выложили бы примерчик. Кстати, Я с окном постоянно "шаманю" и там куча ещё артефактов. Плюс ко всему помимо веб браузера в окне есть ещё элементы, но для простоты примера я их тут не показывал. |
| Автор: Ilya81 10.7.2014, 11:23 | ||||||
Что-то вроде:
(надеюсь, совсем полностью не нужно).
MFC здесь и не нужен, это обёртка для chromium, в нём нет MFC. В окне Output что пишет о неоткрывшемся проекте? |
| Автор: V0fka 11.7.2014, 13:17 | ||
| Ilya81, идея вроде ясна, спасибо! Не факт, конечно, что у меня получится, но буду пробовать. По результатам отпишусь.
Привожу список ошибок (в Output то же самое пишет): ![]() Есть подозрения, что если устранить ошибку №1, то остальные пропадут. Но я не знаю что оно хочет. |
| Автор: Ilya81 11.7.2014, 14:15 | ||
Там написано. Нужно выбрать указанный пункт контекстного меню этого проекта. |
| Автор: V0fka 13.7.2014, 13:49 | ||||
Ilya81, попробовал сделать как вы выше посоветовали и что-то даже получилось
Чукча не читатель
Ну пёс с ним, в принципе. Мне кажется лучше будет сделать так, как вы предложили с окном-тенью (по крайней мере на чистом C# будет). Тем более вроде даже почти получилось |
| Автор: Ilya81 14.7.2014, 08:05 | ||||
Можно попробовать установить свойство
либо в обработчике события GotFocus вызывать метод Focus основного окна. Можно заодно внутреннюю часть дополнительного окна сделать прозрачной, чтоб, даже оказавшись на переднем плане, оно не закрывало содержимое основого окна. |
| Автор: V0fka 14.7.2014, 12:59 | ||||||||
Увы, но не работает.
Тоже не работает. Насколько я сейчас понимаю, то нужно наверное не фокусом управлять, а именно "положением" окна что-ли. Сделал в "тени" отлов события Activated и в нем у основного окна вызываю Activate(). Не знаю как насчет правильности использования такого подхода, но по крайней мере вроде бы работает
У дополнительного окна установлены свойства Background="Transparent" и AllowsTransparency="True". При этом если на него клацнуть, то оно выходит на передний план и заступает содержимое окна, которое под ним. Или вы не это имели ввиду? В любом случае, огромное спасибо вам за помощь, похоже, что задача решена! |
| Автор: Ilya81 14.7.2014, 13:52 | ||
Если не срабатывает через свойства, возможно, понадобятся прямые вызовы user32.dll. Например, функции
Здесь нужно получить координаты окна в пикселях первой функцией и во второй задать заодно подходящие значения UFlags (описание на MSDN). Для получения hWnd (дескриптор окна) можно использовать http://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper. |
| Автор: V0fka 16.7.2014, 09:15 | ||
Ilya81, на первый взгляд кажется, что этот способ сложнее чем так, как я сделал:
Но за ещё один полезный совет спасибо, я попробую поэкспериментировать как-то. Собственно, вопрос можно считать закрытым! Большое спасибо вам за помощь! |