Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;GetDC所有监视器_C++_Visual Studio_Visual C++_Multiple Monitors - Fatal编程技术网

C++ C++;GetDC所有监视器

C++ C++;GetDC所有监视器,c++,visual-studio,visual-c++,multiple-monitors,C++,Visual Studio,Visual C++,Multiple Monitors,基本上,我正在做一些模拟屏幕融化效果的东西,但我只能让它在我的主显示器上工作。我已经尽可能多地查找了,GetDC上只有一个供所有监视器使用的论坛,但它没有用,它所做的只是从我的主监视器到我的辅助监视器制作一个矩形,效果仍然只能在我的主监视器上工作。这是我读到的线索: 我更改的行是HDC Window=GetDC(Window)到HDC Window=GetDC(NULL),然后是其他一些东西,比如RECT。如果有人能帮我就太好了,谢谢:) PS,屏幕宽度=3600,屏幕高度=1080,而PMSc

基本上,我正在做一些模拟屏幕融化效果的东西,但我只能让它在我的主显示器上工作。我已经尽可能多地查找了,GetDC上只有一个供所有监视器使用的论坛,但它没有用,它所做的只是从我的主监视器到我的辅助监视器制作一个矩形,效果仍然只能在我的主监视器上工作。这是我读到的线索:

我更改的行是
HDC Window=GetDC(Window)到HDC Window=GetDC(NULL)
,然后是其他一些东西,比如
RECT
。如果有人能帮我就太好了,谢谢:)

PS,屏幕宽度=3600,屏幕高度=1080,而PMScreenWidth=1920,PMScreenHeight=1080。PM和主监视器一样,所以我将该函数中的所有内容设置为ScreenWidth/ScreenHeight,所以它是所有监视器的宽度/高度。但仍然不起作用。

GetDC(HWND_桌面)
(与
GetDC(0)
)已返回所有监视器的DC。上述代码的问题主要是使用
BitBlt
和选择坐标。请参阅下面解决该问题的MCVE

不要根据
WM_CREATE
进行绘制,它只会在
WM_PAINT
中被擦除,或者在背景被擦除时被擦除

不要调用
WM\u PAINT
来响应
WM\u PAINT
。如果要删除窗口,只需使用
FillRect
,或从命令或其他路径强制重新绘制即可

使用
GetSystemMetrics(SM\u CXVIRTUALSCREEN)
GetSystemMetrics(SM\u CYVIRTUALSCREEN)
返回虚拟监视器的宽度和高度

还应确保该流程了解DPI。对于测试,可以调用
SetProcessDPIAware()。理想情况下,应该在清单文件中设置DPI感知

上面的代码是从同一个客户机DC复制位,它不会做任何事情。您可能希望从桌面DC复制到客户端DC

此外,坐标基本上是随机选取的。它假定主监视器位于左上角。如果
uX
大于窗口自身的宽度,则不会复制它,除非窗口拉伸整个虚拟监视器

LRESULT CALLBACK Melter(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {

    switch(Message) 
    {
    case WM_PAINT: 
    {
        PAINTSTRUCT ps;
        auto hdc = BeginPaint(hWnd, &ps);
        RECT rc;
        GetClientRect(hWnd, &rc);

        HDC hdesktop = GetDC(0);

        int screenx = GetSystemMetrics(SM_XVIRTUALSCREEN);
        int screeny = GetSystemMetrics(SM_YVIRTUALSCREEN);
        int screenw = GetSystemMetrics(SM_CXVIRTUALSCREEN);
        int screenh = GetSystemMetrics(SM_CYVIRTUALSCREEN);

        StretchBlt(hdc, 0, 0, rc.right, rc.bottom,
            hdesktop, screenx, screeny, screenw, screenh, SRCCOPY);

        ReleaseDC(0, hdesktop);

        EndPaint(hWnd, &ps);
        break;
    }

    case WM_DESTROY: 
        PostQuitMessage(0);
        break;
    }

    return DefWindowProc(hWnd, Message, wParam, lParam);
}
GetDC(HWND\u桌面)
(与
GetDC(0)
相同)已返回所有监视器的DC。上述代码的问题主要是使用
BitBlt
和选择坐标。请参阅下面解决该问题的MCVE

不要根据
WM_CREATE
进行绘制,它只会在
WM_PAINT
中被擦除,或者在背景被擦除时被擦除

不要调用
WM\u PAINT
来响应
WM\u PAINT
。如果要删除窗口,只需使用
FillRect
,或从命令或其他路径强制重新绘制即可

使用
GetSystemMetrics(SM\u CXVIRTUALSCREEN)
GetSystemMetrics(SM\u CYVIRTUALSCREEN)
返回虚拟监视器的宽度和高度

还应确保该流程了解DPI。对于测试,可以调用
SetProcessDPIAware()。理想情况下,应该在清单文件中设置DPI感知

上面的代码是从同一个客户机DC复制位,它不会做任何事情。您可能希望从桌面DC复制到客户端DC

此外,坐标基本上是随机选取的。它假定主监视器位于左上角。如果
uX
大于窗口自身的宽度,则不会复制它,除非窗口拉伸整个虚拟监视器

LRESULT CALLBACK Melter(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {

    switch(Message) 
    {
    case WM_PAINT: 
    {
        PAINTSTRUCT ps;
        auto hdc = BeginPaint(hWnd, &ps);
        RECT rc;
        GetClientRect(hWnd, &rc);

        HDC hdesktop = GetDC(0);

        int screenx = GetSystemMetrics(SM_XVIRTUALSCREEN);
        int screeny = GetSystemMetrics(SM_YVIRTUALSCREEN);
        int screenw = GetSystemMetrics(SM_CXVIRTUALSCREEN);
        int screenh = GetSystemMetrics(SM_CYVIRTUALSCREEN);

        StretchBlt(hdc, 0, 0, rc.right, rc.bottom,
            hdesktop, screenx, screeny, screenw, screenh, SRCCOPY);

        ReleaseDC(0, hdesktop);

        EndPaint(hWnd, &ps);
        break;
    }

    case WM_DESTROY: 
        PostQuitMessage(0);
        break;
    }

    return DefWindowProc(hWnd, Message, wParam, lParam);
}
你可以用

HDC dc=CreateDC((“显示”),NULL,NULL,NULL;
查看以下链接:

  • 你可以用

    HDC dc=CreateDC((“显示”),NULL,NULL,NULL;
    
    查看以下链接:


  • 你试过了吗?你试过了吗?谢谢你的建议,但是在第二台显示器上它似乎仍然没有任何作用,即使ScreemWidth是主显示器+第二台显示器。我还会继续看一些文档,看看是否能找到有用的东西。顺便说一下,你的代码与你的问题无关。请参阅有关如何创建以解决特定问题的帮助页面。不要提前开始编写一堆代码。请参阅编辑。感谢您的建议,但即使ScreemWidth是主监视器+辅助监视器,它在第二个监视器上似乎仍然没有任何作用。我还会继续看一些文档,看看是否能找到有用的东西。顺便说一下,你的代码与你的问题无关。请参阅有关如何创建以解决特定问题的帮助页面。不要提前开始编写一堆代码。请参见编辑。
    LRESULT CALLBACK Melter(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    
        switch(Message) 
        {
        case WM_PAINT: 
        {
            PAINTSTRUCT ps;
            auto hdc = BeginPaint(hWnd, &ps);
            RECT rc;
            GetClientRect(hWnd, &rc);
    
            HDC hdesktop = GetDC(0);
    
            int screenx = GetSystemMetrics(SM_XVIRTUALSCREEN);
            int screeny = GetSystemMetrics(SM_YVIRTUALSCREEN);
            int screenw = GetSystemMetrics(SM_CXVIRTUALSCREEN);
            int screenh = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    
            StretchBlt(hdc, 0, 0, rc.right, rc.bottom,
                hdesktop, screenx, screeny, screenw, screenh, SRCCOPY);
    
            ReleaseDC(0, hdesktop);
    
            EndPaint(hWnd, &ps);
            break;
        }
    
        case WM_DESTROY: 
            PostQuitMessage(0);
            break;
        }
    
        return DefWindowProc(hWnd, Message, wParam, lParam);
    }