VC中使用GDI绘制位图

Posted on 2007-08-03 22:29  阿·凡  阅读(2587)  评论(0编辑  收藏  举报
摘要:
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")

Copyright © 2024 阿·凡
Powered by .NET 8.0 on Kubernetes