利用双缓冲技术将位图像素数据写到DIB位图中并在指定的窗口显示(主要使用CreateDIBSection和BitBlt方法)
2013-07-21 21:28
357 查看
至于为什么要使用双缓冲技术,大家可以查阅相关的资料,这里我只提一点,就是解决屏幕刷新频繁导致闪烁的问题。
下面是相关的代码实现:(这里我保存的DIB位图的大小为320*240,深度为24位)
[cpp] view
plaincopyprint?
void SaveToBmpAndBlend(BYTE *buffer)
{
HDC hdc;
//获取屏幕显示DC
hdc = GetDC(m_hWnd);
//创建内存DC
HDC hdcMem = CreateCompatibleDC(hdc);
//创建一个bmp内存空间
HBITMAP hBmp;
BITMAPINFO bmpinfo;
bmpinfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biWidth=320;
bmpinfo.bmiHeader.biHeight=240;
bmpinfo.bmiHeader.biPlanes=1;
bmpinfo.bmiHeader.biBitCount=24;
bmpinfo.bmiHeader.biCompression=BI_RGB;
bmpinfo.bmiHeader.biSizeImage=320*240*3;
bmpinfo.bmiHeader.biXPelsPerMeter=0;
bmpinfo.bmiHeader.biClrImportant=0;
bmpinfo.bmiHeader.biClrUsed=0;
BYTE* pDibs = NULL;
//需要注意,当第5个参数为NULL时,PDibs指向的是一块新申请的内存,需要在外部将缓冲数据复制到这块新内存中。
hBmp=CreateDIBSection(hdcMem,&bmpinfo,DIB_RGB_COLORS,(void**) &pDibs,NULL,0);
for (int i=0;i<320*240*3;i++)
{
pDibs[i]=buffer[i];
}
//将bmp内存空间分配给内存DC
HGDIOBJ hOldSel = SelectObject(hdcMem,hBmp);
//将内存DC的内容复制到屏幕显示DC中,完成显示
BitBlt(hdc,0,0,320,240,hdcMem,0,0,SRCCOPY);//SRCCOPY 完全覆盖
//清除资源
SelectObject(hdcMem,hOldSel);
DeleteDC(hdcMem);
ReleaseDC(m_hWnd, hdc);
}
下面是相关的代码实现:(这里我保存的DIB位图的大小为320*240,深度为24位)
[cpp] view
plaincopyprint?
void SaveToBmpAndBlend(BYTE *buffer)
{
HDC hdc;
//获取屏幕显示DC
hdc = GetDC(m_hWnd);
//创建内存DC
HDC hdcMem = CreateCompatibleDC(hdc);
//创建一个bmp内存空间
HBITMAP hBmp;
BITMAPINFO bmpinfo;
bmpinfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biWidth=320;
bmpinfo.bmiHeader.biHeight=240;
bmpinfo.bmiHeader.biPlanes=1;
bmpinfo.bmiHeader.biBitCount=24;
bmpinfo.bmiHeader.biCompression=BI_RGB;
bmpinfo.bmiHeader.biSizeImage=320*240*3;
bmpinfo.bmiHeader.biXPelsPerMeter=0;
bmpinfo.bmiHeader.biClrImportant=0;
bmpinfo.bmiHeader.biClrUsed=0;
BYTE* pDibs = NULL;
//需要注意,当第5个参数为NULL时,PDibs指向的是一块新申请的内存,需要在外部将缓冲数据复制到这块新内存中。
hBmp=CreateDIBSection(hdcMem,&bmpinfo,DIB_RGB_COLORS,(void**) &pDibs,NULL,0);
for (int i=0;i<320*240*3;i++)
{
pDibs[i]=buffer[i];
}
//将bmp内存空间分配给内存DC
HGDIOBJ hOldSel = SelectObject(hdcMem,hBmp);
//将内存DC的内容复制到屏幕显示DC中,完成显示
BitBlt(hdc,0,0,320,240,hdcMem,0,0,SRCCOPY);//SRCCOPY 完全覆盖
//清除资源
SelectObject(hdcMem,hOldSel);
DeleteDC(hdcMem);
ReleaseDC(m_hWnd, hdc);
}
相关文章推荐
- 利用双缓冲技术将位图像素数据写到DIB位图中并在指定的窗口显示(主要使用CreateDIBSection和BitBlt方法)
- 【DirectX学习】使用DirectDraw在windows窗口上显示位图
- 利用NVelocity模板替换技术显示页面,模板里怎么调用C#类库的静态方法
- 不要使用Drawable的setBounds方法来指定其在控件作为背景的显示位置
- jquery利用正则表达式验证密码,手机号(主要是使用方法,正则表达式网上一搜一堆)
- 3S在土地利用和覆盖变化研究中的主要技术方法
- 数据库中各种操作方式累积。这个主要是测试显示使用多种方法
- mfc 位图显示方法 使用cbitmap和hbitmap
- 使用WindowManager.addView()方法增加的悬浮窗口,如何固定屏幕显示方向?
- 使用MoveWindow()函数来移动指定句柄的窗口在屏幕中的显示位置及这个窗口的大小
- android使用LayoutInflater显示进度窗口的方法
- C#/winform 指定窗口显示位置的方法
- 利用StretchDIBits、CreateDIBSection、CreateDIBitmap三种方法显示内存位图
- C#指定窗口显示位置的方法
- Html表单提交到Servlet输出到页面乱码 Html使用的编码是UTF-8编码显示页面,之后使用form表单提交字段到Servlet中,Servlet将利用getParamer方法获得fo
- 用Delphi画圆角Panel的方法(使用CreateRoundRectRgn创造区域,SetWindowRgn显示指定区域)
- VC中使用MFC显示位图的方法
- <转载>C#指定窗口显示位置的方法
- 利用双缓冲技术来显示动画
- emWin 2天速成实例教程014_BMP位图图片显示以及位图皮肤的使用方法