1

是否可以创建一个无窗口的 mfc c++ 应用程序(将在 xp 上运行),它由透明浏览器组件(默认情况下背景透明)和一个按钮(例如关闭该应用程序)组成?

4

4 回答 4

2

您可以尝试以下代码,但在选择或调整大小时仍然会出现伪影:

    private void WebCtrl_Loaded(object sender, RoutedEventArgs e)
    {
        var hRef = new HandleRef(null, WebCtrl.Handle);

        int style = GetWindowLong(hRef, GWL_EXSTYLE);
        if ((style & WS_EX_TRANSPARENT) == 0)
            SetWindowLong(hRef, GWL_EXSTYLE, style | WS_EX_TRANSPARENT);

        style = GetWindowLong(hRef, GWL_STYLE);
        if ((style & WS_CLIPCHILDREN) == 0)
            SetWindowLong(hRef, GWL_STYLE, style | WS_CLIPCHILDREN);
    }

    IntPtr WebCtrl_MessageHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == WM_ERASEBKGND)
            handled = true;
        return IntPtr.Zero;
    }
于 2012-04-13T09:23:14.337 回答
1

No. There's no problem in hosting a WebBrowser component in an MFC app, and painting just a single close button in the Non-Client area, but the WebBrowser component itself will render a background.

于 2012-04-13T08:09:06.647 回答
0

我认为您不能使用标准 WebBrowser(嵌入式 IE 引擎)来做到这一点,因为它对您的透明度要求一无所知,并且总是会绘制背景。

可以使用替代的 html 引擎,例如HTMLayout。虽然它不如互联网浏览器(没有 javascript 等),但对于 web 样式的 UI,它比 WebBrowser 好得多(更快,使用更少的内存,支持渐变,动画,高级布局)。如果您只需要带有图像、控件、链接、动画和按钮的“Web UI”,并且您正在使用 MFC、WTL 或纯 WinAPI,那么这是一个不错的选择。

于 2012-04-13T10:19:34.907 回答
0

您是否尝试过捕获窗口的背景并将其添加为浏览器组件的背景?当然,只有当您想显示您自己(/您的团队)创建的 HTML 文档时它才会起作用,但如果不是这样,整个问题将毫无意义。

我从来没有尝试过使用嵌入式浏览器这样做,但我在其他一些控件(如备忘录框)中这样做了,它确实有效。如果您选择此解决方案,您仍然应该知道,无论何时移动或调整窗口大小,您都必须重新捕获窗口的背景。

您可以使用您选择的解决方案在嵌入式浏览器中显示背景,但恕我直言,最好的选择是使用 CSS 定义的背景,它将替换为您的背景。(不要忘记伪造一个简单的javascript来刷新表单调整大小/移动的背景,以避免无意中重新加载整个文档。)

部分屏幕截图的更多信息可以在这里找到。

于 2013-07-26T09:33:19.660 回答