imageobjectdlg.cpp

来自「实时视频捕获」· C++ 代码 · 共 1,641 行 · 第 1/4 页

CPP
1,641
字号
		}
	}
	Invalidate();
}

void CImageObjectDlg::OnCbnSelchangeComboSelectRegion()
{
	// TODO: Add your control notification handler code here
	int index=m_SelectDetectRegion.GetCurSel();
	CString str;
	str.Format(_T("%d"),m_SysSetPara.dtr[index].region.Height());
	this->m_SetDetectRegionHeight.SetWindowText(str);
	str.Format(_T("%d"),m_SysSetPara.dtr[index].region.Width());
	this->m_SetDetectRegionWidth.SetWindowText(str);
	str.Format(_T("%d"),m_SysSetPara.dtr[index].threshold);
	this->m_SetDetectThreshold.SetWindowText(str);
	m_iCurrentDetectRegionID=index;
	this->Invalidate();
}

void CImageObjectDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: Add your message handler code here and/or call default
	int pos;
	HRESULT hr;
	VIDEOPROPERTYRANGE vpr;
	if(pScrollBar->m_hWnd == m_ImageContrastSlider.m_hWnd)
	{
		pos = m_ImageContrastSlider.GetPos();
		DSStream_SetVideoPropertyValue(m_CardID, VideoProperty_Brightness, pos*100);
		hr = DSStream_GetVideoPropertyValue(m_CardID, VideoProperty_Brightness, &vpr);
		m_SysSetPara.image_contrast=pos;
		
	}else if(pScrollBar->m_hWnd == m_ImageLightSlider.m_hWnd)
	{
		pos = m_ImageLightSlider.GetPos();
		DSStream_SetVideoPropertyValue(m_CardID, VideoProperty_Brightness, pos*100);
		hr = DSStream_GetVideoPropertyValue(m_CardID, VideoProperty_Brightness, &vpr);
		m_SysSetPara.image_light=pos;
	}
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CImageObjectDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
//	this->m_ShowImage.OnLButtonDown(nFlags, point);
/*	CRect	 rectImage;
	m_ShowImage.GetWindowRect(rectImage);
	CRect reDetectRegionOnScreen;
	CPoint mypoint(0,0);
	m_ShowImage.ClientToScreen(&mypoint);
	this->ScreenToClient(&mypoint);
*/
	
	
	for(int i=0;i<m_SysSetPara.detect_num;i++)
	{
		CPoint convertP=point;
		ClientToScreen(&convertP);
		m_ShowImage.ScreenToClient(&convertP);
		if(DetectRegion[i].PtInRect(convertP))	
		{
			m_iCurrentDetectRegionID=i;
			if(m_SetEnable)
			{
				m_SelectDetectRegion.SetCurSel(i);
				CString str;
				m_SelectDetectRegion.SetCurSel(m_iCurrentDetectRegionID);
				str.Format(_T("%d"),m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.Height());
				m_SetDetectRegionHeight.SetWindowText(str);
				str.Format(_T("%d"),m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.Width());
				m_SetDetectRegionWidth.SetWindowText(str);
				str.Format(_T("%d"),m_SysSetPara.dtr[m_iCurrentDetectRegionID].threshold);
				m_SetDetectThreshold.SetWindowText(str);
				
				long l,t,r,b;
				l=convertP.x;
				t=convertP.y;
				r=convertP.x+DetectRegion[i].Width();
				b=convertP.y+DetectRegion[i].Height();
				DetectRegion[m_iCurrentDetectRegionID]=CRect(l,t,r,b);

				m_StartPoint=convertP;
				m_LasterPoint=convertP;
				m_RegionPosiAdjust=TRUE;
			}
			this->Invalidate();
		}
	}
	/*

	CRect rtRegion=m_SysSetPara.dtr[i].region;
			m_ShowImage.ClientToScreen(rtRegion);
			this->ScreenToClient(rtRegion);
			DetectRegion[i]=rtRegion;
	if(!m_bufferVideo)
	{
		m_bufferVideo=new BYTE[100];
	}
	if(m_SetEnable)
	{
		if(rectImage.PtInRect(point))
		{
			if(DetectRegion[m_iCurrentDetectRegionID].PtInRect(point))
			{
				m_RegionPosiAdjust=TRUE;
				SetCapture();
				m_StartPoint=point;
			}
		}
	}else
	{
		if(rectImage.PtInRect(point))
		{
			for(int i=0;i<m_SysSetPara.detect_num;i++)
			{
				if(DetectRegion[i].PtInRect(point))
				{
					m_iCurrentDetectRegionID=i;
				}
			}
		}
	}
	*/
	CDialog::OnLButtonDown(nFlags, point);
}
void CImageObjectDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	if(m_SetEnable)
	{
		if(m_RegionPosiAdjust)
		{
			CPoint convertP=point;
			ClientToScreen(&convertP);
			m_ShowImage.ScreenToClient(&convertP);

			CRect region;
			m_ShowImage.GetWindowRect(region);
			m_ShowImage.ScreenToClient(region);

			long l,t,r,b;
			l=0;
			t=0;
			r=region.Width()-DetectRegion[m_iCurrentDetectRegionID].Width();
			b=region.Height()-DetectRegion[m_iCurrentDetectRegionID].Height();
			region=CRect(l,t,r,b);
			if(region.PtInRect(convertP))
			{
				DetectRegion[m_iCurrentDetectRegionID].MoveToXY(convertP);
				m_SysSetPara.dtr[m_iCurrentDetectRegionID].region=DetectRegion[m_iCurrentDetectRegionID];
				m_RegionPosiAdjust=FALSE;

			}else
			{
				m_RegionPosiAdjust=FALSE;
				DetectRegion[m_iCurrentDetectRegionID]=m_SysSetPara.dtr[m_iCurrentDetectRegionID].region;
			}
			this->Invalidate();
		}
	}
	CDialog::OnLButtonUp(nFlags, point);
}

void CImageObjectDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	/*	CRect	 rectImage;
	m_ShowImage.GetWindowRect(rectImage);
	CRect reDetectRegionOnScreen;
	CPoint mypoint(0,0);
	m_ShowImage.ClientToScreen(&mypoint);
	this->ScreenToClient(&mypoint);
*/
	if(m_SetEnable)
	{
		
		if(m_RegionPosiAdjust)
		{
			CPoint convertP=point;
			ClientToScreen(&convertP);
			m_ShowImage.ScreenToClient(&convertP);

			CRect region;
			m_ShowImage.GetWindowRect(region);
			m_ShowImage.ScreenToClient(region);

			long l,t,r,b;
			l=0;
			t=0;
			r=region.Width()-DetectRegion[m_iCurrentDetectRegionID].Width();
			b=region.Height()-DetectRegion[m_iCurrentDetectRegionID].Height();
			region=CRect(l,t,r,b);
			if(region.PtInRect(convertP))
			{
				DetectRegion[m_iCurrentDetectRegionID].MoveToXY(convertP);
			}else
			{
				m_RegionPosiAdjust=FALSE;
				DetectRegion[m_iCurrentDetectRegionID]=m_SysSetPara.dtr[m_iCurrentDetectRegionID].region;
			}
			this->Invalidate();
		}
	}
	CDialog::OnMouseMove(nFlags, point);
}
void CImageObjectDlg::RectImageToDlg(CRect *lpSource,CRect *lpResult)
{
//	int value;
	double scale;
	CRect reShow;
	m_ShowImage.GetWindowRect(reShow);
	scale=lpSource->top/IMAGE_HEIGHT;
	lpResult->top=(long)(reShow.top+reShow.Height()*scale);
	lpResult->bottom=(long)(reShow.bottom+reShow.Height()*scale);
	scale=lpSource->left/IMAGE_WIDTH;
	lpResult->left=(long)(reShow.left+reShow.Width()*scale);
	lpResult->right=(long)(reShow.right+reShow.Width()*scale);
}
void CImageObjectDlg::RectDlgToImage(CRect *lpSource,CRect *lpResult)
{
//	int value;
	double scale;
	CRect reShow;
	m_ShowImage.GetWindowRect(reShow);
	scale=lpSource->top/IMAGE_HEIGHT;
	lpResult->top=(long)(reShow.top+reShow.Height()*scale);
	lpResult->bottom=(long)(reShow.bottom+reShow.Height()*scale);
	scale=lpSource->left/IMAGE_WIDTH;
	lpResult->left=(long)(reShow.left+reShow.Width()*scale);
	lpResult->right=(long)(reShow.right+reShow.Width()*scale);
}

