📄 imageprocess.cpp
字号:
// ImageProcess.cpp : implementation file
//
#include "stdafx.h"
#include "bxt.h"
#include "ImageProcess.h"
#include "bxtdlg.h"
#include <math.h>
#include "standardlength.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// ImageProcess dialog
// ----------------------------------------------------------------------------------------------------
// 构造函数进行初始化处理
// ----------------------------------------------------------------------------------------------------
ImageProcess::ImageProcess(char *ipath,CWnd* pParent /*=NULL*/)
: CDialog(ImageProcess::IDD, pParent)
{
//{{AFX_DATA_INIT(ImageProcess)
m_curPic = _T("");
//}}AFX_DATA_INIT
path = _T(ipath);
cp = NULL;
plh = new POINT_LIST;
plh->next = NULL;
plh->last = NULL;
}
// ----------------------------------------------------------------------------------------------------
// DDE 函数进行数据交换
// ----------------------------------------------------------------------------------------------------
void ImageProcess::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(ImageProcess)
// DDX_Control(pDX, IDC_IMGFRAME2, m_fcur);
DDX_Control(pDX, IDC_SCROLLBAR1, m_vs);
DDX_Control(pDX, IDC_IMGFRAME, m_frame);
DDX_Text(pDX, IDC_CURPIC, m_curPic);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(ImageProcess, CDialog)
//{{AFX_MSG_MAP(ImageProcess)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
ON_WM_VSCROLL()
ON_EN_CHANGE(IDC_CURPIC, OnChangeCurpic)
ON_WM_TIMER()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
ON_MESSAGE(WX_DSPIMG,SetDisp)
ON_MESSAGE(WX_DSPPRC,DispPrc)
ON_MESSAGE(WX_DSPMSU,DispMeasure)
ON_MESSAGE(WX_DSPMRK,DispMark)
ON_MESSAGE(WX_DSPZOOM,DispZoom)
// ON_MESSAGE(WX_DSPSTRETCH,DispStretch)
ON_MESSAGE(WX_CHGPALT,ChgPlatte)
ON_MESSAGE(WX_DSPSTRETCH,DispStretch)
ON_MESSAGE(WX_DSPCONBRI,ChgConBri)
ON_MESSAGE(WX_BSPWINPOS,ChgGryWin)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// ImageProcess message handlers
// ----------------------------------------------------------------------------------------------------
// 根据发送的消息设置当前的状态
// ----------------------------------------------------------------------------------------------------
void ImageProcess::DispMeasure(WPARAM wParm,LPARAM lParm)
{
if (NULL == cp || 1 != DispStyle) return;
if (ACTION_MEASDELETE == wParm && meas->HasSelected())
{
CDC *dc = GetDC();
KillTimer(4);
meas->SelFlash(dc,TRUE);
meas->EraseSel();
RedrawWindow();
meas->ReDraw(dc);
ReleaseDC(dc);
((CBxtDlg *)AfxGetMainWnd())->
dispmeasure->
m_state.SetWindowText("");
return;
}
m_action = wParm;
}
void ImageProcess::DispStretch(WPARAM wParm,LPARAM lParm)
{
stretch = wParm;
//Invalidate(false);
DrawImg();
}
void ImageProcess::ChgPlatte(WPARAM wParm,LPARAM lParm)
{
mpp[curPicNum]->CreatePlate(wParm);
DrawImg();
}
void ImageProcess::DispMark(WPARAM wParm,LPARAM lParm)
{
if (cp == NULL || DispStyle != 1) return;
switch(wParm)
{
case ACTION_ARROW:
SelectNone();
m_action = ACTION_ARROW;
break;
case ACTION_CROSS:
SelectNone();
m_action = ACTION_CROSS;
break;
case ACTION_TEXT:
SelectNone();
m_action = ACTION_TEXT;
m_msg = _T((char*)lParm);
break;
case ACTION_DELETE:
if (m_action != ACTION_DELETE)
{
m_action = ACTION_DELETE;
return;
}
if (m_selitem == NULL) return;
mark->DelNode(m_selitem);
m_action = ACTION_NOTHING;
SelectNone();
delete m_selitem;
m_selitem = NULL;
RedrawWindow();
ReDrawItem();
break;
}
}
void
ImageProcess::DispZoom(WPARAM wParm, LPARAM lParm)
{
if (cp == NULL || DispStyle != 1) return;
CRect rr;
ff[1].GetWindowRect(&rr);
CDC *dc=ff[1].GetDC();
mpp[curPicNum]->SetZoom(dc, wParm, (FLOAT)(rr.Width()), (FLOAT)(rr.Height()));
mpp[curPicNum]->ZoomBMP(dc,0,0,rr.Width(),rr.Height(),0,0);
ReleaseDC(dc);
}
void
ImageProcess::DispPrc(WPARAM wParm,LPARAM lParm)
{
if (cp == NULL) return;
if (imgNum < 1) return;
cp = mpp[curPicNum];
switch (wParm)
{
case 1://rotte left
cp->RoteL();
break;
case 2://rogte right
cp->RoteR();
break;
case 3://flip vertical
cp->VertFlip();
break;
case 4://flip harizantal
cp->HFlip();
break;
case 5://edge find
cp->FindEdge();
break;
case 6://restore org
cp->ReLoad();
break;
}
//Invalidate(false);
DrawImg();
}
void
ImageProcess::SetDisp(WPARAM wParm,LPARAM lParm)
{
if (DispStyle == (INT)(wParm)) return;
DispStyle = wParm;////1 one,4-four,6-six,9-nine,2-Tile_V,3-Tile_H
HideAllFrame();
int ww;
CRect rf,rvs;
CDC *dc;
m_vs.GetWindowRect(&rvs);
ww=rw.Width();
switch (DispStyle)
{
case 1:
if(imgNum>1)
{
m_vs.SetScrollRange(1,imgNum);
m_vs.SetScrollPos(curPicNum);
m_vs.ShowWindow(SW_SHOW);
ww -= rvs.Width();
}
else
{
m_vs.ShowWindow(SW_HIDE);
}
fw = ww;
fh = rw.Height();
ff[1].ShowWindow(SW_SHOW);
ff[1].MoveWindow(0,0,fw,fh);
TopPicNum=curPicNum;
break;
case 2:
if(imgNum>2)
{
m_vs.SetScrollRange(1,imgNum/2+1);
m_vs.SetScrollPos(curPicNum/2+1);
m_vs.ShowWindow(SW_SHOW);
ww -= rvs.Width();
}
else
{
m_vs.ShowWindow(SW_HIDE);
}
fw = ww/2-3;
fh = rw.Height();
ff[1].ShowWindow(SW_SHOW);
ff[1].MoveWindow(1,1,fw,fh);
ff[2].ShowWindow(SW_SHOW);
ff[2].MoveWindow(fw+6,1,fw,fh);
if(curPicNum+1>imgNum)
TopPicNum=((imgNum-1)<1)?1:(imgNum-1);
else
TopPicNum=curPicNum;
break;
case 3:
if(imgNum>2)
{
m_vs.SetScrollRange(1,imgNum/2+1);
m_vs.SetScrollPos(curPicNum/2+1);
m_vs.ShowWindow(SW_SHOW);
ww -= rvs.Width();
}
else
{
m_vs.ShowWindow(SW_HIDE);
}
fw = ww;
fh = rw.Height()/2-3;
ff[1].ShowWindow(SW_SHOW);
ff[1].MoveWindow(1,1,fw,fh);
ff[2].ShowWindow(SW_SHOW);
ff[2].MoveWindow(1,fh+6,fw,fh);
if(curPicNum+1>imgNum)
TopPicNum=((imgNum-1)<1)?1:(imgNum-1);
else
TopPicNum=curPicNum;
break;
case 4:
if(imgNum>4)
{
m_vs.SetScrollRange(1,imgNum/4+1);
m_vs.SetScrollPos(curPicNum/4+1);
m_vs.ShowWindow(SW_SHOW);
ww -= rvs.Width();
}
else
{
m_vs.ShowWindow(SW_HIDE);
}
fw = ww/2-3;
fh = rw.Height()/2-3;
ff[1].ShowWindow(SW_SHOW);
ff[1].MoveWindow(1,1,fw,fh,false);
ff[2].ShowWindow(SW_SHOW);
ff[2].MoveWindow(fw+6,1,fw,fh);
ff[3].ShowWindow(SW_SHOW);
ff[3].MoveWindow(1,fh+6,fw,fh);
ff[4].ShowWindow(SW_SHOW);
ff[4].MoveWindow(fw+6,fh+6,fw,fh);
if(curPicNum+3>imgNum)
TopPicNum=((imgNum-3)<1)?1:(imgNum-3);
else
TopPicNum=curPicNum;
break;
case 6:
if(imgNum>6)
{
m_vs.SetScrollRange(1,imgNum/6+1);
m_vs.SetScrollPos(curPicNum/6+1);
m_vs.ShowWindow(SW_SHOW);
ww -= rvs.Width();
}
else
{
m_vs.ShowWindow(SW_HIDE);
}
fw = ww/2-3;
fh = rw.Height()/3-3;
ff[1].ShowWindow(SW_SHOW);
ff[1].MoveWindow(1,1,fw,fh);
ff[2].ShowWindow(SW_SHOW);
ff[2].MoveWindow(fw+6,1,fw,fh);
ff[3].ShowWindow(SW_SHOW);
ff[3].MoveWindow(1,fh+6,fw,fh);
ff[4].ShowWindow(SW_SHOW);
ff[4].MoveWindow(fw+6,fh+6,fw,fh);
ff[5].ShowWindow(SW_SHOW);
ff[5].MoveWindow(1,2*fh+12,fw,fh);
ff[6].ShowWindow(SW_SHOW);
ff[6].MoveWindow(fw+6,2*fh+12,fw,fh);
if(curPicNum+5>imgNum)
TopPicNum=((imgNum-5)<1)?1:(imgNum-5);
else
TopPicNum=curPicNum;
break;
case 9:
if(imgNum>9)
{
m_vs.SetScrollRange(1,imgNum/9+1);
m_vs.SetScrollPos(curPicNum/9+1);
m_vs.ShowWindow(SW_SHOW);
ww -= rvs.Width();
}
else
{
m_vs.ShowWindow(SW_HIDE);
}
fw = ww/3-3;
fh = rw.Height()/3-3;
ff[1].ShowWindow(SW_SHOW);
ff[1].MoveWindow(1,1,fw,fh);
ff[2].ShowWindow(SW_SHOW);
ff[2].MoveWindow(fw+6,1,fw,fh);
ff[3].ShowWindow(SW_SHOW);
ff[3].MoveWindow(fw*2+12,1,fw,fh);
ff[4].ShowWindow(SW_SHOW);
ff[4].MoveWindow(1,fh+6,fw,fh);
ff[5].ShowWindow(SW_SHOW);
ff[5].MoveWindow(fw+6,fh+6,fw,fh);
ff[6].ShowWindow(SW_SHOW);
ff[6].MoveWindow(2*fw+12,fh+6,fw,fh);
ff[7].ShowWindow(SW_SHOW);
ff[7].MoveWindow(1,2*fh+12,fw,fh);
ff[8].ShowWindow(SW_SHOW);
ff[8].MoveWindow(fw+6,2*fh+12,fw,fh);
ff[9].ShowWindow(SW_SHOW);
ff[9].MoveWindow(2*fw+12,2*fh+12,fw,fh);
if(curPicNum+8>imgNum)
TopPicNum=((imgNum-8)<1)?1:(imgNum-8);
else
TopPicNum=curPicNum;
break;
}
/* if(DispStyle!=1)
{
CDC *xdc=ff[curPicNum-TopPicNum+1].GetDC();
CRect rf;
ff[1].GetWindowRect(&rf);
mpp[curPicNum]->DrawBMP(xdc,0 ,0 ,rf.Width(),rf.Height(),stretch,true);
ReleaseDC(xdc);
}
*/
}
BOOL ImageProcess::OnInitDialog()
{
CDialog::OnInitDialog();
CRect rf;
GetWindowRect(&rw);
rw.left += 1;
rw.top += 1;
rw.bottom -= 1;
rw.right -= 1;
GetDlgItem(IDC_IMGFRAME)->GetWindowRect(&rf);
DWORD ss;
ss = GetDlgItem(IDC_IMGFRAME)->GetStyle();
ss -= WS_VISIBLE;
for(int fn=1;fn<10;fn++)
ff[fn].Create("",ss,rf,this,2010+fn-1);
/*ff[2].Create("",ss,rf,this,2010);
ff[3].Create("",ss,rf,this,2011);
ff[4].Create("",ss,rf,this,2012);
ff[5].Create("",ss,rf,this,2013);
ff[6].Create("",ss,rf,this,2014);
ff[7].Create("",ss,rf,this,2015);
ff[8].Create("",ss,rf,this,2016);
ff[9].Create("",ss,rf,this,2017);*/
//fcur.Create("",ss,rf,this,2018);
//GetDlgItem(IDC_IMGFRAME)->MoveWindow(0 ,0 ,rw.Width(),rw.Height());
ff[1].ShowWindow(SW_SHOW);
ff[1].MoveWindow(0,0,rw.Width(),rw.Height());
imgNum = 1;
char xfilename[256];
for(int ii=0;ii<100;ii++)
mpp[ii] = new CPic;
while(imgNum<100)
{
sprintf(xfilename,"%s%d.jpg",path.GetBuffer(200),imgNum);
FILE *fp;
fp = fopen(xfilename,"rb");
if (fp != NULL)
{
mpp[imgNum]->loadjpgGry(xfilename);
mpp[imgNum]->SetImageID(imgNum);
fclose(fp);
imgNum++;
}
else
{
break;
}
}
imgNum --;
DispStyle=0;
if(imgNum>0)
{
cp = mpp[1];
curPicNum = 1;
TopPicNum = 1;
}
else
{
cp = NULL;
curPicNum = 0;
TopPicNum = 0;
}
//SetDisp(1,0);
SendMessage(WX_DSPIMG,1,0);
mouseAction = 0;
stretch=0;
char scurp[10];
sprintf(scurp,"%d",curPicNum);
GetDlgItem(IDC_CURPIC)->SetWindowText(scurp);
m_frame.ShowWindow(SW_HIDE);
m_action = ACTION_NOTHING;
m_mousedown = false;
/*m_itemhead = new item;
m_itemhead->next = NULL;
m_itemhead->last = NULL;
m_itemhead->x0 = .0;
m_itemhead->y0 = .0;
m_itemhead->x1 = .0;
m_itemhead->y1 = .0;
m_itemhead->type = ACTION_NOTHING;
memset(m_itemhead->word,0,MAX_TEXT_LENGTH);
m_width = 100;
m_height = 100;*/
m_selitem = NULL;
m_selmeasitem = NULL;
CRect rmw;
GetWindowRect(&rmw);
m_width = rmw.Width();
m_height = rmw.Height();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void ImageProcess::HideAllFrame()
{
ff[1].ShowWindow(SW_HIDE);
ff[2].ShowWindow(SW_HIDE);
ff[3].ShowWindow(SW_HIDE);
ff[4].ShowWindow(SW_HIDE);
ff[5].ShowWindow(SW_HIDE);
ff[6].ShowWindow(SW_HIDE);
ff[7].ShowWindow(SW_HIDE);
ff[8].ShowWindow(SW_HIDE);
ff[9].ShowWindow(SW_HIDE);
}
void ImageProcess::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect cf;
int oldcurpic = curPicNum;
switch(mouseAction)
{
case 0:
if(DispStyle!=1)
{
ff[1].GetWindowRect(&cf);
switch(DispStyle)
{
case 2:
curPicNum=TopPicNum+point.x/cf.Width();
break;
case 3:
curPicNum=TopPicNum+point.y/cf.Height();
break;
case 4:
curPicNum=TopPicNum+point.x/cf.Width()+point.y/cf.Height()*2;
break;
case 6:
curPicNum=TopPicNum+point.x/cf.Width()+point.y/cf.Height()*2;
break;
case 9:
curPicNum=TopPicNum+point.x/cf.Width()+point.y/cf.Height()*3;
break;
}
cp = mpp[curPicNum];
}
else
{
CDC *dc = GetDC();
CPen pen(PS_SOLID,1,RGB(255,255,0)),*oldpen;
m_mousedown = true;
SetCapture();
m_end = m_start = point;
dc->SetTextColor(RGB(255,0,0));
switch (m_action)
{
// 删除测量标记
case ACTION_MEASDELETE:
KillTimer(4);
meas->SelFlash(dc,TRUE);
meas->SelectNone();
if (TRUE == meas->SelectItem(point))
SetTimer(4,500,NULL);
break;
// 测量不规则面积(第一条线,初始化起始点和面积)
case ACTION_MEASCHAOSAREA:
plh->p = point;
m_chaos_area = 0.0;
break;
// 测量不规则角度(第一条线)
case ACTION_MEASCHAOSANGLE:
break;
// 测量角度(第一条线)
case ACTION_MEASANGLE:
break;
// 测量不规则角度(非第一条线)
case ACTION_MEASCHAOSANGLE2:
break;
// 测量
case ACTION_MEASANGLE2:
case ACTION_MEASCHAOSAREA2:
case ACTION_MEASLINEDIST2:
m_end = m_start = m_start2;
oldpen = dc->SelectObject(&pen);
dc->SetROP2(R2_XORPEN);
dc->MoveTo(m_start);
dc->LineTo(m_end);
m_end = point;
dc->MoveTo(m_start);
dc->LineTo(m_end);
dc->SelectObject(oldpen);
break;
case ACTION_MEASLINEDIST:
m_len = 0.0;
break;
case ACTION_MEASRECTAREA:
break;
case ACTION_SETSTANDARDLENGTH:
break;
case ACTION_ARROW:
oldpen = dc->SelectObject(&pen);
dc->SetROP2(R2_XORPEN);
dc->MoveTo(m_start);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -