1.百度
在窗口上贴图一般总是要用到内存DC,将所有的绘制工作先绘制在内存DC上,然活一次性拷贝到屏幕DC上,就是这样了。
这里是使用mfc进行的说明,对hdc进行了封装,但是道理是一样的。
1.创建内存DC
CDC m_MenDC; //声明内存DC
CDC m_MenDC2; //声明内存DC
CBitmap m_Bitmap1; //声明一个位图
m_MenDC.CreateCompatibleDC(GetDC());//创建内存DC
m_MenDCMap.CreateCompatibleDC(GetDC());//创建内存DC
m_Bitmap1.CreateCompatibleBitmap(GetDC(),1024,768); //创建一个兼容位图,这是一个空的位图,我们可以把它想象成一个屏幕,可以在上面画线,输出文字等,自己制作一个简单的位图。
m_hbmpBK = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),path+"Bk4.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//我们也可以从硬盘导入一张位图。
2,为内存DC选入一张位图,或兼容位图。
m_MenDC.SelectObject(m_hbmpBK);
m_MenDC2.SelectObject(m_Bitmap1);
注意,想要在内存dc上作图,必须先为它选入一张位图,或兼容位图。想想前面,不管BeginPaint还是getDC都有一个相关的区域。这里的位图就是相关区域。
3.接着我们就可以像在窗口上作图一样,使用gdi函数(drawline,textout...)在内存dc上作图了。同时也可以从一个内存dc拷贝位图到另一个内存dc。
m_MenDC2.BitBlt(0,0,1024,768,&m_MenDC,0,0,SRCCOPY);
4,绘制结果的显示,将这些东西拷到屏幕DC(getdc取得的dc)上
// 所谓的双缓冲就是把所有的绘制工作都做在一个内存DC上。
// 最后一次拷到屏幕DC上,只能有一次
dc.BitBlt(0,0,1024,768,&m_MenDC2,0,0,SRCCOPY);//这里的dc是通过getdc取得的屏幕或者某个窗口的dc。
2.ImageId 绘图
void CLogin::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP_LOGIN); //IDB_BITMAP是你自己的图对应的ID ,由于我刚刚加入的位图资源
//被我命名成了IDB_Bg,因而我这句就是bmpBackground.LoadBitmap(IDB_Bg);
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
3.图片路径
CImgBmp imgBmp;
m_strChepai = imgBmp.ShiBie(m_strFileName);
CRect aRect;
m_ctrChepai.GetClientRect(&aRect);
CImage aImage;
aImage.Load("c:\\chepai.bmp");
CDC* pDC = m_ctrChepai.GetWindowDC(); //获得显示控件的DC
SetStretchBltMode(*pDC, HALFTONE);
aImage.Draw( pDC->m_hDC, aRect); //图片类的图片绘制Draw函数
ReleaseDC(pDC);