⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sreenclientdlg.cpp

📁 采用VC++编写
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	if(pclient!=NULL)
    	pclient->SendCommandData(3,(char*)&usrinfo,sizeof(USERINFO));

/*	CClientDC dc(this);
	CRect rect;
	this->GetClientRect(&rect);
    int w=rect.Width();
	int h=rect.Height();
	CRect rect1,rect2;
    GetDlgItem(IDC_SCROLLBAR1)->GetClientRect(&rect1);
    GetDlgItem(IDC_SCROLLBAR2)->GetClientRect(&rect2);
    w=w-rect1.Width()-15;
	h=h-rect2.Height()-15;
	dc.MoveTo(0,75);
	dc.LineTo(w,75);
	dc.LineTo(w,h);
	dc.LineTo(0,h);
	dc.LineTo(0,75);*/

}

void CSreenClientDlg::OnButtonSavebmp() 
{
	// TODO: Add your control notification handler code here
	char szFilter[]="All files (*.*)|*.*|bmp files(*.bmp)|*.bmp||";


	CFileDialog fd(false,"bmp","aaa",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL);
	if(IDOK==fd.DoModal())
	{
		m_filename=fd.GetPathName();

        CapSreen();

		WriteBmpToFile(hBitmap,m_filename);
		UpdateData(FALSE);
	}
}

void CSreenClientDlg::WriteBmpToFile(HBITMAP hBitmap, CString strFileName)
{
	HDC hDC =::CreateDC("DISPLAY",NULL,NULL,NULL); 
    int iBits = ::GetDeviceCaps(hDC, BITSPIXEL) * ::GetDeviceCaps(hDC, PLANES);//当前分辨率下每个像素所占字节数  
    ::DeleteDC(hDC);

    WORD   wBitCount;   //位图中每个像素所占字节数    
    if (iBits <= 1)
		wBitCount = 1;
    else if (iBits <= 4)
		wBitCount = 4;
    else if (iBits <= 8)
		wBitCount = 8;
    else if (iBits <= 24)
		wBitCount = 24;
    else
		wBitCount = iBits;
		    
	DWORD   dwPaletteSize=0;	//调色板大小, 位图中像素字节大小 
    if (wBitCount <= 8)		
		dwPaletteSize = (1 << wBitCount) *	sizeof(RGBQUAD);	
	

	BITMAP  bm;        //位图属性结构
    ::GetObject(hBitmap, sizeof(bm), (LPSTR)&bm);  

    
	BITMAPINFOHEADER   bi,bi1;       //位图信息头结构     
	bi.biSize            = sizeof(BITMAPINFOHEADER);  
    bi.biWidth           = bm.bmWidth;
    bi.biHeight          = bm.bmHeight;
    bi.biPlanes          = 1;
    bi.biBitCount        = wBitCount;
    bi.biCompression     = BI_RGB; //BI_RGB表示位图没有压缩
    bi.biSizeImage       = 0;
    bi.biXPelsPerMeter   = 0;
    bi.biYPelsPerMeter   = 0;
    bi.biClrUsed         = 0;
    bi.biClrImportant    = 0;
	bi1=bi;
	bi1.biBitCount=24;
	
    DWORD dwBmBitsSize = ((bm.bmWidth * wBitCount+31)/32) * 4 * bm.bmHeight;    
    HANDLE hDib  = ::GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));  //为位图内容分配内存
    LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
    *lpbi = bi;
	
    HANDLE hPal = ::GetStockObject(DEFAULT_PALETTE);  // 处理调色板 
	HANDLE  hOldPal=NULL; 
    if (hPal)
    {
		hDC = ::GetDC(NULL);
		hOldPal = SelectPalette(hDC,(HPALETTE)hPal, FALSE);
		RealizePalette(hDC);
    }
	int nOutputBytes = 0;
   
    ::GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);// 获取该调色板下新的像素值
    if (hOldPal)//恢复调色板
    {
		SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
		RealizePalette(hDC);
		::ReleaseDC(NULL, hDC);
    }
   
	BITMAPFILEHEADER   bmfHdr; //位图文件头结构     
	bmfHdr.bfType = 0x4D42;  // "BM"  	// 设置位图文件头
	DWORD dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;  
	bmfHdr.bfSize = dwDIBSize;
	bmfHdr.bfReserved1 = 0;
	bmfHdr.bfReserved2 = 0;
	bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
	
	HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);//创建位图文件   
	DWORD dwWritten;
	WriteFile(hFile, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);	// 写入位图文件头
	WriteFile(hFile, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);// 写入位图文件其余内容


	GlobalUnlock(hDib);   //清除   
	GlobalFree(hDib);
	CloseHandle(hFile); 
   

}


