MFC屏幕截图,保存,显示,放到剪贴板,结构体为char*格式用于socket发送等

void CSaveScreanDlg::OnBnClickedsavebmp()
{
CRectTracker m_rectTracker;
CBitmap m_bSaveBitmap,bmp2; 
CClientDC dc(this);  
m_rectTracker.m_rect = CRect(0,0,800,800);       
CRect re(m_rectTracker.m_rect);  
m_bSaveBitmap.CreateCompatibleBitmap(&dc,re.Width(),re.Height());  

CDC tempDc;  
tempDc.CreateCompatibleDC(&dc);  
tempDc.SelectObject(&m_bSaveBitmap);  
tempDc.BitBlt(0,0,re.Width(),re.Height(),&dc,re.left,re.top,SRCCOPY);  
         
          
        //弹出一个对话框,保存为bmp格式  
        CFileDialog fDlg(FALSE,_T("bmp"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp"),this);       
        if (fDlg.DoModal()==IDOK)       
        {       
            CString bmpfile = fDlg.GetPathName();       
            //用CImage保存图片  
            ATL::CImage img;  
            img.Attach(m_bSaveBitmap);  
            img.Save(bmpfile);  
            img.Detach();  
			
			//将结构体bm,转为char*,赋值给bm2;用来测试socket传送;
			BITMAP bm;
			m_bSaveBitmap.GetBitmap(&bm);
			char *bmchar=(char*)&bm;
			BITMAP bm2;
			memcpy_s(&bm2,sizeof(BITMAP)+1,bmchar,sizeof(BITMAP));
			long size=bm2.bmHeight*bm2.bmWidth*bm2.bmBitsPixel/8;
			//把CBitbmp数据存为char*格式用于socket传送;
			BYTE *pbuf=new BYTE[size];
			//ZeroMemory(pbuf,size);
			memset(pbuf,0,size);
			m_bSaveBitmap.GetBitmapBits(size,pbuf);
			客户端可以将bm2,pbuf重组为bmp;
			CDC *pdc=GetDC();
			bmp2.CreateCompatibleBitmap(pdc,bm2.bmWidth,bm2.bmHeight);
			bmp2.SetBitmapBits(size,pbuf);
			//在控件上显示出来;
			CStatic *p=(CStatic*)GetDlgItem(IDC_STATIC);
			p->ModifyStyle(0xf,SS_BITMAP|SS_CENTERIMAGE);
			p->SetBitmap(bmp2);		
			

            //截图后退出程序  
          //  PostQuitMessage(0);  
        }  
}


void CSaveScreanDlg::OnBnClickedButton2()
{
CDC* pScreenDc = CDC::FromHandle(::GetDC(NULL));//<span style="white-space:pre">    </span>//屏幕DC  
CDC memDc;//<span style="white-space:pre">  </span>// 内存DC  
CBitmap memBmp;  
CBitmap* pOldBmp;  
int cx = GetSystemMetrics(SM_CXSCREEN);  
int cy = GetSystemMetrics(SM_CYSCREEN);  
memDc.CreateCompatibleDC(pScreenDc);  
memBmp.CreateCompatibleBitmap(pScreenDc, cx, cy);  
pOldBmp = memDc.SelectObject(&memBmp);  
memDc.BitBlt(0, 0, cx, cy, pScreenDc, 0, 0, SRCCOPY); 
//保存图片
ATL::CImage img;  
img.Attach(memBmp);  
img.Save("d:\\12.bmp");  
img.Detach();  
//复制到剪切板  
OpenClipboard();  
EmptyClipboard();  
SetClipboardData(CF_BITMAP, memBmp.Detach());  
CloseClipboard();  
  
// 显示到当前界面  
CClientDC clientDc(this);  
CRect rcClient;  
GetClientRect(rcClient);  
clientDc.StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDc, 0, 0, cx, cy, SRCCOPY);  
  
memDc.SelectObject(pOldBmp);  
memDc.DeleteDC();  
memBmp.DeleteObject(); 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值