📄 sreenclientdlg.cpp
字号:
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 + -