void CImageObjectDlg::OnEnKillfocusRe2RegionHeight()
{
	// TODO: Add your control notification handler code here
	int end=m_SetDetectRegionHeight.GetTextLength();
	CString str;
	
	m_SetDetectRegionHeight.GetTextRange(0,end,str);
	char buffer[20];
	for(int i=0;i<end;i++)
	{
		buffer[i]=((BYTE*)str.GetBuffer())[i];
	}
	int h=atoi(buffer);
	if((h<MAX_REGION_HEIGHT)&&(h>5))
	{
		m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.bottom=m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.top+h;
		this->DetectRegion[m_iCurrentDetectRegionID].bottom=DetectRegion[m_iCurrentDetectRegionID].top+h;
		this->Invalidate();
	}else
	{
		m_SetDetectRegionHeight.Clear();
	}
}

void CImageObjectDlg::OnEnKillfocusRe2RegionWidth()
{
	// TODO: Add your control notification handler code here
	int end=m_SetDetectRegionWidth.GetTextLength();
	CString str;
	m_SetDetectRegionWidth.GetTextRange(0,end,str);
	char buffer[20];
	for(int i=0;i<end;i++)
	{
		buffer[i]=((BYTE*)str.GetBuffer())[i];
	}
	int w=atoi(buffer);
	if((w<MAX_REGION_WIDTH)&&(w>5))
	{
		m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.right=m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.left +w;
		this->DetectRegion[m_iCurrentDetectRegionID].right=DetectRegion[m_iCurrentDetectRegionID].left+w;
		this->Invalidate();
	}else
	{
		m_SetDetectRegionWidth.Clear();
	}
}

void CImageObjectDlg::OnEnKillfocusRe2RegionThreshold()
{
	// TODO: Add your control notification handler code here
	int end=m_SetDetectThreshold.GetTextLength();
	CString str;
	m_SetDetectThreshold.GetTextRange(0,end,str);
	int w=_ttoi(str);
	if((w<250)&&(w>30))
	{
		m_SysSetPara.dtr[m_iCurrentDetectRegionID].threshold=w;
	}else
	{
		m_SetDetectThreshold.Clear();
	}
}

void CImageObjectDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent==GET_IMAGE_EVENT)
	{
		long k=1244160;	
		HRESULT hr;
		BYTE *buffer=new BYTE[1244200];
		if(!m_lpShowVideoWnd->GetDIBImage(buffer))
		{
			long size;
			hr = DSStream_GetCurrentDib(m_CardID,NULL,&size);
			if(SUCCEEDED(hr)&&(size=1244200))
			{
				hr =DSStream_GetCurrentDib(m_CardID,(BYTE*)buffer,&size);
				if(FAILED(hr)&&(size!=1244200))
				{
					return ;
				}
			}else
			{
				return;
			}
		}
//		memcpy(m_lpbmiVideo,buffer,40);
		m_bufferVideo=(BYTE*)&buffer[40];
	
		CClientDC dc(FromHandle(m_ShowImage.m_hWnd ));//this
		SetDIBits(dc.m_hDC,(HBITMAP)m_bmpMain.m_hObject,0,576,m_bufferVideo,m_lpbmiVideo,DIB_RGB_COLORS);
		m_bufferVideo=new BYTE[1244200];
		m_bmpMain.GetBitmapBits(1244160,(void*)m_bufferVideo);
		
		GetRegionImageData();
		for(int i=0;i<m_SysSetPara.detect_num;i++)
		{
			RegionImageProcess(i);
		}
		DisplayResult();
		delete []m_bufferVideo;
		delete []buffer;
	}
	CDialog::OnTimer(nIDEvent);

}
/*
		long k=1244160;	
		HRESULT hr;
		BYTE *buffer=new BYTE[1244200];
		m_lpShowVideoWnd->GetDIBImage(buffer);


		memcpy(m_lpbmiVideo,buffer,40);
//		memcpy(m_bufferVideo,(buffer+40),1244160);
		m_bufferVideo=(BYTE*)&buffer[40];
		BOOL Create;
		BOOL ret;
		CDC memDC;
		CClientDC dc(FromHandle(m_ShowImage.m_hWnd ));//this
		Create=memDC.CreateCompatibleDC( &dc);
		CBitmap temp;
		

//		temp.CreateBitmap(IMAGE_WIDTH,IMAGE_HEIGHT,1,24,NULL);//(void*)m_bufferVideo
//		Create=m_bmpMain.DeleteObject();
//		Create=m_bmpMain.CreateBitmap(IMAGE_WIDTH,IMAGE_HEIGHT,1,24,(void*)m_bufferVideo);//(void*)m_bufferVideo

//		long numbyte=m_bmpMain.SetBitmapBits(m_lpbmiVideo->bmiHeader.biSizeImage,m_bufferVideo);
/*		HBITMAP hnewbmp=CreateDIBSection(dc.m_hDC ,                 // handle to DC
										m_lpbmiVideo,  // bitmap data
										 DIB_RGB_COLORS,             // data type indicator
										0,          // bit values
										NULL,         // handle to file mapping object
										0           // offset to bitmap bit values
										);
		temp.DeleteObject();
		ret=temp.Attach((HGDIOBJ)hnewbmp);
*/
//		SetDIBits(dc.m_hDC,(HBITMAP)m_bmpMain.m_hObject,0,576,m_bufferVideo,m_lpbmiVideo,DIB_RGB_COLORS);
//		k=temp.SetBitmapBits(1244160,m_bufferVideo);
//		CBitmap* pbmpOld = memDC.SelectObject(&temp  );//CBitmap::FromHandle((HBITMAP)temp.m_hObject)
//		memDC.SelectObject( &temp);//CBitmap::FromHandle((HBITMAP)m_bmpMain.m_hObject) 
//		Create=dc.StretchBlt(0,0,IMAGE_WIDTH,IMAGE_HEIGHT,&memDC,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,SRCCOPY);
//		memDC.SelectObject( &m_bmpMain);//CBitmap::FromHandle((HBITMAP)m_bmpMain.m_hObject) 
//		Create=dc.StretchBlt(0,0,IMAGE_WIDTH,IMAGE_HEIGHT,&memDC,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,SRCCOPY);
//		CClientDC dc(this);//FromHandle(m_ShowImage.m_hWnd)m_bufferVideo
//		k=::StretchDIBits(dc.m_hDC,0 ,0 ,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,m_lpbmiVideo->bmiHeader.biWidth,m_lpbmiVideo->bmiHeader.biHeight,(VOID *)m_bufferVideo,m_lpbmiVideo,DIB_RGB_COLORS,SRCCOPY);
//		ImageProcess(0,0);
//		GetRegionImageData();
//		for(int i=0;i<m_SysSetPara.detect_num;i++)
//		{
//			RegionImageProcess(i);
//		}
		
//		DisplayResult();
//		delete []buffer;




void CImageObjectDlg::OnBnClickedButtonDebug()
{
// TODO: Add your control notification handler code here
//	DSStream_DisplayPropertyDialogs( m_CardID, PropertyDlg_VideoPreviewPin, this->m_hWnd,NULL);
	long size;
	HRESULT hr = DSStream_GetCurrentDib(m_CardID,NULL,&size);
//	hr =DSStream_GetCurrentDib(0,NULL,&size);
	if(SUCCEEDED(hr)&&(size=1244200))
	{
//		::AfxMessageBox("snap ok");
	}
}

⌨️ 快捷键说明

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