void CSreenClientDlg::initDrawSreen()
{
    m_width=m_pBIH->biWidth;;
	m_height=m_pBIH->biHeight;

	scrylm=m_height-cheight;
	if(scrylm<0)
		scrylm=0;
    scrxlm=m_width-cwidth;
	if(scrxlm<0)
		scrxlm=0;

//	scrx=0;
//	scry=0;

	m_vbar.SetScrollRange(0,scrylm,TRUE);
	m_vbar.SetScrollPos(scry,TRUE);
	m_hbar.SetScrollRange(0,scrxlm,TRUE);
	m_hbar.SetScrollPos(scrx,TRUE);
	UpdateData(FALSE);
	capflag=1;
	drawSreen();

}

void CSreenClientDlg::initDrawParam()
{
	CRect rect;
	GetClientRect(&rect);
    int w=rect.Width();
	int h=rect.Height();
	CRect rect1,rect2;
    GetDlgItem(IDC_SCROLLBAR1)->GetClientRect(&rect1);
    GetDlgItem(IDC_SCROLLBAR2)->GetClientRect(&rect2);
     cwidth=w-rect1.Width()-15;
	cheight=h-rect2.Height()-90;
//	 cwidth=655-15;
//	 cheight=570-90;
	scrx=0;
	scry=0;
	scrylm=1000;
    scrxlm=1000;
	m_vbar.SetScrollRange(0,scrylm,TRUE);
	m_vbar.SetScrollPos(0,TRUE);
	m_hbar.SetScrollRange(0,scrxlm,TRUE);
	m_hbar.SetScrollPos(0,TRUE);
	UpdateData(FALSE);

}

void CSreenClientDlg::drawSreen()
{
	if(m_pBIH==NULL||m_pDibBits==NULL)
		return;
    if(capflag==0)
		return;
	 CDC *pdc=GetDC();
	// Use StretchDIBits to draw the Dib.
	 StretchDIBits( pdc->m_hDC, 0, 75,
		cwidth, cheight,
		scrx, scry,
		cwidth, cheight,
		m_pDibBits,
		(BITMAPINFO *)m_pBIH,
		BI_RGB, SRCCOPY );
	 ReleaseDC(pdc);

	
}

void CSreenClientDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	    int nPos1=m_vbar.GetScrollPos();
		if(nSBCode==SB_LINEDOWN)
		{
			scry=scry+10;
			if(scry>scrylm)
				scry=scrylm;
			nPos1=scry;
			drawSreen();
			 
		}
		if(nSBCode==SB_LINEUP)
		{
			scry=scry-10;
			if(scry<0)
				scry=0;
			nPos1=scry;
			drawSreen();
		
		}
		if(nSBCode==SB_THUMBTRACK)
		{
			scry=nPos;
			nPos1=nPos;
			if(nPos1>scrylm)
                nPos1=scrylm;
			if(scry<0)
				scry=0;
			if(scry>scrylm)
				scry=scrylm;
			nPos1=scry;
			drawSreen();
			
		}
         m_vbar.SetScrollPos(nPos1);

	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CSreenClientDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	int nPos1=m_hbar.GetScrollPos();
		if(nSBCode==SB_LINERIGHT)
		{
			scrx=scrx+10;
			if(scrx>scrxlm)
				scrx=scrxlm;
		     nPos1=scrx;
			 drawSreen();
		}
		if(nSBCode==SB_LINELEFT)
		{
			scrx=scrx-10;
			if(scrx<0)
				scrx=0;
			 nPos1=scrx;
			 drawSreen();
		}
		if(nSBCode==SB_THUMBTRACK)
		{
			scrx=nPos;
			nPos1=nPos;
			if(scrx<0)
				scrx=0;
			if(scrx>scrxlm)
				scrx=scrxlm;
			 nPos1=scrx;
			drawSreen();
		
		}
		m_hbar.SetScrollPos(nPos1,TRUE);

	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}


void CSreenClientDlg::OnChangeEditPort() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	
}

void CSreenClientDlg::CapSreen()
{
	HWND hWnd =::GetActiveWindow();
	/*::GetTopWindow(NULL);*///获得屏幕的HWND.
	HDC hScreenDC = ::GetDC(hWnd);   //获得屏幕的HDC.
	HDC MemDC = ::CreateCompatibleDC(hScreenDC);
	RECT rect; 
	::GetWindowRect(hWnd,&rect);
	SIZE screensize;
	screensize.cx=rect.right-rect.left;
	screensize.cy=rect.bottom-rect.top;
	hBitmap = ::CreateCompatibleBitmap(hScreenDC,screensize.cx,screensize.cy);
	HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);
	::BitBlt(MemDC,0,0,screensize.cx,screensize.cy,hScreenDC,rect.left,rect.top,SRCCOPY);
	::SelectObject(MemDC,hOldBMP);
	::DeleteObject(MemDC);
	::ReleaseDC(hWnd,hScreenDC);
}











⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -