首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取最小化窗口在规范化后的位图

获取最小化窗口在规范化后的位图
EN

Stack Overflow用户
提问于 2012-02-25 04:41:28
回答 3查看 1.4K关注 0票数 2

我正在尝试定期写一份我的应用程序窗口的样子。如果窗口是标准化的,也就是在桌面上,事情就能正常工作。但是如果窗口被最小化,我只能得到最小化的命令栏。

我尝试过在WM_PRINT和PrintWindow中使用SendMessage的各种方法,但都没有成功。在下面使用SendMessage的代码中,我知道标准化窗口的适当大小用于创建位图。我知道通过DefWindowProc对WM_PRINT的默认处理生成了一条WM_PRINTCLIENT消息。hWnd是最小化窗口的句柄。

代码语言:javascript
复制
        HDC                 scrdc, memdc;
        HBITMAP             membit;
        WINDOWPLACEMENT     WP;
        EncoderParameters   encoderParameters;
        ULONG               quality;
        Status              status;
        RECT                Rect;

        WP.length  = sizeof (WP);
        WP.flags   = 0;
        WP.showCmd = 0;

        GetWindowPlacement (hWnd, &WP);
        int WPHeight = WP.rcNormalPosition.bottom - WP.rcNormalPosition.top;
        int WPWidth  = WP.rcNormalPosition.right  - WP.rcNormalPosition.left;

        scrdc = GetWindowDC (hWnd);                                 // source DC
        GetWindowRect(hWnd,&Rect);                                  //  source Rectangle
        int Height = Rect.bottom-Rect.top;                          //   source height
        int Width  = Rect.right-Rect.left;                          //    source width

        if (WP.showCmd == SW_SHOWMINIMIZED)
        {
            Height = WPHeight;
            Width  = WPWidth;
        }

        memdc = CreateCompatibleDC(scrdc);                          // destination DC
        membit = CreateCompatibleBitmap(scrdc, Width, Height);      //  destination bitmap
        HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit);  //   add bitmap to DC

// copy screen to new BitMap

//      BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);   

//      PrintWindow (hWnd, memdc, 0);

        BitBlt 
        (
            memdc,
            0,
            0,
            GetDeviceCaps(memdc,HORZRES),
            GetDeviceCaps(memdc,VERTRES),
            NULL,
            NULL,
            NULL,
            WHITENESS
        );

        SendMessage (hWnd, WM_PRINT, unsigned int (memdc), PRF_CLIENT|PRF_NONCLIENT);

下面是WM_PRINT、WM_PRINTCLIENT和WM_PAINT处理程序的代码

代码语言:javascript
复制
    case WM_PRINT:
        return DefWindowProc (hWnd, message, wParam, lParam);

    case WM_PRINTCLIENT:
        Screen.WMPrint (hWnd, HDC (wParam), NULL);
        return true;
        return DefWindowProc (hWnd, message, wParam, lParam);

    case WM_PAINT:                          
        Screen.WMPaint (hWnd);
        break;

我还知道Screen.WMPrint在HDC中草草写下了适当的东西。

因此,如果有人能给我一些提示或建议一种方法,我将非常感激。我可以使用Screen.WMPaint,但是我只得到了客户区,而忽略了命令栏和边框。

我不想规格化窗口,因为那会惹恼用户。

EN

回答 3

Stack Overflow用户

发布于 2012-02-25 06:04:01

这很难,因为当你的窗口被最小化时,它看起来并不像它未最小化的自己。

通过调用通常的WM_NCPAINT处理程序,WM_PRINT打印窗口的非工作区(因为您正在传递标志)。该处理程序会查看窗口状态,因此如果窗口状态被最小化,您将无法获得想要的结果。然后它尝试打印客户区,但是(我怀疑)这里的最小化状态也会导致跳过这一部分--一个有效的最小化窗口没有客户区。

调用内部绘制例程可能是最简单的解决方案。是的,它只会给你提供客户区。请注意,当您将鼠标悬停在最小化窗口的磁贴上时,您在Windows 7任务栏上看到的预览也不包括非工作区。我觉得这太难了。

票数 0
EN

Stack Overflow用户

发布于 2012-02-25 23:39:53

在您的WM_PAINT处理程序中,假设您正在使用双缓冲,将backbuffer hdc设置为全局的,然后当您想要为您的程序拍摄快照时,只需将该HDC比特到一个屏幕外的位图,就可以了。

下面是您的WM_PAINT处理程序应该是什么样子:http://pastebin.com/aNvtHiD6

票数 0
EN

Stack Overflow用户

发布于 2012-03-08 10:16:43

这样,就有可能构建这样的位图。我认为,为了获得标题栏和边框,用户必须在每次绘制操作后浏览整个窗口的位图。然后可以擦除工作区。这将提供一个可以进行各种GDI操作的起点。一个额外的复杂性是,任何控件,如滚动条、日期控件、编辑框等都必须单独捕获并添加到位图中。对于我的应用程序,我决定不处理最小化的情况。我很难把控件放到新的位图上。控件的问题出现是因为人们不能简单地使它们成为主窗口的孩子,因为你所拥有的只是一个位图,窗口本身被最小化,或者控件被遮挡或从屏幕上消失。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9437729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档