📄 imageprocess.cpp
字号:
sprintf(sPicFile, "%s%d.jpg", sPathBuffer, iPicIndex);
sprintf(sMarkFile, "%s%d.mes", sPathBuffer, iPicIndex);
// 判断文件是否存在
if (NULL == (fp = fopen(sPicFile, "rb"))) break;
fclose(fp);
m_pPic[iPicIndex] = new CPic;
#ifdef COLORPIC
m_pPic[iPicIndex]->loadjpg(sPicFile);
#else
m_pPic[iPicIndex]->loadjpgGry(sPicFile);
#endif
m_pPic[iPicIndex]->SetImageID(iPicIndex);
m_pMark[iPicIndex] = new CMeta;
m_pMark[iPicIndex]->LoadFile(sMarkFile);
m_pMark[iPicIndex]->SetSourceDCRect(m_rcSourceDCRect);
m_pMark[iPicIndex]->SetSourcePICRect(m_rcSourceDCRect);
}
m_iPicCount = iPicIndex - 1; // 现在,m_iPicCount 中的数值就是当前的图象总数
m_vs.SetScrollRange(1, (m_iPicCount > 1) ? (m_iPicCount) : (1));
if (m_iPicCount > 0)
{
m_pCurrentPic = m_pPic[1];
m_pCurrentMark = m_pMark[1];
m_iCurPicIndex = 1;
m_iTopPicIndex = 1;
}
else
{
m_pCurrentPic = NULL;
m_pCurrentMark = NULL;
m_iCurPicIndex = 0;
m_iTopPicIndex = 0;
}
SetCurrentPicture((m_iPicCount > 0) ? (1) : (0));
switch (DispStyle)
{
case 1:
case 2:
case 3:
case 4:
case 6:
case 9:
break;
default:
DispStyle = 1;
break;
}
// DispStyle = 1;
SetDisp(DispStyle, 0);
// 显示当前图片序号
UpdateData(FALSE);
m_action = ACTION_NOTHING;
m_bMouseDown = FALSE;
int iAviIndex;
CHAR sAviFile[1000];
for (iAviIndex = 1; iAviIndex < 100; iAviIndex++)
{
sprintf(sAviFile, "%sx%d.avi", sPathBuffer, iAviIndex);
if (NULL == (fp = fopen(sAviFile, "rb"))) break;
fclose(fp);
}
m_iAviCount = iAviIndex - 1;
((CBxtDlg *)AfxGetMainWnd())->dispimginfo->
SendMessage(WX_SETSEQ, (m_iAviCount > 0) ? (1) : (0), 0);
return (TRUE);
}
void
ImageProcess::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int max, min;
int iOldPos;
int iNewPos;
if (FALSE == m_pCurrentMark->SetAction(ACTION_NOTHING, 0, NULL)) return;
// 获取滚动条的最小值与最大值
m_vs.GetScrollRange(&min, &max);
// 取得旧位置
iOldPos = m_vs.GetScrollPos();
switch (nSBCode)
{
case SB_BOTTOM:
iNewPos = max;
break;
case SB_ENDSCROLL:
iNewPos = iOldPos;
break;
case SB_LINEDOWN:
iNewPos = (iOldPos + 1 > max) ? (max) : (iOldPos + 1);
break;
case SB_LINEUP:
iNewPos = (iOldPos - 1 < min) ? (min) : (iOldPos - 1);
break;
case SB_PAGEDOWN:
iNewPos = (iOldPos + 2 > max) ? (max) : (iOldPos + 2);
break;
case SB_PAGEUP:
iNewPos = (iOldPos - 2 < min) ? (min) : (iOldPos - 2);
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
iNewPos = nPos;
break;
case SB_TOP:
iNewPos = min;
break;
}
// 设置新位置
if (iOldPos != iNewPos)
{
int iPicPerPage = (3 == DispStyle) ? (2) : (DispStyle);
m_iTopPicIndex = (iNewPos - 1) * iPicPerPage + 1;
DrawImg();
SetCurrentPicture(m_iTopPicIndex);
m_vs.SetScrollPos(iNewPos);
}
}
/*
By QXF, 2000-11-10
*/
BOOL
ImageProcess::DrawOnePicture(int iFrameIndex, int iPicIndex)
{
if (iFrameIndex < 1 || iFrameIndex > 9) return FALSE;
if (iPicIndex < 1) return FALSE;
if (iPicIndex > m_iPicCount) iPicIndex = 0;
CRect rcFrame;
CDC *pDC = ff[iFrameIndex].GetDC();
HDC hDC = pDC->GetSafeHdc();
ff[iFrameIndex].GetClientRect(&rcFrame);
m_pPic[iPicIndex]->DrawBMP(pDC, 0, 0, rcFrame.Width(), rcFrame.Height(), m_bStretch);
if (iPicIndex > 0)
{
m_pMark[iPicIndex]->SetTargetDCRect(rcFrame);
m_pMark[iPicIndex]->SetTargetPICRect(rcFrame);
DrawPicFrame(iPicIndex);
m_pMark[iPicIndex]->ReDraw(hDC);
}
ReleaseDC(pDC);
return TRUE;
}
void
ImageProcess::DrawImg()
{
int iPicPerPage = (3 == DispStyle) ? (2) : (DispStyle);
int i;
for (i = 1; i <= iPicPerPage; i++)
DrawOnePicture(i, m_iTopPicIndex + i - 1);
}
void
ImageProcess::SetVs(int nPos)
{
int iOldPicIndex = m_iCurPicIndex;
int iPicPerPage = (3 == DispStyle) ? (2) : (DispStyle);
m_iTopPicIndex = (nPos - 1) * iPicPerPage + 1;
SetCurrentPicture(m_iCurPicIndex);
// m_iCurPicIndex = m_iTopPicIndex;
/*
if (iOldPicIndex != m_iCurPicIndex)
{
CString sCurPic;
sCurPic.Format("%d", m_iCurPicIndex);
GetDlgItem(IDC_CURPIC)->SetWindowText(sCurPic);
DrawImg();
}
*/
}
BOOL
ImageProcess::DestroyWindow()
{
CleanUp();
if (NULL != m_pPic[0]) delete m_pPic[0];
return CDialog::DestroyWindow();
}
void
ImageProcess::ChgPlatte(WPARAM wParm, LPARAM lParm)
{
m_pPic[m_iCurPicIndex]->CreatePlate(wParm);
DrawImg();
}
void
ImageProcess::ChgGryWin(WPARAM wParm,LPARAM lParm)
{
if (NULL == m_pCurrentPic) return;
if (m_iPicCount < 1) return;
m_pCurrentPic = m_pPic[m_iCurPicIndex];
m_pCurrentMark = m_pMark[m_iCurPicIndex];
m_pCurrentPic->ReLoad();
if (1 == lParm)
m_pCurrentPic->ChgGryWinW(LOWORD(wParm), HIWORD(wParm));
else
m_pCurrentPic->ChgGryWin(LOWORD(wParm), HIWORD(wParm));
DrawImg();
}
void
ImageProcess::ChgConBri(WPARAM wParm, LPARAM lParm)
{
int iContrast; // 对比度
int iBright; // 亮度
if (NULL == m_pCurrentPic || m_iPicCount < 1) return;
iContrast = HIWORD(wParm) - 128;
iBright = LOWORD(wParm) - 128;
m_pCurrentPic = m_pPic[m_iCurPicIndex];
m_pCurrentMark = m_pMark[m_iCurPicIndex];
// 重新装入图象
m_pCurrentPic->ReLoad();
m_pCurrentPic->ChgConBri(iContrast, iBright);
DrawImg();
}
VOID
ImageProcess::PlayBackAvi(WPARAM wParm, LPARAM lParm)
{
switch (wParm)
{
case -1:
m_at.m_ShowAviArg.iControl = CONTROL_STOP;
((CBxtDlg*)AfxGetMainWnd())->imgpcs->Invalidate(TRUE);
return;
case -2:
m_at.m_ShowAviArg.iDelay = lParm;
return;
case -3:
m_at.m_ShowAviArg.iControl =
(CONTROL_PAUSE == m_at.m_ShowAviArg.iControl) ? (CONTROL_PLAY) : (CONTROL_PAUSE);
return;
default:
CHAR sAviFile[1000];
CHAR *sPathBuffer = m_sPath.GetBuffer(m_sPath.GetLength());
HWND hAviWnd = ff[1].GetSafeHwnd();
CRect rcFrame;
ff[1].GetClientRect(&rcFrame);
sprintf(sAviFile, "%sx%d.avi", sPathBuffer, 1);
m_at.ShowAvi(sAviFile, hAviWnd, 0, 50,
-1, -1,
rcFrame.left + 2, rcFrame.top + 2, rcFrame.Width() - 4, rcFrame.Height() - 4,
0, 0, -1, -1);
}
}
VOID
ImageProcess::CleanUp()
{
int i;
// 释放原来的所有图片和标记,第一次调用时 m_iPicCount 应设置为 0
for (i = 1; i <= m_iPicCount; i++)
{
m_pPic[i]->Close();
m_pMark[i]->Close();
delete m_pPic[i];
m_pPic[i] = NULL;
delete m_pMark[i];
m_pMark[i] = NULL;
}
m_pCurrentPic = NULL;
m_pCurrentMark = NULL;
m_iPicCount = 0;
}
BOOL
ImageProcess::SetCurrentPicture(int iIndex)
{
int iOldCurPicIndex = m_iCurPicIndex;
m_iCurPicIndex = iIndex;
if (iOldCurPicIndex > 0) DrawPicFrame(iOldCurPicIndex);
if (m_iCurPicIndex > 0) DrawPicFrame(m_iCurPicIndex);
m_pCurrentMark = m_pMark[(iIndex > 0) ? (iIndex) : NULL];
m_pCurrentPic = m_pPic[(iIndex > 0) ? (iIndex) : NULL];
if (NULL != m_pCurrentMark) m_pCurrentMark->SetActive();
return (TRUE);
}
BOOL
ImageProcess::DrawPicFrame(int iIndex)
{
int x0, y0, x1, y1;
int iFrameIndex = iIndex - m_iTopPicIndex + 1;
int iLineWidth = 3;
int iPicPerPage = (3 == DispStyle) ? (2) : (DispStyle);
if (iFrameIndex < 1 || iFrameIndex > iPicPerPage) return (FALSE);
HWND hWnd = ff[iFrameIndex].GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);;
CRect rect;
::GetClientRect(hWnd, &rect);
HGDIOBJ hSelPen = ::CreatePen(PS_SOLID, iLineWidth, RGB(255, 0, 0));
HGDIOBJ hLightPen = ::CreatePen(PS_SOLID, iLineWidth, RGB(255, 255, 255));//192, 192, 192));
HGDIOBJ hDarkPen = ::CreatePen(PS_SOLID, iLineWidth, RGB(255, 255, 255));// 64, 64, 64));
HGDIOBJ hOldPen = NULL;
BOOL bIsSel = (iIndex == m_iCurPicIndex && 1 != DispStyle);
x0 = rect.left;
y0 = rect.top;
x1 = rect.right - iLineWidth;
y1 = rect.bottom - iLineWidth;
hOldPen = ::SelectObject(hDC, (bIsSel) ? (hSelPen) : (hLightPen));
::MoveToEx(hDC, x0, y1, NULL);
::LineTo(hDC, x0, y0);
::LineTo(hDC, x1, y0);
if (!bIsSel) ::SelectObject(hDC, hDarkPen);
::LineTo(hDC, x1, y1);
::LineTo(hDC, x0, y1);
::SelectObject(hDC, hOldPen);
::DeleteObject(hSelPen);
::DeleteObject(hLightPen);
::DeleteObject(hDarkPen);
return (TRUE);
}
// 根据窗口中点的位置判断图象框索引
int
ImageProcess::GetFrameIndex(CPoint dlgPoint)
{
CPoint pt = dlgPoint;
CRect rcFrame;
int iFrameIndex;
int iFrameCount;
ClientToScreen(&pt);
iFrameCount = (3 == DispStyle) ? (2) : (DispStyle);
for (iFrameIndex = 1; iFrameIndex <= iFrameCount; iFrameIndex++)
{
ff[iFrameIndex].GetWindowRect(&rcFrame);
if (rcFrame.PtInRect(pt)) return (iFrameIndex);
}
return (0);
}
void ImageProcess::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
CleanUp();
if (NULL != m_pPic[0]) delete m_pPic[0];
CDialog::PostNcDestroy();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -