zoukankan      html  css  js  c++  java
  • win32: WM_PAINT 实现双缓冲缓图

    相关参考资料:

    GDI下实现双缓冲 - http://jingyan.baidu.com/article/e73e26c0f8df2424acb6a76e.html

    <Win32_19>用双缓冲技术实现真个的平滑 - http://www.myexception.cn/program/1407847.html

    设置双缓冲减少窗体闪烁 - http://hi.baidu.com/robinlxzh/item/ad70a4ae92db5bf614329be7

    平时在窗体上不使用双缓冲来绘制的方法:

    case WM_PAINT:

    {

    PAINTSTRUCT ps;

    //为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中。

    HDC hdc = BeginPaint(hwnd, &ps); 

    //HPEN hPen = CreatePen(PS_SOLID, 1, RGB(128 , 128, 128)); //设置颜色

    HPEN hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); //按钮的3D阴影

    SelectObject(hdc, hPen);

    Rectangle(hdc, -1, -1, 680, 72); //画矩形

    DeleteObject(hPen); //一旦不再需要画笔,记得用DeleteObject函数将其删除

    //画线

    hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); //按钮的3D阴影

    SelectObject(hdc, hPen);

    MoveToEx(hdc, 0, 484, NULL); //起点

    LineTo(hdc, 680, 484); //终点

    DeleteObject(hPen); //一旦不再需要画笔,记得用DeleteObject函数将其删除 

    ReleaseDC(hwnd, hdc); //释放 

    EndPaint(hwnd, &ps); //结束缓制

    return 0;

    }

    -----------------------------------------------------------------------------

    下面使用双缓冲技术来画,与上面的代码对比,只需将原来的hdc -> hdc_old, 然后插入红色的两个部分就实现双缓冲绘图。

    WM_ERASEBKGND 与 WM_PAINT 的结合:

    case WM_ERASEBKGND:

    {

        return 1; //避免窗口背景的重刷 - http://hi.baidu.com/robinlxzh/item/ad70a4ae92db5bf614329be7

    }

    case WM_PAINT:

    {

    PAINTSTRUCT ps;

    //使用双缓冲技术绘图

    //变量: hdc_old 表示系统默认的 hdc

    //变量: hdc 表示双缓冲的内存DC

    //为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中。

    HDC hdc_old = BeginPaint(hwnd, &ps);  

    //用于缓冲的内存DC

    HDC hdc = CreateCompatibleDC(hdc_old);

     

    //需要获取窗口的宽与高, 缓制尺寸

    RECT clientRect;

    GetClientRect(hwnd,&clientRect);

    //printf("%d, height:%d ",clientRect.right,clientRect.bottom);

     

    //创建内存兼容位图hBmp

    HBITMAP hBmp = CreateCompatibleBitmap(hdc_old,clientRect.right,clientRect.bottom);

     

    //将内存位图选入缓冲内存DC中——以便可以绘制多个位图

    SelectObject(hdc,hBmp);

     

    //如果不执行这两步, 窗口显示出来会出现黑色背景 

    SelectObject(hdc, GetSysColorBrush(COLOR_3DFACE)); //设置刷子颜色 - Rectangle()的填充色

     

    //由于 Rectangle() 画出有黑色边框线, 这里故意从 -1,-1 绘制 +2, +2, 这样黑色边框线超出可视范围,就看不到了

    Rectangle(hdc, -1, -1, clientRect.right + 2, clientRect.bottom + 2); //画窗体的整个背景

    //HPEN hPen = CreatePen(PS_SOLID, 1, RGB(128 , 128, 128)); //设置颜色

    HPEN hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); //按钮的3D阴影

    SelectObject(hdc, hPen);

    Rectangle(hdc, -1, -1, 680, 72); //画矩形 

    DeleteObject(hPen); //一旦不再需要画笔,记得用DeleteObject函数将其删除

    //画线

    hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); //按钮的3D阴影

    SelectObject(hdc, hPen);

    MoveToEx(hdc, 0, 484, NULL); //起点

    LineTo(hdc, 680, 484); //终点

    DeleteObject(hPen); //一旦不再需要画笔,记得用DeleteObject函数将其删除

    // 将内存中的内容显示到窗口 - 使用bitblt函数

    BitBlt(hdc_old,0,0,clientRect.right,clientRect.bottom,hdc,0,0,SRCCOPY);

     

    //注意回收内存资源

    DeleteObject(hBmp);

    DeleteDC(hdc);

    ReleaseDC(hwnd, hdc); //释放 

    EndPaint(hwnd, &ps); //结束缓制

    return 0;

    }

    2014-07-03

    名品推荐:盾文 稀族 慕汀

  • 相关阅读:
    hibernate 单元測试框架
    freemarker基本数据类型
    Effective C++:条款26:尽可能延后变量定义式的出现时间
    Hive Python Streaming的原理及写法
    算法(第四版)学习笔记之java实现希尔排序
    Passing address of non-local object to __autoreleasing parameter for write-back
    VB 中窗口发现冲突名称,将使用名称...怎么解决?
    struts2基础梳理(二)
    EM算法求高斯混合模型參数预计——Python实现
    Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layou
  • 原文地址:https://www.cnblogs.com/personnel/p/4585017.html
Copyright © 2011-2022 走看看