dlggetpos.cpp

来自「简单的远程控制工具,分为服务器与客户斋,让你了解socket编程的知识.」· C++ 代码 · 共 1,263 行 · 第 1/3 页

CPP
1,263
字号
// DlgGetPos.cpp : implementation file
//
#include "resource.H"

#include "stdafx.h"
#include "Windowsx.h"
#include "math.H"
#include "key.h"

#include "WzdThread.H"
#include "Ctrl_Clnt9.h"
#include "DlgGetPos.h"
#include "GetImage.h"
#include "SendMsg.H"
#include "..\\CtrlSrvr2\\jpegfile.H"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IDC_GET_SCREEN WM_USER + 300
/////////////////////////////////////////////////////////////////////////////
// CDlgGetPos dialog


CDlgGetPos::CDlgGetPos(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgGetPos::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgGetPos)
	m_nEdtSecond = 1000;
	m_bChkContinue = FALSE;
	m_bChkControl = FALSE;
	m_bFullScreen = FALSE;
	m_CTRL = FALSE;
	m_SHIFT = FALSE;
	m_WIN = FALSE;
	m_ALT = FALSE;
	m_sNote = _T("");
	m_nWidth = 0;
	m_nTop = 0;
	m_nHeight = 0;
	m_nLeft = 0;
	m_nCellSize = 0;
	m_bLock = FALSE;
	//}}AFX_DATA_INIT
	m_pDlgFullScreen = NULL;
	m_pWzdThread = NULL;
	m_ptBmpDraw = CPoint (0,0);
    m_hMemDC = NULL;
	m_lpImageData = NULL;
	m_nBmpTop = 0;
	m_nBmpLeft = 0;
    m_lFrame = 0;
 m_nRdoCut = 0;
 m_bImageLocked = false;

}

CDlgGetPos::Create (CCtrl_Clnt9Doc *pDoc)
{
	m_pDoc = pDoc;
	g_pDoc = (CDocument *) pDoc;

}

void CDlgGetPos::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgGetPos)
	DDX_Control(pDX, IDC_QUALITY, m_SliderQ);
	DDX_Control(pDX, IDC_HSCROLLBAR, m_hScrollBar);
	DDX_Control(pDX, IDC_VSCROLLBAR, m_vScrollBar);
	DDX_Control(pDX, IDC_STATIC_AREA, m_oStaArea);
	DDX_Control(pDX, IDC_COMBO_COLORS, m_oCboColors);
	DDX_Control(pDX, IDC_COMBO_AREA, m_oCboArea);
	DDX_Control(pDX, IDC_COMBO_COMPRESS, m_oCboCompress);
	DDX_Text(pDX, IDC_EDIT_SECOND, m_nEdtSecond);
	DDX_Check(pDX, IDC_CHECK_CONTINUE, m_bChkContinue);
	DDX_Check(pDX, IDC_CHECK_CONTROL, m_bChkControl);
	DDX_Check(pDX, IDC_CHECK_CTRL, m_CTRL);
	DDX_Check(pDX, IDC_CHECK_SHIFT, m_SHIFT);
	DDX_Check(pDX, IDC_CHECK_WIN, m_WIN);
	DDX_Check(pDX, IDC_CHECK_ALT, m_ALT);
	DDX_Text(pDX, IDC_NOTE, m_sNote);
	DDX_Text(pDX, IDC_EDIT_WIDTH, m_nWidth);
	DDX_Text(pDX, IDC_EDIT_TOP, m_nTop);
	DDX_Text(pDX, IDC_EDIT_HEIGHT, m_nHeight);
	DDX_Text(pDX, IDC_EDIT_LEFT, m_nLeft);
	DDX_Text(pDX, IDC_EDIT_CELLSIZE, m_nCellSize);
	DDX_Check(pDX, IDC_CHECK_LOCK, m_bLock);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgGetPos, CDialog)
	//{{AFX_MSG_MAP(CDlgGetPos)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_PAINT()
	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_SECOND, OnDeltaposSpinSecond)
	ON_BN_CLICKED(IDC_BUTTON_FULLSCREEN, OnButtonFullscreen)
	ON_BN_CLICKED(IDC_CHECK_CONTINUE, OnCheckContinue)
	ON_BN_CLICKED(IDC_RADIO_CUT, OnRadioCut)
	ON_BN_CLICKED(IDC_RADIO_IMAGE, OnRadioImage)
	ON_EN_CHANGE(IDC_EDIT_SECOND, OnChangeEditSecond)
	ON_BN_CLICKED(IDC_CHECK_CONTROL, OnCheckControl)
	ON_EN_CHANGE(IDC_EDIT_CELLSIZE, OnChangeEditCellsize)
	ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend)
	ON_BN_CLICKED(IDC_CHECK_WIN, OnCheckWin)
	ON_BN_CLICKED(IDC_CHECK_CTRL, OnCheckCtrl)
	ON_BN_CLICKED(IDC_CHECK_ALT, OnCheckAlt)
	ON_BN_CLICKED(IDC_CHECK_SHIFT, OnCheckShift)
	ON_BN_CLICKED(IDC_BUTTON_CAD, OnButtonCad)
	ON_CBN_SELENDOK(IDC_COMBO_COLORS, OnSelendokComboColors)
	ON_WM_RBUTTONDBLCLK()
	ON_WM_LBUTTONDBLCLK()
	ON_CBN_SELENDOK(IDC_COMBO_AREA, OnSelendokComboArea)
	ON_CBN_SELENDOK(IDC_COMBO_COMPRESS, OnSelendokComboCompress)
	ON_WM_VSCROLL()
	ON_WM_HSCROLL()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	ON_BN_CLICKED(IDC_CHECK_LOCK, OnCheckLock)
	ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_QUALITY, OnReleasedcaptureQuality)
	ON_BN_CLICKED(IDC_BUTTON_RECONNECT, OnButtonReconnect)
	ON_MESSAGE(IDC_GET_SCREEN, Get_Screen_Data)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgGetPos message handlers

void CDlgGetPos::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CRect rcArea;

	UpdateData (TRUE);
	  CWnd* pWnd = ChildWindowFromPoint(point);
	  if (pWnd && pWnd->GetSafeHwnd() == m_oStaArea.GetSafeHwnd())
	  {
	  if (!m_bChkControl) 
	  {
		m_oStaArea.GetWindowRect (&rcArea);
		m_ptStart = point;
		ClientToScreen (&point);
		point.x = point.x - rcArea.left+m_hScrollBar.GetScrollPos();
		point.y = point.y - rcArea.top+m_vScrollBar.GetScrollPos();
		SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));
		ClipCursor(rcArea);
		SetCapture();
		m_nLeft = (int)point.x ;
		m_nTop = (int)point.y;
		m_bIsCapturing = TRUE;
		UpdateData (FALSE);
	  }
	  else
	  {
		fnSendPos(CMD_MOUSE_HOOK, MOUSEEVENTF_LEFTDOWN,
			point);
	  }
	  }
	CDialog::OnLButtonDown(nFlags, point);
}

void CDlgGetPos::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	UpdateData (TRUE);
	if (!m_bChkControl && m_bIsCapturing)
	{
		CRect rcArea;
		CClientDC dc(this); // device context for painting
		m_oStaArea.GetWindowRect (&rcArea);
			m_ptEnd = point;
			UpdateData (TRUE);
	     	ClientToScreen (&point);
		    point.x -= rcArea.left;
		    point.y -= rcArea.top;
		    m_nWidth = (int)point.x +m_hScrollBar.GetScrollPos();
	     	m_nHeight = (int)point.y +m_vScrollBar.GetScrollPos();
			UpdateData (FALSE);

			ScreenToClient (&rcArea);
	}
	
	CDialog::OnMouseMove(nFlags, point);
}

void CDlgGetPos::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	UpdateData (TRUE);
 	CRect rcArea;
   CWnd* pWnd = ChildWindowFromPoint(point);
	if (!m_bChkControl && m_bIsCapturing)
	{
		ReleaseCapture();
		ClipCursor(NULL);
		m_bIsCapturing = FALSE;
		Set_BackGroud_Image ();
        m_pDoc->m_rcArea =CRect(m_nLeft,m_nTop,
			          m_nWidth,m_nHeight);
		SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
	}
	else
	{
/*		m_oStaArea.GetWindowRect (&rcArea);
		m_ptStart = point;
		ClientToScreen (&point);
		point.x = point.x - rcArea.left+m_hScrollBar.GetScrollPos();
		point.y = point.y -  rcArea.top+m_vScrollBar.GetScrollPos();
		m_pDoc->m_dwHookFlags = MOUSEEVENTF_LEFTUP;// |  \
//			         MOUSEEVENTF_ABSOLUTE;
		m_pDoc->m_dwHookParam1 = point.x;
		m_pDoc->m_dwHookParam2 = point.y;
*/
		fnSendPos (CMD_MOUSE_HOOK, MOUSEEVENTF_LEFTUP,
			point);
	}
	
	CDialog::OnLButtonUp(nFlags, point);
}

BOOL CDlgGetPos::OnInitDialog() 
{
	CDialog::OnInitDialog();

//设置ScrollBar
	CRect clientRect;
		//GetClientRect(clientRect);
	m_oStaArea.GetClientRect (&clientRect);
//	clientRect.DeflateRect (2,2);
    if (clientRect.Width() >= m_pDoc->m_SrvrArea.Width())
	    m_hScrollBar.ShowScrollBar(FALSE);
    else
	    m_hScrollBar.SetScrollRange(0,m_pDoc->m_SrvrArea.Width() \
		   - clientRect.Width());
    if (clientRect.Height() >= m_pDoc->m_SrvrArea.Height())
	    m_vScrollBar.ShowScrollBar(FALSE);
    else
	    m_vScrollBar.SetScrollRange(0,m_pDoc->m_SrvrArea.Height() \
		   - clientRect.Height());

	
	
	// TODO: Add extra initialization here
	m_bIsCapturing = FALSE;
	CRect rc;
	m_oStaArea.GetWindowRect (&rc);
//	m_dFactor = m_nRmtWidth / (double)rc.Width ();
    
	m_oCboArea.AddString("全屏");
	m_oCboArea.AddString("当前窗口");
	m_oCboArea.AddString("指定区域");
    m_oCboArea.SetCurSel(0);
	m_oCboCompress.AddString("不压缩");
	m_oCboCompress.AddString("Huffman");
	m_oCboCompress.AddString("JPEG");
	m_oCboCompress.AddString("动态JPEG");
    m_oCboCompress.SetCurSel(3);
    m_pDoc->m_nCompress = 3;

	m_oCboColors.AddString ("2");
	m_oCboColors.AddString ("4");
	m_oCboColors.AddString ("16");
	m_oCboColors.AddString ("256");
	m_oCboColors.AddString ("真彩");
	switch(m_pDoc->m_nBits)
	{
	case 1: m_oCboColors.SetCurSel (0);
		    break;
	case 2: m_oCboColors.SetCurSel (1);
		    break;
	case 4: m_oCboColors.SetCurSel (2);
		    break;
	case 8: m_oCboColors.SetCurSel (3);
		    break;
    default: m_oCboColors.SetCurSel (4);
		    break;
	}
    OnSelendokComboColors();
	m_pDoc->m_nJpegQ = 80;
	m_SliderQ.SetPos(80);
//	m_pDoc->m_nBits = 0;
	m_pDoc->m_nArea = 0;
	m_nCellSize = 1000;
	m_pDoc->m_nCellSize = m_nCellSize;

	m_bChkContinue = FALSE;
    m_sNote.Format("%d-%d  %d Bits", m_pDoc->m_SrvrArea.right,
		 m_pDoc->m_SrvrArea.bottom, m_pDoc->m_nBits);
	m_nEdtSecond = 10;
//    pDoc->m_SrvrArea = CRect (0, 0, SendMsg.rcArea.right, SendMsg.rcArea.bottom);
    m_pDoc->m_rcArea = m_pDoc->m_SrvrArea;
    m_pDoc->m_bDlgScreen = TRUE;
	m_nBmpWidth = m_pDoc->m_rcArea.Width();
	m_nBmpHeight =m_pDoc->m_rcArea.Height();
	UpdateData (FALSE);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDlgGetPos::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	Set_BackGroud_Image ();
	// Do not call CDialog::OnPaint() for painting messages
}

