📄 dlgpatternrecog.cpp
字号:
// 绘制坐标轴
pDC->MoveTo(5*nXOffset,5*nYOffset);
// 垂直轴
pDC->LineTo(5*nXOffset,AXIS_MAXIMIZE+10*nYOffset);
// 水平轴
pDC->LineTo(AXIS_MAXIMIZE+15*nXOffset,AXIS_MAXIMIZE+10*nYOffset);
switch (nWhichNoUse)
{
case COLOR_RED:
strXLabel="G";
strYLabel="B";
break;
case COLOR_GREEN:
strXLabel="R";
strYLabel="B";
break;
case COLOR_BLUE:
strXLabel="R";
strYLabel="G";
}
//显示坐标轴的标签
pDC->TextOut(AXIS_MAXIMIZE+15*nXOffset ,AXIS_MAXIMIZE+10*nYOffset +nLittleOffset, strXLabel);
pDC->TextOut(5*nXOffset-12*nLittleOffset,5*nYOffset, strYLabel);
//得到原点
X0=5*nXOffset;
Y0=AXIS_MAXIMIZE+10*nYOffset;
m_ptFigureXY0.x=X0;
m_ptFigureXY0.y=Y0;
// 写坐标
str.Format("0");
pDC->TextOut(5*nXOffset,AXIS_MAXIMIZE+10*nYOffset +nLittleOffset, str);
str.Format("255");
pDC->TextOut(5*nXOffset-13*nLittleOffset,10*nYOffset, str);
pDC->TextOut(AXIS_MAXIMIZE+5*nXOffset,AXIS_MAXIMIZE+10*nYOffset +nLittleOffset, str);
// 绘制X轴箭头
pDC->LineTo(AXIS_MAXIMIZE+15*nXOffset - nXOffset,AXIS_MAXIMIZE+10*nYOffset +nXOffset);
pDC->MoveTo(AXIS_MAXIMIZE+15*nXOffset,AXIS_MAXIMIZE+10*nYOffset);
pDC->LineTo(AXIS_MAXIMIZE+15*nXOffset - nXOffset,AXIS_MAXIMIZE+10*nYOffset -nXOffset);
// 绘制X轴箭头
pDC->MoveTo(5*nXOffset,5*nYOffset);
pDC->LineTo(5*nXOffset - nXOffset,5*nYOffset + nXOffset);
pDC->MoveTo(5*nXOffset,5*nYOffset);
pDC->LineTo(5*nXOffset + nXOffset,5*nYOffset + nXOffset);
// 绘制X轴刻度
pDC->SelectObject(pPenRed1);
int i;
pDC->MoveTo(5*nXOffset,AXIS_MAXIMIZE+10*nYOffset);
for (i = 4; i < 256; i += 5)
{
if ((i & 1) == 0)
{
// 10的倍数
pDC->MoveTo(i + 5*nXOffset, AXIS_MAXIMIZE+10*nYOffset);
pDC->LineTo(i + 5*nXOffset, AXIS_MAXIMIZE+10*nYOffset +4);
}
else
{
// 5的倍数
pDC->MoveTo(i + 5*nXOffset, AXIS_MAXIMIZE+10*nYOffset);
pDC->LineTo(i + 5*nXOffset, AXIS_MAXIMIZE+10*nYOffset +2);
}
}
// 绘制Y轴刻度
pDC->MoveTo(5*nXOffset,AXIS_MAXIMIZE+10*nYOffset);
for (i = 4; i < 256; i += 5)
{
if ((i & 1) == 0)
{
// 10的倍数
pDC->MoveTo(5*nXOffset , AXIS_MAXIMIZE+10*nYOffset - i);
pDC->LineTo(5*nXOffset - 4, AXIS_MAXIMIZE+10*nYOffset - i);
}
else
{
// 5的倍数
pDC->MoveTo(5*nXOffset , AXIS_MAXIMIZE+10*nYOffset - i);
pDC->LineTo(5*nXOffset - 2, AXIS_MAXIMIZE+10*nYOffset - i);
}
}
// 绘制坐标区域的矩形边线(上、右)
// 更改成蓝色画笔
pDC->SelectObject(pPenBlue1);
pDC->MoveTo(5*nXOffset,10*nYOffset);
pDC->LineTo(5*nXOffset + AXIS_MAXIMIZE,10*nYOffset);
pDC->LineTo(5*nXOffset + AXIS_MAXIMIZE,10*nYOffset+AXIS_MAXIMIZE);
//绘制坐标点
// BYTE xv,yv;
// pDC->SelectObject(pPenBlue);
// switch (nWhichNoUse)
// {
// case COLOR_RED:
// for(i=0;i<m_nDIBHeight*m_nDIBWidth;i=i+3) //这里的3表示当前图像为24位真彩!!!
// {
// xv=*(lpBitsData+i +COLOR_GREEN); //Green
// yv=*(lpBitsData+i +COLOR_BLUE); //Blue
//
// pDC->MoveTo(X0+xv,Y0-yv);
// pDC->LineTo(X0+xv,Y0-yv);
// }
// break;
// case COLOR_GREEN:
// for(i=0;i<m_nDIBHeight*m_nDIBWidth;i=i+3)
// {
// xv=*(lpBitsData+i +COLOR_RED); //Red
// yv=*(lpBitsData+i +COLOR_BLUE); //Blue
//
// pDC->MoveTo(X0+xv,Y0-yv);
// pDC->LineTo(X0+xv,Y0-yv);
// }
// break;
// case COLOR_BLUE:
// for(i=0;i<m_nDIBHeight*m_nDIBWidth;i=i+3)
// {
// xv=*(lpBitsData+i +COLOR_RED); //Red
// yv=*(lpBitsData+i +COLOR_GREEN); //Green
//
// pDC->MoveTo(X0+xv,Y0-yv);
// pDC->LineTo(X0+xv,Y0-yv);
// }
// }
// 恢复以前的画笔
pDC->SelectObject(pOldPen);
// 恢复正常光标
EndWaitCursor();
// 删除新的画笔
delete pPenRed;
delete pPenRed1;
delete pPenBlue;
delete pPenBlue1;
delete pPenBlack;
delete pBrush_bk;
}
void CDlgPatternRecog::OnLButtonDown(UINT nFlags, CPoint point)
{
// 当用户单击鼠标左键开始拖动
tagRGBVal rgb;
BYTE R,G,B;
if(m_TabRect.PtInRect(point))
{
if(m_b3ClassRecogEnabled) //3类线性识别,特殊处理
{
if(m_nCountNumOfLines >= MAXIMIZE_LINES)
{
CString str;
str.Format("最多允许绘%d 条分类线!",MAXIMIZE_LINES);
AfxMessageBox(str);
return;
}
// 保存当前鼠标位置
m_p1 = point;
// 设置拖动状态
m_bIsDraging = TRUE;
// 设置m_bDrawed为FALSE
m_bDrawed = FALSE;
//清除更新标志
m_blIsUpdated=false; //此句是否可以去掉?
// 更改光标
::SetCursor(::LoadCursor(NULL, IDC_CROSS));
// 开始跟踪鼠标事件(保证当鼠标移动到窗体外时也可以接收到鼠标释放事件)
SetCapture();
return;
}
}
if(m_TabRect.PtInRect(point))
{
if (!m_blIsUpdated)
{
// 设置绘制方式为异或模式
CDC* pDC=m_lpTabDC;
int nOldDrawMode = pDC->SetROP2(R2_XORPEN);
// 创建新的画笔,选中新画笔
CPen* pPen = new CPen;
pPen->CreatePen(PS_SOLID,2,RGB(0,255,0));
CGdiObject* pOldPen = pDC->SelectObject(pPen);
// 判断是否已经画过橡皮筋线
if (m_bDrawed)
{
// 擦去以前的橡皮筋线
pDC->MoveTo(m_p1.x-m_nTabPosX,m_p1.y-m_nTabPosY);
pDC->LineTo(m_p2.x-m_nTabPosX,m_p2.y-m_nTabPosY);
}
pDC->SelectObject(pOldPen);
pDC->SetROP2(nOldDrawMode);
//delete pOldPen;
//delete pPen;
}
// 保存当前鼠标位置
m_p1 = point;
// 设置拖动状态
m_bIsDraging = TRUE;
// 设置m_bDrawed为FALSE
m_bDrawed = FALSE;
//清除更新标志
m_blIsUpdated=false;
// 更改光标
::SetCursor(::LoadCursor(NULL, IDC_CROSS));
// 开始跟踪鼠标事件(保证当鼠标移动到窗体外时也可以接收到鼠标释放事件)
SetCapture();
return;
}
// 添加自动识别采样点
if( m_lAuotSampleMode==AUTOSAMPLE_ENDING)
{
return; //已经结束采样
}
//添加目标采样点
if(m_lAuotSampleMode==AUTOSAMPLE_ADDOBJ)
{
::SetCursor(::LoadCursor(NULL, IDC_UPARROW));
CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
HDIB hDIB=pDoc->GetHDIB();
GetPixelColorValue(pDoc->GetDIBPtr(hDIB),point.x,point.y,&R,&G,&B);
rgb.R=R;
rgb.G=G;
rgb.B=B;
m_arrAutoSampleObjData.Add(rgb);
DrawCurSamplePoint(rgb);
return;
}
//添加背景采样点
if(m_lAuotSampleMode==AUTOSAMPLE_ADDBAK)
{
::SetCursor(::LoadCursor(NULL, IDC_UPARROW));
CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
HDIB hDIB=pDoc->GetHDIB();
GetPixelColorValue(pDoc->GetDIBPtr(hDIB),point.x,point.y,&R,&G,&B);
rgb.R=R;
rgb.G=G;
rgb.B=B;
m_arrAutoSampleBakData.Add(rgb);
DrawCurSamplePoint(rgb);
return;
}
//添加第三模式采样点
if(m_lAuotSampleMode==AUTOSAMPLE_ADDTHIRD)
{
::SetCursor(::LoadCursor(NULL, IDC_UPARROW));
CImageSysZLF01App * lpCurrentApp=(CImageSysZLF01App *)AfxGetApp();
CImageSysZLF01Doc * pDoc=lpCurrentApp->GetCurDocument();
HDIB hDIB=pDoc->GetHDIB();
GetPixelColorValue(pDoc->GetDIBPtr(hDIB),point.x,point.y,&R,&G,&B);
rgb.R=R;
rgb.G=G;
rgb.B=B;
m_arrAutoSampleThirdData.Add(rgb);
DrawCurSamplePoint(rgb);
return;
}
CDialog::OnLButtonDown(nFlags, point);
}
void CDlgPatternRecog::OnLButtonUp(UINT nFlags, CPoint point)
{
// 当用户释放鼠标左键停止拖动
CPoint logP1,logP2;
tagLineInfo line;
if (m_bIsDraging)
{
// 判断当前光标是否在绘制区域
if(m_TabRect.PtInRect(point))
{
if(m_b3ClassRecogEnabled) //3类线性识别,特殊处理
{
// 保存当前鼠标位置
m_p2 = point;
if ((m_p1 != m_p2) && (m_p1.x != m_p2.x))
{
// 计算斜率和截距
GetFigureLogicXY(m_p1,&logP1);
GetFigureLogicXY(m_p2,&logP2);
//此处应考虑容错处理,暂略。(zlf 05/04/25)
line.fA = (float) (logP2.y - logP1.y) / (logP2.x - logP1.x);
line.fB= (float) logP1.y - m_fA * logP1.x;
}
m_arr3ClassLineArray.Add(line);
m_nCountNumOfLines++;
// 解除对鼠标事件的跟踪
::ReleaseCapture();
// 重置拖动状态
m_bIsDraging = FALSE;
return;
}
}
}
if (m_bIsDraging)
{
// 判断当前光标是否在绘制区域
if(m_TabRect.PtInRect(point))
{
// 保存当前鼠标位置
m_p2 = point;
if ((m_p1 != m_p2) && (m_p1.x != m_p2.x))
{
// 计算斜率和截距
GetFigureLogicXY(m_p1,&logP1);
GetFigureLogicXY(m_p2,&logP2);
m_fA = (float) (logP2.y - logP1.y) / (logP2.x - logP1.x);
m_fB = (float) logP1.y - m_fA * logP1.x;
}
}
else
{
// 用户在绘制区域外放开鼠标左键
CDC* pDC = m_lpTabDC;
// 设置绘制方式为异或模式
int nOldDrawMode = pDC->SetROP2(R2_XORPEN);
// 创建新的画笔,选中新画笔
CPen* pPen = new CPen;
pPen->CreatePen(PS_DOT,1,RGB(0,0,0));
CGdiObject* pOldPen = pDC->SelectObject(pPen);
// 判断是否已经画过橡皮筋线
if (m_bDrawed)
{
// 擦去以前的橡皮筋线
pDC->MoveTo(m_p1.x-m_nTabPosX,m_p1.y-m_nTabPosY);
pDC->LineTo(m_p2.x-m_nTabPosX,m_p2.y-m_nTabPosY);
}
// 选回以前的画笔
pDC->SelectObject(pOldPen);
// 恢复成以前的绘制模式
pDC->SetROP2(nOldDrawMode);
delete pPen;
}
// 解除对鼠标事件的跟踪
::ReleaseCapture();
// 重置拖动状态
m_bIsDraging = FALSE;
}
CDialog::OnLButtonUp(nFlags, point);
}
void CDlgPatternRecog::GetFigureLogicXY(CPoint point0, CPoint *lpoint1)
{
//注意:这里point0为相对于对话框的点位坐标
//得到相对于Tab控件的坐标
CPoint tmpPoint;
tmpPoint=point0-CPoint(m_nTabPosX,m_nTabPosY);
//得到相对于逻辑坐标原点的坐标(原点为左下角)
*lpoint1=tmpPoint-m_ptFigureXY0;
lpoint1->y=-(lpoint1->y); //坐标系反向
}
void CDlgPatternRecog::GetTabXYFromLogicXY(int LogicX, int LogicY, long *TabX, long *TabY)
{
int tmpX0,tmpY0;
tmpX0=-m_ptFigureXY0.x;
tmpY0=m_ptFigureXY0.y;
*TabX=LogicX-tmpX0;
*TabY=-(LogicY-tmpY0);
}
//3-维坐标轴绘制
void CDlgPatternRecog::Draw3DimetionAxis(CDC *pDC, LPSTR lpBitsData)
{
//注意这里lpBitsData指向的是图像数据,不包括颜色表!
//int X0,Y0;
// 字符串
CString str,strXLabel,strYLabel,strZLabel;
// 显示等待光标
BeginWaitCursor();
//Draw3dRect( LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight );
pDC->Draw3dRect(&CRect(40,40,300,300),RGB(155,100,0),RGB(0,255,100));
}
//手工模式识别
void CDlgPatternRecog::OnMenuPr2Manu()
{
// 显示手工识别样本显示元素
((CWnd*)GetDlgItem(IDC_STATIC_COVER_RECT))->ShowWindow(SW_HIDE);
m_lRButtonDown=RBUTTONDOWN_MANU_MODE;
}
void CDlgPatternRecog::OnMenuPr2Auto()
{
// 隐藏手工识别样本显示元素
((CWnd*)GetDlgItem(IDC_STATIC_COVER_RECT))->ShowWindow(SW_SHOW);
((CWnd*)GetDlgItem(IDC_STATIC_COVER_RECT))->SetWindowText("自动识别数据采样...");
m_lRButtonDown=RBUTTONDOWN_AUTO_MODE;
}
void CDlgPatternRecog::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// 手工样本处理
//手工识别样本采样
m_ptCurRButtonDown=point;
if(m_rectImage.PtInRect(point))
{
//加载弹出菜单--<手工选择>
if(m_lRButtonDown==RBUTTONDOWN_MANU_MODE)
{
CMenu mu;
CRect WndRect;
mu.LoadMenu(IDR_MENU_PATTERN_0202);
if(m_bIsEnabledRealTimeProcess)
{
mu.CheckMenuItem(IDR_MENU_PATTERN_ENABLE_REAL ,MF_CHECKED);
mu.CheckMenuItem(IDR_MENU_PATTERN_DISENABLE_REAL,MF_UNCHECKED);
}
else
{
mu.CheckMenuItem(IDR_MENU_PATTERN_ENABLE_REAL ,MF_UNCHECKED);
mu.CheckMenuItem(IDR_MENU_PATTERN_DISENABLE_REAL,MF_CHECKED);
}
//这种方法是不是太麻烦了?
CWnd* pWnd=this->GetDC()->GetWindow();
pWnd->GetWindowRect(&WndRect);
mu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON ,point.x+WndRect.left,point.y+WndRect.top,pWnd);
return ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -