首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BitBlt问题GDI

BitBlt问题GDI
EN

Stack Overflow用户
提问于 2011-05-27 08:16:58
回答 1查看 2.2K关注 0票数 1

我在这个程序中使用BitBlt遇到了问题。调整窗口大小后,椭圆也随之调整大小。当然,使用普通的hdc方法,它是起伏不定的。我尝试了BitBlt方法,但也不起作用(可能是因为我做错了)。有没有人能纠正我做错了什么?谢谢

代码语言:javascript
复制
    bool sizing; //global   
case WM_PAINT:
    {
        RECT rect;
        GetClientRect(hwnd, &rect);
        hdc = BeginPaint(hwnd, &ps);
        mem = CreateCompatibleDC(hdc);
        SelectObject(mem, GetStockObject(HOLLOW_BRUSH));
        if(sizing)
        {
        Ellipse(mem,rect.left, rect.top, rect.right, rect.bottom);
        }
    BitBlt(hdc, rect.left, rect.top, rect.left - rect.right, rect.top -rect.bottom , mem, rect.left, rect.top, SRCCOPY);
        DeleteDC(mem);
        EndPaint(hwnd, &ps);
        break;
    }
    case WM_SIZE:
        sizing = true;
        break;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-27 10:55:59

看起来你正在尝试绘制一个基于内存的位图,然后将其位到屏幕上,以避免闪烁?

这里的第一个问题是处理闪烁:首先,你需要像汉斯指出的那样覆盖WM_ERASEBKGND -否则Windows会用任何窗口笔刷擦除背景(来自RegisterClass),而擦除是闪烁的常见原因。

这里的下一个问题是你使用了一个“空的”DC: CreateCompatibleDC给了你一个DC --这只是一个绘图上下文--但是这个上下文包含一个1像素x 1像素的位图。要在屏幕外绘制,您需要一个DC和一个位图。一定要花时间阅读the MSDN page for CreateCompatible -它指出了这个问题。

如果您对此还不熟悉,可以将位图看作是您在其上绘制的实际画布- DC只是完成绘制的支持结构。就像你的代码一样,你已经设置了画架和画笔--但是你没有在任何东西上作画。

这里通常的方法是:

  • CreateCompatibleDC创建位图以创建位图,您将实际将新位图绘制到内存DC中

to the memory DC -从内存DC中选择的位图绘制到内存DC中(即,在内存DC中选择的位图)到WM_PAINT

  • Clean up中的位图:将原始位图重新绘制到内存DC中,然后删除位图和DC。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6146498

复制
相关文章

相似问题

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