void CDlgGetPos::OnDeltaposSpinSecond(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
	// TODO: Add your control notification handler code here
	if (pNMUpDown->iDelta == 1)
		m_nEdtSecond -= 50;
	if (pNMUpDown->iDelta == -1)
		m_nEdtSecond += 50;
	if (m_nEdtSecond < 0)
      m_nEdtSecond = 0;
	UpdateData (FALSE);
	*pResult = 0;
}

void CDlgGetPos::Set_BackGroud_Image ()
{
//void CMfcAppView::DrawBMP()
//{
	// if we don't have an image, get out of here
	if (m_lpImageData==NULL) return;

//	CDC *theDC = GetDC();
	CDC *theDC = m_oStaArea.GetWindowDC ();

	if (theDC!=NULL) {


		CRect clientRect;
		//GetClientRect(clientRect);
	    m_oStaArea.GetClientRect (&clientRect);
//		clientRect.DeflateRect (2,2);

		// Center It
//DEL		int left = max(clientRect.left, ((clientRect.Width() - (int)m_nBmpWidth) / 2));
//DEL		int top = max(clientRect.top, ((clientRect.Height() - (int)m_nBmpHeight) / 2));
        int left = m_nBmpLeft -m_hScrollBar.GetScrollPos();
        int top =  m_nBmpTop -m_vScrollBar.GetScrollPos();


		// a 24-bit DIB is DWORD-aligned, vertically flipped and 
		// has Red and Blue bytes swapped. we already did the 
		// RGB->BGR and the flip when we read the images, now do
		// the DWORD-align

		BYTE *tmp = m_lpImageData;
/*		BYTE *tmp;
		// DWORD-align for display
		UINT m_widthDW;
		tmp = JpegFile::MakeDwordAlignedBuf((BYTE *)m_lpImageData,
										 m_nBmpWidth,
										 m_nBmpHeight,
										 &m_widthDW);
        if (tmp == NULL) return;
*/		// set up a DIB 
		BITMAPINFOHEADER bmiHeader;
		bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
		bmiHeader.biWidth = m_nBmpWidth;
		bmiHeader.biHeight = m_nBmpHeight;
		bmiHeader.biPlanes = 1;
		bmiHeader.biBitCount = 24;
		bmiHeader.biCompression = BI_RGB;
		bmiHeader.biSizeImage = 0;
		bmiHeader.biXPelsPerMeter = 0;
		bmiHeader.biYPelsPerMeter = 0;
		bmiHeader.biClrUsed = 0;
		bmiHeader.biClrImportant = 0;
		// now blast it to the CDC passed in.
		// lines returns the number of lines actually displayed
		int lines = StretchDIBits(theDC->m_hDC,
									left, top,
									bmiHeader.biWidth,
									bmiHeader.biHeight,
									0,0,
									bmiHeader.biWidth,
									bmiHeader.biHeight,
									tmp,
									(LPBITMAPINFO)&bmiHeader,
									DIB_RGB_COLORS,
									SRCCOPY);
        
		ReleaseDC(theDC);
//	}
}

/*	CRect	rc;
	CDC*	pDC;
	int		nLeft = 0, nTop = 0, nWidth, nHeight;

	pDC = m_oStaArea.GetWindowDC ();
	m_oStaArea.GetClientRect (&rc);
	rc.DeflateRect (2,2);
	
//	pDC->FillSolidRect (rc,GetSysColor (COLOR_BACKGROUND)); 
	nLeft = rc.left;
	nTop = rc.top;
	if (m_nBmpWidth <= rc.Width ())
	{
		nWidth = m_nBmpWidth;
		nLeft = (rc.Width()-m_nBmpWidth)/2;
	}
	else
		nWidth = rc.Width ();

	if (m_nBmpHeight <= rc.Height ())
	{
		nHeight = m_nBmpHeight;
		nTop = (rc.Height()-m_nBmpHeight)/2;
	}

⌨️ 快捷键说明

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