C++ Windows-我可以将窗口类的输出重定向到位图吗?

C++ Windows-我可以将窗口类的输出重定向到位图吗?,c++,windows,C++,Windows,好的,首先是一点背景知识 我有一个windows应用程序,它使用第三方DLL 应用程序有一个GUI,由“滚动自己的”控件组成,而不是Windows自己的控件,因此从Windows的角度来看,它只是一个位图(应用程序在该位图中绘制自己的控件,处理鼠标映射到这些控件等) DLL也有一个GUI(以与之类似的方式形成,但我认为在本例中是学术性的),它将GUI写入一个窗口,并传递给它 我需要那个图形用户界面出现在我的图形用户界面中 到目前为止,我已经实现了一些可以接受的东西,只要将我给DLL的窗口作为我的

好的,首先是一点背景知识

我有一个windows应用程序,它使用第三方DLL

应用程序有一个GUI,由“滚动自己的”控件组成,而不是Windows自己的控件,因此从Windows的角度来看,它只是一个位图(应用程序在该位图中绘制自己的控件,处理鼠标映射到这些控件等)

DLL也有一个GUI(以与之类似的方式形成,但我认为在本例中是学术性的),它将GUI写入一个窗口,并传递给它

我需要那个图形用户界面出现在我的图形用户界面中

到目前为止,我已经实现了一些可以接受的东西,只要将我给DLL的窗口作为我的应用程序窗口的客户端,我将其放置在正确的位置,DLL就会直接写入屏幕

就目前而言,这种方法效果很好。DLL的GUI显示它应该显示的位置,并对鼠标输入做出应有的反应

然而,在这种情况下,我显然不能做一些事情,例如,我不能将我自己的一个GUI元素与DLL的GUI重叠(因为DLL的窗口位于应用程序的单个窗口前面),也不能(就我所知)缩放DLL的GUI(我的GUI的其余部分可以放大或缩小)

因此,将DLL绘制成位图似乎更可取,我的应用程序可以像处理其他位图一样处理位图。所以我想知道这是否可能

根据论坛指南,我恐怕看不到提供独立工作的代码的方法,尤其是因为它依赖于第三方DLL。但是当前的功能至少可以用下面的代码片段来描述

HWND createWindow(HINSTANCE hInstance, HWND parent_hwnd, int x, int y, int width, int height)
{
    WNDCLASS wincl;

    if (!GetClassInfo(GetInstance(), L"MyWindowClass", &wincl)) {
        wincl.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_GLOBALCLASS;
        wincl.hInstance = GetInstance();
        wincl.lpszClassName = s_classname_;
        wincl.lpfnWndProc = &Win32WindowView::ThisWindowProc;
        wincl.cbClsExtra = 0;
        wincl.cbWndExtra = 0;
        wincl.hIcon = LoadIcon(0, IDI_WINLOGO);
        wincl.hCursor = LoadCursor(0, IDC_ARROW);
        wincl.hbrBackground = 0;
        wincl.lpszMenuName = 0;
        if (RegisterClass(&wincl) == 0) {
            MessageBoxA(NULL, "The window class failed to register.", "Error", 0);
            //return 0;
        }
    }

    HWND window = CreateWindowEx(0, L"MyWindowClass", L"Window", WS_CHILD, x, y, width, height, parent_hwnd, NULL, hInstance, this);
    return window;
}

// This is then used in the following way, where "DllHandler" is a wrapper that loads the DLL into memory and deals with passing it instructions.
auto my_dll_hander = new DllHandler("location/of/dll");
HWND dll_window = createWindow(hInstance, my_main_window_hwnd, 20, 20, 200, 200);
my_dll_handler->openGUI(dll_window);
目前,它的优点是windows处理将鼠标处理路由到DLL的GUI,以及将GUI直接显示到屏幕,而无需我做更多的事情。 正如我已经解释过的,缺点是我不能做更多的事情,即使它会有用

有什么想法吗


谢谢

您可以在程序中的任意位置,但这样您就无法与它交互。但是,如果将DLL绘制到位图,我的应用程序就可以像处理其他位图一样处理它。使缩放成为可能。您是否考虑过对控件进行子分类?当需要处理鼠标输入时,我可以看到解决方案非常复杂,但是尝试一下的成本可能只有10-15分钟。实际上,您也可以强制GUI保持良好的大小,方法是在自己做事情之前调用
WM_GETMINMAXINFO
的默认处理程序,并将返回值设置为更适合您需要的值。很难说-GUI可以用这么多不同的方式完成为什么不创建自己的子窗口并将其放在DLL窗口的顶部?这也将得到正确的命中测试。和输入路由。和可访问性。你可以在你的程序中的一个随机位置,但是你将无法与它交互。但是,如果将DLL绘制到位图,我的应用程序就可以像处理其他位图一样处理它。使缩放成为可能。您是否考虑过对控件进行子分类?当需要处理鼠标输入时,我可以看到解决方案非常复杂,但是尝试一下的成本可能只有10-15分钟。实际上,您也可以强制GUI保持良好的大小,方法是在自己做事情之前调用
WM_GETMINMAXINFO
的默认处理程序,并将返回值设置为更适合您需要的值。很难说-GUI可以用这么多不同的方式完成为什么不创建自己的子窗口并将其放在DLL窗口的顶部?这也将得到正确的命中测试。和输入路由。和可及性。