绘图

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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值