首页 > 其他分享 >从资源中加载显示位图,通过双缓冲的方法显示。

从资源中加载显示位图,通过双缓冲的方法显示。

时间:2022-10-11 23:31:13浏览次数:88  
标签:显示 缓冲 dcMemory DC bmp 内存 bmpInfo rect 加载


从文件加载位图 看这篇 ​​http://www.cppblog.com/alantop/archive/2008/03/14/44414.html​​​
如何使用下面的代码。
1. 把位图导入资源。
资源->入->选bmp类型->导入->从硬盘中选择导入的bmp图即可。导入后,自动生成ID为IDB_BITMAP1的资源Bitmap.
2. 把下面代码复制到视图的OnDraw(CDC* pDC)函数


CBitmap bmp;

if
(bmp
.
LoadBitmap(IDB_BITMAP1))
{

//
Get the size of the bitmap

BITMAP bmpInfo;
bmp
.
GetBitmap(
&
bmpInfo);


//
Create an in-memory DC compatible with the
// display DC we're using to paint

CDC dcMemory;
dcMemory
.
CreateCompatibleDC(pDC);




//
Select the bitmap into the in-memory DC

CBitmap
*
pOldBitmap
=
dcMemory
.
SelectObject(
&
bmp);


//
Find a centerpoint for the bitmap in the client area

CRect rect;
GetClientRect(
&
rect);
int nX
=
rect
.
left
+
(rect
.
Width()
-
bmpInfo
.
bmWidth)
/

2
;
int nY
=
rect
.
top
+
(rect
.
Height()
-
bmpInfo
.
bmHeight)
/

2
;

POINT ptstart
,
ptend;
ptstart
.
x
=
ptstart
.
y
=

0
;
ptend
.
x
=
ptend
.
y
=

500
;


dcMemory
.
MoveTo(ptstart);
dcMemory
.
LineTo(ptend);




//
Copy the bits from the in-memory DC into the on-
// screen DC to actually do the painting. Use the centerpoint
// we computed for the target offset.

pDC
->
BitBlt(
0
,

0
,
bmpInfo
.
bmWidth
,
bmpInfo
.
bmHeight
,

&
dcMemory
,


0
,

0
,
SRCCOPY);

dcMemory
.
SelectObject(pOldBitmap);

SIZE si;
si
.
cx
=
bmpInfo
.
bmWidth;
si
.
cy
=
bmpInfo
.
bmHeight;
SetScrollSizes(MM_TEXT
,
si);
}

else

TRACE0(
"
ERROR: Where's IDB_BITMAP1?\n
"
);

3. 代码的操作思路.

   双缓冲,简单的说就是把画图的所有动作都在内存DC上完成,然后通过BitBlt拷贝到屏幕DC上。

   a. 首先建立一个CBitmap对象

   b. 然后,建立一个和显示设备兼容的内存DC

   c. 然后把CBitmap放在建立的内存DC中

   d. 然后,在内存DC上做一些画图的动作

   e. 将内存DC中的东西,显示在屏幕上

4. 代码中的一些其他操作

   a. 我们常用SelectObject把新的东西选入。把老的东西作为返回值,保存。再使用完毕后,在用SelectObject重新启用老的东西

   b. 在代码里面有设置滚动条的地方。 使用CScrollView类作为基类。给SIZE结构体赋值,然后调用SetScrollSizes做设置,滚动条就会自动计算响应的。

标签:显示,缓冲,dcMemory,DC,bmp,内存,bmpInfo,rect,加载
From: https://blog.51cto.com/alantop/5748468

相关文章