上一篇讲了如何从资源中加载位图,这里讲如何从文件中加载。
资源加载位图 http://www.cppblog.com/alantop/archive/2008/03/13/44395.html
整个程序的流程是一样的,不明白的,可以看上一篇。
这里主要的 不同是怎样产生CBitmap对象。
从资源中加载是:
这里需要注意的是从文件加载位图,并不是通过调用CBitmap的成员函数完成。
而是使用SDK函数LoadImage,通过将其返回值赋值给CBitmap的成员变量m_hObject而完成对CBitmap的对象的赋值过程。
此处的强制类型可以不使用,使用是强调的意思。
注意: When you no longer need the memory DC, call the DeleteDC function.
完全从文件加载位图,双缓冲代码如下,放在OnDraw(CDC* pDC)函数中即可。
资源加载位图 http://www.cppblog.com/alantop/archive/2008/03/13/44395.html
整个程序的流程是一样的,不明白的,可以看上一篇。
这里主要的 不同是怎样产生CBitmap对象。
从资源中加载是:
CBitmap bmp;
bmp . LoadBitmap(IDB_BITMAP1)
从文件中加载是:
bmp . LoadBitmap(IDB_BITMAP1)
CBitmap bitmap;
bitmap . m_hObject = (HBITMAP) :: LoadImage( NULL , " test.bmp " , IMAGE_BITMAP , 500 , 400 , LR_LOADFROMFILE);
bitmap . m_hObject = (HBITMAP) :: LoadImage( NULL , " test.bmp " , IMAGE_BITMAP , 500 , 400 , LR_LOADFROMFILE);
这里需要注意的是从文件加载位图,并不是通过调用CBitmap的成员函数完成。
而是使用SDK函数LoadImage,通过将其返回值赋值给CBitmap的成员变量m_hObject而完成对CBitmap的对象的赋值过程。
此处的强制类型可以不使用,使用是强调的意思。
注意: When you no longer need the memory DC, call the DeleteDC function.
完全从文件加载位图,双缓冲代码如下,放在OnDraw(CDC* pDC)函数中即可。
CBitmap bitmap;
bitmap . m_hObject = (HBITMAP) :: LoadImage( NULL , " test.bmp " , IMAGE_BITMAP , 500 , 400 , LR_LOADFROMFILE);
if (bitmap . m_hObject)
{
// Get the size of the bitmap
BITMAP bmpInfo;
bitmap . 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( & bitmap);
// 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 * 2 , bmpInfo . bmHeight * 2 , & 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 " );
bitmap . m_hObject = (HBITMAP) :: LoadImage( NULL , " test.bmp " , IMAGE_BITMAP , 500 , 400 , LR_LOADFROMFILE);
if (bitmap . m_hObject)
{
// Get the size of the bitmap
BITMAP bmpInfo;
bitmap . 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( & bitmap);
// 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 * 2 , bmpInfo . bmHeight * 2 , & 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 " );