fast/Plugin/Fast/FastView.cpp

399 lines
9.5 KiB
C++
Raw Normal View History

2025-01-20 10:30:01 +08:00
// PictureView.cpp : ʵ<><CAB5><EFBFBD>ļ<EFBFBD>
//
#include "stdafx.h"
#include "resource.h"
#include "FastView.h"
#include "DahuaFisheyeCamera.h"
#include "HikRgdbCamera.h"
//ͼ<><CDBC><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>
enum
{
IMG_SIZE_NORMAL, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD><DFBE>ڻ<EFBFBD>ͼ<EFBFBD><CDBC>Χ<EFBFBD><CEA7>
IMG_SIZE_WIDTH_BEYOND, //<2F><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ȳ<EFBFBD><C8B3><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>Χ
IMG_SIZE_HEIGHT_BEYOND, //<2F><>ͼ<EFBFBD><CDBC><EFBFBD>߶ȳ<DFB6><C8B3><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>Χ
IMG_SIZE_BOTH_BEYOND //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD><DFBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>Χ
};
// CPictureView
IMPLEMENT_DYNAMIC(CFastView, CStatic)
CFastView::CFastView()
{
m_pCameraDlg = NULL;
}
CFastView::~CFastView()
{
}
BEGIN_MESSAGE_MAP(CFastView, CStatic)
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_CTLCOLOR()
ON_WM_RBUTTONUP()
END_MESSAGE_MAP()
// CPictureView <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void CFastView::StartPlay(CString strFile)
{
StopPlay();
m_Image.Destroy();
ShowWindow(SW_SHOW);
if (0 == strFile.GetLength())
return;
m_Image.Load(strFile); //<2F><><EFBFBD><EFBFBD>ͼƬ·<C6AC><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ
DrawPicture();
}
void CFastView::StopPlay()
{
m_Image.Destroy();
UpdateWindow();
ShowWindow(SW_HIDE);
}
void CFastView::CalculateImageRect()
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰͼ<C7B0><CDBC>Ϊ<EFBFBD>գ<EFBFBD><D5A3>򷵻<EFBFBD>
if (m_Image.IsNull())
return;
CRect rectWnd;
GetWindowRect(&rectWnd);
int MemWidth = rectWnd.Width();
int MemHeight = rectWnd.Height();
//m_ImageRect = CRect(0, 0, MemWidth, MemHeight); //ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//return;
//<2F><>ȡͼ<C8A1><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CRect rectImg = CRect(0, 0, m_Image.GetWidth(), m_Image.GetHeight());
int ImgWidth = rectImg.Width();
int ImgHeight = rectImg.Height();
int nImgSizeType; //ͼ<><CDBC><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>
//Ĭ<>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>ͶӰ<CDB6><D3B0><EFBFBD><EFBFBD>
int nGap = 0;
//<2F><>ȡ<EFBFBD><C8A1>ǰͼ<C7B0><CDBC><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>
if ((ImgWidth <= MemWidth - nGap) && (ImgHeight <= MemHeight - nGap))
nImgSizeType = IMG_SIZE_NORMAL;
else if ((ImgWidth>MemWidth - nGap) && (ImgHeight <= MemHeight - nGap))
nImgSizeType = IMG_SIZE_WIDTH_BEYOND;
else if ((ImgWidth <= MemWidth - nGap) && (ImgHeight>MemHeight - nGap))
nImgSizeType = IMG_SIZE_HEIGHT_BEYOND;
else
nImgSizeType = IMG_SIZE_BOTH_BEYOND;
//<2F>Բ<EFBFBD>ͬ<EFBFBD><CDAC>ͼ<EFBFBD><CDBC><EFBFBD>ߴ<DFB4><E7A3AC><EFBFBD><EFBFBD>ͶӰ<CDB6><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
switch (nImgSizeType)
{
float fScaleW, fScaleH; //X<><58>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>
int nW, nH;
//ֻ<>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Χ
case IMG_SIZE_WIDTH_BEYOND:
fScaleW = ((double)MemWidth) / ImgWidth;
nW = MemWidth;
nH = fScaleW*ImgHeight;
m_ImageRect = CRect((MemWidth - nW) / 2 + nGap,
(MemHeight - nH) / 2,
(MemWidth + nW) / 2 - nGap,
(MemHeight + nH) / 2);
break;
//ֻ<>и߳<D0B8><DFB3><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Χ
case IMG_SIZE_HEIGHT_BEYOND:
fScaleH = ((double)MemHeight) / ImgHeight;
nW = fScaleH*ImgWidth;
nH = MemHeight;
m_ImageRect = CRect((MemWidth - nW) / 2,
(MemHeight - nH) / 2 + nGap,
(MemWidth + nW) / 2,
(MemHeight + nH) / 2 - nGap);
break;
//<2F><><EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Χ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Χ<EFBFBD><CEA7>
case IMG_SIZE_BOTH_BEYOND:
case IMG_SIZE_NORMAL:
fScaleW = ((double)MemWidth) / ImgWidth;
fScaleH = ((double)MemHeight) / ImgHeight;
float fScale = min(fScaleW, fScaleH);
nW = fScale*ImgWidth;
nH = fScale*ImgHeight;
m_ImageRect = CRect((MemWidth - nW) / 2 + nGap,
(MemHeight - nH) / 2 + nGap,
(MemWidth + nW) / 2 - nGap,
(MemHeight + nH) / 2 - nGap);
break;
}
}
void CFastView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: <20>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>Ϊ<EFBFBD><CEAA>ͼ<EFBFBD><CDBC>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> CStatic::OnPaint()
if (FALSE == m_Image.IsNull())
{
CDC *pDC = GetDC();//<2F><><EFBFBD><EFBFBD>pictrue<75>ؼ<EFBFBD><D8BC><EFBFBD>DC
//<2F><><EFBFBD><EFBFBD>CIMage<67><65><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SetStretchBltMode(pDC->m_hDC, HALFTONE);
SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
CRect rectWnd = { 0 };
GetWindowRect(&rectWnd);
//<2F>ػ<EFBFBD><D8BB><EFBFBD>ɫ
pDC->FillSolidRect(CRect(0, 0, rectWnd.Width(), rectWnd.Height()), RGB(0, 0, 0));
//m_Image.StretchBlt(pDC->GetSafeHdc(), m_ImageRect, CRect(0, 0, m_Image.GetWidth(), m_Image.GetHeight()));
m_Image.Draw(pDC->m_hDC, m_ImageRect); //<2F><>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>Picture<72>ؼ<EFBFBD><D8BC><EFBFBD>ʾ<EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ReleaseDC(pDC);//<2F>ͷ<EFBFBD>picture<72>ؼ<EFBFBD><D8BC><EFBFBD>DC
}
}
void CFastView::OnSize(UINT nType, int cx, int cy)
{
CStatic::OnSize(nType, cx, cy);
DrawPicture();
// TODO: <20>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
void CFastView::DrawPicture()
{
if (FALSE == m_Image.IsNull())
{
CalculateImageRect();
if (m_ImageRect.Width() <= 0)
return;
CDC *pDC = GetDC();//<2F><><EFBFBD><EFBFBD>pictrue<75>ؼ<EFBFBD><D8BC><EFBFBD>DC
CRect rectWnd;
GetWindowRect(&rectWnd);
//<2F>ػ<EFBFBD><D8BB><EFBFBD>ɫ
//pDC->FillSolidRect(CRect(0, 0, rectWnd.Width(), rectWnd.Height()), RGB(0, 0, 0));
//<2F><><EFBFBD><EFBFBD>CIMage<67><65><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//SetStretchBltMode(pDC->m_hDC, HALFTONE);
//SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
SetStretchBltMode(pDC->m_hDC, COLORONCOLOR);
SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
//dc.SetStretchBltMode
//m_Image.StretchBlt(pDC->GetSafeHdc(), CRect(0, 0, m_Image.GetWidth(), m_Image.GetHeight()), m_ImageRect);
m_Image.Draw(pDC->GetSafeHdc(), m_ImageRect); //<2F><>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>Picture<72>ؼ<EFBFBD><D8BC><EFBFBD>ʾ<EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ReleaseDC(pDC);//<2F>ͷ<EFBFBD>picture<72>ؼ<EFBFBD><D8BC><EFBFBD>DC
}
}
HBRUSH CFastView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CStatic::OnCtlColor(pDC, pWnd, nCtlColor);
CBrush brush;
brush.CreateSolidBrush(RGB(0, 0, 0));
// TODO: <20>ڴ˸<DAB4><CBB8><EFBFBD> DC <20><><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
pDC->SetBkColor(RGB(0, 0, 0));
return (HBRUSH)brush;
// TODO: <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵIJ<CFB5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3>򷵻<EFBFBD><F2B7B5BB><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return hbr;
}
UINT CFastView::CameraThreadFunc(PVOID pv)
{
//ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>Ϊÿ<CEAA><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
ST_THREAD_PARAM *pParam = (ST_THREAD_PARAM *)pv;
CFastView *pThis = (CFastView*)pParam->pParent;
int nIdx = pParam->nIdx;
delete pv;
if (pThis->m_nCameraTyp == HIK_RGBD)
{
pThis->m_pCameraDlg = new CHikRgdbCamera(pThis, nIdx);
pThis->m_pCameraDlg->Create(IDD_DLG_CAM);
pThis->m_pCameraDlg->ShowWindow(SW_HIDE);
}
else if (pThis->m_nCameraTyp == DAHUA_FISHEYE)
{
pThis->m_pCameraDlg = new CDahuaFisheyeCamera(pThis, nIdx, pThis->m_nPlayTyp);
pThis->m_pCameraDlg->Create(IDD_DLG_CAM);
pThis->m_pCameraDlg->ShowWindow(SW_HIDE);
}
/*else if (pThis->m_nCameraTyp == DAHUA_FISHEYE_LIVE)
{
pThis->m_pCameraDlg = new CDahuaFisheyeLiveCamera(pThis, nIdx);
pThis->m_pCameraDlg->Create(IDD_DLG_CAM);
pThis->m_pCameraDlg->ShowWindow(SW_HIDE);
}*/
//The message loop
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
pThis->m_pCameraDlg->DestroyWindow();
delete pThis->m_pCameraDlg;
TRACE(_T("<EFBFBD>ͷŶԻ<EFBFBD><EFBFBD><EFBFBD>"));
return 0;
}
void CFastView::SetCameraInfo(int nIdx, ENUM_CAMERA_TYPE enCameraType, ENUM_PLAY_TYPE enPlayType, String strIp, int nPort)
{
m_nCameraIdx = nIdx;
m_nCameraTyp = enCameraType;
m_nPlayTyp = enPlayType;
ST_THREAD_PARAM *pParam = new ST_THREAD_PARAM;
pParam->nIdx = nIdx;
pParam->pParent = this;
AfxBeginThread(CFastView::CameraThreadFunc, (void*)pParam);
return;
}
void CFastView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ֵ
// TODO: Add your message handler code here and/or call default
CMenu menu;
menu.CreatePopupMenu();
//<2F><><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>Dz˵<C7B2><CBB5><EFBFBD>
menu.AppendMenu(MF_STRING, ID_MRU_SAMPLE, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
//menu.AppendMenu(MF_STRING, WM TEST2, "Test item 2");
//menu.AppendMenu(MF_STRING, WM TEST3, "Test item 3");
//menu.AppendMenu(MF_STRING, WM TEST4, "Test item 4");
//<2F><><EFBFBD>һ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>·<EFBFBD>20<32><30><EFBFBD>صĵط<C4B5><D8B7><EFBFBD>ʾ<EFBFBD>˵<EFBFBD>
POINT tpoint;
tpoint.x = point.x;
tpoint.y = point.y;
ClientToScreen(&tpoint);
menu.TrackPopupMenu(TPM_LEFTALIGN, tpoint.x, tpoint.y + 20, this);
CStatic::OnRButtonDown(nFlags, point);
}
BOOL CFastView::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>
switch (LOWORD(wParam))
{
case ID_MRU_SAMPLE:
{
/*CString strMsg;
strMsg.Format("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ%d<><64><EFBFBD><EFBFBD>", m_nCameraIndex);
AfxMessageBox(strMsg);*/
if (NULL != m_pCameraDlg)
{
::PostMessage(m_pCameraDlg->m_hWnd, WM_CAMERA_SNAP, NULL, NULL);
}
//((CMainFrame*)GetParentFrame())->BeginSample(m_nCameraIndex);
break;
}
default:
break;
}
return CStatic::OnCommand(wParam, lParam);
}
//<2F><><EFBFBD><EFBFBD>1<EFBFBD><31>opencv<63><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
//<2F><><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>Ҫչʾ<D5B9><CABE>Picture Control<6F><6C>ID
void CFastView::DrawMat(cv::Mat& imageMat, int nOffset)
{
/*cv::Mat img;
int nWidth = imageMat.cols * rect.Height() *1.0 / imageMat.rows;
cv::resize(imageMat, img, cv::Size(nWidth, rect.Height()));// <20><><EFBFBD><EFBFBD>Mat<61><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// תһ<D7AA>¸<EFBFBD>ʽ ,<2C><><EFBFBD>ο<EFBFBD><CEBF>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD>,*/
/*switch (imgTmp.channels())
{
case 1:
cv::cvtColor(imgTmp, imgTmp, CV_GRAY2BGRA); // GRAY<41><59>ͨ<EFBFBD><CDA8>
break;
case 3:
cv::cvtColor(imgTmp, imgTmp, CV_BGR2BGRA); // BGR<47><52>ͨ<EFBFBD><CDA8>
break;
default:
break;
}
int pixelBytes = imgTmp.channels() * (imgTmp.depth() + 1); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6>ٸ<EFBFBD><D9B8>ֽ<EFBFBD>
// <20><><EFBFBD><EFBFBD>bitmapinfo(<28><><EFBFBD><EFBFBD>ͷ)
BITMAPINFO bitInfo;
bitInfo.bmiHeader.biBitCount = 8 * pixelBytes;
bitInfo.bmiHeader.biWidth = imgTmp.cols;
bitInfo.bmiHeader.biHeight = -imgTmp.rows;
bitInfo.bmiHeader.biPlanes = 1;
bitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitInfo.bmiHeader.biCompression = BI_RGB;
bitInfo.bmiHeader.biClrImportant = 0;
bitInfo.bmiHeader.biClrUsed = 0;
bitInfo.bmiHeader.biSizeImage = 0;
bitInfo.bmiHeader.biXPelsPerMeter = 0;
bitInfo.bmiHeader.biYPelsPerMeter = 0;
// Mat.data + bitmap<61><70><EFBFBD><EFBFBD>ͷ -> MFC
CDC* pDC = GetDC();
::StretchDIBits(
pDC->GetSafeHdc(),
(rect.Width()-nWidth)/2, 0, nWidth, rect.Height(),
0, 0, nWidth, rect.Height(),
imgTmp.data,
&bitInfo,
DIB_RGB_COLORS,
SRCCOPY
);
ReleaseDC(pDC);*/
CImage image;
image.Create(imageMat.cols, imageMat.rows, 24);
for (int y = 0; y < imageMat.rows; ++y) {
const uchar* src = imageMat.ptr<uchar>(y);
uchar* dst = reinterpret_cast<uchar*>(image.GetBits()) + y * image.GetPitch();
for (int x = 0; x < imageMat.cols; ++x) {
dst[0] = src[0];
dst[1] = src[1];
dst[2] = src[2];
src += 3;
dst += 3;
}
}
HDC hdc = ::GetDC(m_hWnd);
CRect rect;
GetClientRect(&rect); // <20><>ȡ<EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>С
image.Draw(hdc, rect);
image.Destroy();
::ReleaseDC(m_hWnd, hdc);
}