VC中使用GDI绘制位图BMP

 转发自源博文:https://www.cnblogs.com/yutianfcl/articles/842383.html

摘要:

1.绘图基础

2.如何避免绘图过程的闪烁问题

3.关键色

内容:

1.绘图基础

使用GDI在win32程序中绘制简单图形
HDC hdc=GetDC(HWND)  //获取图形设备结构
Ellipse(hdc,left,top,right,buttom);//绘制填充椭圆
Rectangle(hdc,left,top,right,buttom);//绘制填充矩形
RoundRect(hdc,left,top,right,buttom,xcornerEllipse,ycornerEllipse);//绘制填充圆角矩形

MoveToEx(hdc,point.x,point.y,NULL);//移动画笔
LineTo(hdc,point.x,point.y);//画直线

TextOut(hdc,x,y,Text("..."),textLenght);//输出文字

DeleteDC(hdc);//删除

在GDI中绘制位图
HDC hdc = GetDC(hWnd);//获取当前的显示设备上下文

HBITMAP bitmap;//图象句柄
//从硬盘下载图片
bitmap = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,with,height,LR_LOADFROMFILE);
//从资源文件中下载图片
//bitmap=LoadBitmap (g_hInstance,MAKEINTRESOURCE(IDB_BITMAP)); 

HDC  hdcsource  = CreateCompatibleDC(NULL);//创建存放图象的显示缓冲
SelectObject(hdcsource,bitmap);    //将位图资源装入显示缓冲
BitBlt(hdc,x,y,with,height,hdcsource,x,y,SRCCOPY);//将图象显示缓冲的内容直接显示到屏幕
ReleaseDC(hdc);

2.闪烁问题

问题提出:

使用上述的方法绘制位图的时候,如果要绘制多张位图如下:
HDC hdc = GetDC(hWnd);//获取当前的显示设备上下文

//第一张位图

HBITMAP bitmap1;//图象句柄
bitmap1 = (HBITMAP)LoadImage(NULL,"bg1.bmp",IMAGE_BITMAP,with,height,LR_LOADFROMFILE);

HDC  hdcsource1  = CreateCompatibleDC(NULL);//创建后备显示缓冲
SelectObject(hdcsource1,bitmap1);    //将位图资源装入显示缓冲

//第二张位图

HBITMAP bitmap2;//图象句柄
bitmap2 = (HBITMAP)LoadImage(NULL,"bg2.bmp",IMAGE_BITMAP,with,height,LR_LOADFROMFILE);
HDC  hdcsource2  = CreateCompatibleDC(NULL);//创建后备显示缓冲

SelectObject(hdcsource2,bitmap2);    //将位图资源装入显示缓冲


BitBlt(hdc,x,y,with,height,hdcsource1,x,y,SRCCOPY);
BitBlt(hdc,x,y,with,height,hdcsource2,x,y,SRCCOPY);

ReleaseDC(hdc);

使用该方法如果图片比较多的时候会出现屏幕闪烁。

问题解决

使用双缓冲避免闪烁
HDC hdc
HDC hdcback
HDC hdcsource

hdc=GetDC(HWND)//获得当前显示设备的上下文

hdcback=CreateCompatibleDC(NULL)//创建后备缓冲
HBITMAP bmp=CreateCompatibleBitmap(hdc,with,height)//创建和当前设备相关的位图
SelectObject(hdcback,bmp)//没有这句,将显示不了图片

hdcsource=CreateCompatibleDC(NULL)//创建存放位图的设备缓冲
HBITMAP bmpsource=LoadImage(NULL,bmpstr,IMAGE_BITMAP,with,height,LR_LOADFROMFILE);
SelectObject(hdcsource,bmpsource)

BitBlt(hdcback,x1,y1,with,height,hdcsource,x2,y2,SRCCOPY);//将位图显示到后备缓冲
BitBlt(hdc,x1,y1,with,height,hdcback,x2,y2,SRCCOPY);//将后备缓冲显示到屏幕

3.关键色

使用GDI中的关键色,可以用函数

WINGDIAPI BOOL  WINAPI TransparentBlt(HDC,int,int,int,int,HDC,int,int,int,int,UINT);

并且包含

#include "Wingdi.h"
#pragma comment(lib,"msimg32.lib")

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值