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("width:%d, height:%d\n",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

 

 

名品推荐:盾文 稀族 慕汀

 

转载于:https://www.cnblogs.com/personnel/p/4585017.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值