?? dipdoc.cpp
字號:
// 更改光標形狀
BeginWaitCursor();
if (PointOperation.GetMixedChannel(blue))
{
POSITION posTemplate = pApp->GetFirstDocTemplatePosition();
CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate(posTemplate);
CDipDoc* pDocument = (CDipDoc*) pDocTemplate->OpenDocumentFile(NULL);
pDocument->m_pDibObject = blue;
pDocument->m_bImageLoaded = TRUE;
CString sSplitCaption;
AfxFormatString1(sSplitCaption, IDS_SPLIT_BLUE_CAPTION, GetTitle());
pDocument->SetTitle(sSplitCaption);
//獲取子框架窗口指針
CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
pChild->m_nWidth = m_pDibObject->GetWidth();
pChild->m_nHeight = m_pDibObject->GetHeight();
pChild->SetWindowPos( NULL, 0, 0, pChild->m_nWidth + 12,
pChild->m_nHeight + 38, SWP_NOZORDER | SWP_NOMOVE );
pDocument->UpdateAllViews(NULL);
}
else
AfxMessageBox(IDS_FAIL_SPLIT);
// 恢復光標
EndWaitCursor();
}
void CDipDoc::OnChannelGreen()
{
//獲取應用程序類指針
CDipApp *pApp = GetApp();
//獲取主框架窗口指針
CMainFrame *pFrame = GetMainFrame();
CDibObject *green = new CDibObject(m_pDibObject);
//創建點處理CPointPro類對象
CPointPro PointOperation( m_pDibObject );
// 更改光標形狀
BeginWaitCursor();
if (PointOperation.GetMixedChannel(green))
{
POSITION posTemplate = pApp->GetFirstDocTemplatePosition();
CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate(posTemplate);
CDipDoc* pDocument = (CDipDoc*) pDocTemplate->OpenDocumentFile(NULL);
pDocument->m_pDibObject = green;
pDocument->m_bImageLoaded = TRUE;
CString sSplitCaption;
AfxFormatString1(sSplitCaption, IDS_SPLIT_GREEN_CAPTION, GetTitle());
pDocument->SetTitle(sSplitCaption);
//獲取子框架窗口指針
CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
pChild->m_nWidth = m_pDibObject->GetWidth();
pChild->m_nHeight = m_pDibObject->GetHeight();
pChild->SetWindowPos( NULL, 0, 0, pChild->m_nWidth + 12,
pChild->m_nHeight + 38, SWP_NOZORDER | SWP_NOMOVE );
pDocument->UpdateAllViews(NULL);
}
else
AfxMessageBox(IDS_FAIL_SPLIT);
// 恢復光標
EndWaitCursor();
}
void CDipDoc::OnChannelMixed()
{
//獲取應用程序類指針
CDipApp *pApp = GetApp();
//獲取主框架窗口指針
CMainFrame *pFrame = GetMainFrame();
CDibObject *mixed = new CDibObject(m_pDibObject);
//創建點處理CPointPro類對象
CPointPro PointOperation( m_pDibObject );
// 更改光標形狀
BeginWaitCursor();
if (PointOperation.GetMixedChannel(mixed))
{
POSITION posTemplate = pApp->GetFirstDocTemplatePosition();
CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate(posTemplate);
CDipDoc* pDocument = (CDipDoc*) pDocTemplate->OpenDocumentFile(NULL);
pDocument->m_pDibObject = mixed;
pDocument->m_bImageLoaded = TRUE;
CString sSplitCaption;
AfxFormatString1(sSplitCaption, IDS_SPLIT_MIXED_CAPTION, GetTitle());
pDocument->SetTitle(sSplitCaption);
//獲取子框架窗口指針
CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
pChild->m_nWidth = m_pDibObject->GetWidth();
pChild->m_nHeight = m_pDibObject->GetHeight();
pChild->SetWindowPos( NULL, 0, 0, pChild->m_nWidth + 12,
pChild->m_nHeight + 38, SWP_NOZORDER | SWP_NOMOVE );
pDocument->UpdateAllViews(NULL);
}
else
AfxMessageBox(IDS_FAIL_SPLIT);
// 恢復光標
EndWaitCursor();
}
void CDipDoc::OnChannelRed()
{
//獲取應用程序類指針
CDipApp *pApp = GetApp();
//獲取主框架窗口指針
CMainFrame *pFrame = GetMainFrame();
CDibObject *red = new CDibObject(m_pDibObject);
//創建點處理CPointPro類對象
CPointPro PointOperation( m_pDibObject );
// 更改光標形狀
BeginWaitCursor();
if (PointOperation.GetMixedChannel(red))
{
POSITION posTemplate = pApp->GetFirstDocTemplatePosition();
CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate(posTemplate);
CDipDoc* pDocument = (CDipDoc*) pDocTemplate->OpenDocumentFile(NULL);
pDocument->m_pDibObject = red;
pDocument->m_bImageLoaded = TRUE;
CString sSplitCaption;
AfxFormatString1(sSplitCaption, IDS_SPLIT_RED_CAPTION, GetTitle());
pDocument->SetTitle(sSplitCaption);
//獲取子框架窗口指針
CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
pChild->m_nWidth = m_pDibObject->GetWidth();
pChild->m_nHeight = m_pDibObject->GetHeight();
pChild->SetWindowPos( NULL, 0, 0, pChild->m_nWidth + 12,
pChild->m_nHeight + 38, SWP_NOZORDER | SWP_NOMOVE );
pDocument->UpdateAllViews(NULL);
}
else
AfxMessageBox(IDS_FAIL_SPLIT);
// 恢復光標
EndWaitCursor();
}
void CDipDoc::OnUpdateChannelGreen(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateChannelMixed(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateChannelRed(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateChannelBlue(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateChannelSplit(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdatePointThre(CCmdUI* pCmdUI)
{
//判斷當前是否有圖像對象
if( m_pDibObject == NULL ) return;
//在點處理CPointPro類中創建用來繪制直方圖的數據
CPointPro PointOperation( m_pDibObject );
//判斷是否為256色灰度圖像
pCmdUI->Enable(PointOperation.IsGray256());
}
void CDipDoc::OnUpdatePointPseudocolor(CCmdUI* pCmdUI)
{
//判斷當前是否有圖像對象
if( m_pDibObject == NULL ) return;
//在點處理CPointPro類中創建用來繪制直方圖的數據
CPointPro PointOperation( m_pDibObject );
//判斷是否為256色灰度圖像
pCmdUI->Enable(PointOperation.IsGray256());
}
void CDipDoc::OnEdgeTrace()
{
//創建點處理CPointPro類對象
CAreaPro AreaPro( m_pDibObject );
// 更改光標形狀
BeginWaitCursor();
AreaPro.EdgeTracing();
// 恢復光標
EndWaitCursor();
// 更新視圖
UpdateAllViews(NULL);
}
void CDipDoc::OnEdgeContour()
{
//創建點處理CPointPro類對象
CAreaPro AreaPro( m_pDibObject );
// 更改光標形狀
BeginWaitCursor();
AreaPro.ContourPickUp();
// 恢復光標
EndWaitCursor();
// 更新視圖
UpdateAllViews(NULL);
}
void CDipDoc::OnEdgeFill()
{
//創建種子填充方式選擇對話框
CDlgSeedFill seedfill;
if(seedfill.DoModal() == IDOK)
{
//創建點處理CPointPro類對象
CAreaPro AreaPro( m_pDibObject );
// 更改光標形狀
BeginWaitCursor();
//選擇種子填充方法
if(seedfill.m_iSeedMethod == 0)
AreaPro.Feeding1();
else
AreaPro.Feeding2();
// 恢復光標
EndWaitCursor();
// 更新視圖
UpdateAllViews(NULL);
}
}
void CDipDoc::OnUpdateEdgeTrace(CCmdUI* pCmdUI)
{
//創建點處理CPointPro類對象
CPointPro PointOperation( m_pDibObject );
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}
void CDipDoc::OnUpdateEdgeContour(CCmdUI* pCmdUI)
{
//創建點處理CPointPro類對象
CPointPro PointOperation( m_pDibObject );
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}
void CDipDoc::OnDetectMinus()
{
// TODO: Add your command handler code here
//模板圖像數據指針
unsigned char *pBitsTemp;
static int nIndex = 1;
CFileDialog FileDlg( TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter );
FileDlg.m_ofn.nFilterIndex = (DWORD) nIndex;
if( FileDlg.DoModal() == IDOK )
{
CString strPathName = FileDlg.GetPathName();
nIndex = (int) FileDlg.m_ofn.nFilterIndex;
//設置等待光標
BeginWaitCursor();
CDibObject *pTemplate = new CDibObject( strPathName.GetBuffer(3) );
//取消等待光標
EndWaitCursor();
//讀入圖像文件失敗
if( pTemplate == NULL )
{
AfxMessageBox("無法創建差影模板圖像類對象!");
//返回FALSE
return;
}
//在點處理CPointPro類中創建用來繪制直方圖的數據
CPointPro PointOperation( pTemplate );
//判斷是否為256色灰度圖像
if(!PointOperation.IsGray256())
{
AfxMessageBox("差影模板圖像不是256級灰度圖像,無法進行操作!");
//返回FALSE
return;
}
//原始圖像大小
int nOldWidth = m_pDibObject->GetWidth();
int nOldHeight = m_pDibObject->GetHeight();
//模板圖像大小
int nTempWidth = pTemplate->GetWidth();
int nTempHeight = pTemplate->GetHeight();
CRect rectOld(0, 0, nOldWidth, nOldHeight);
CRect rectTemp(0, 0, nTempWidth, nTempHeight);
//兩個圖像的大小應一致
if (rectOld != rectTemp)
{
AfxMessageBox("模板圖像和原圖像大小不一致,無法完成操作!");
return;
}
//創建點處理CPointPro類對象
CAreaPro AreaPro1( pTemplate );
// 更改光標形狀
BeginWaitCursor();
pBitsTemp = AreaPro1.GetBitsPointer();
// 恢復光標
EndWaitCursor();
//創建點處理CPointPro類對象
CAreaPro AreaPro2( m_pDibObject );
// 更改光標形狀
BeginWaitCursor();
AreaPro2.Minusing(pBitsTemp);
// 恢復光標
EndWaitCursor();
// 更新視圖
UpdateAllViews(NULL);
}
}
void CDipDoc::OnUpdateDetectMinus(CCmdUI* pCmdUI)
{
//判斷當前是否有圖像對象
if( m_pDibObject == NULL ) return;
//在點處理CPointPro類中創建用來繪制直方圖的數據
CPointPro PointOperation( m_pDibObject );
//判斷是否為256色灰度圖像
pCmdUI->Enable(PointOperation.IsGray256());
}
void CDipDoc::OnDetectTemplate()
{
// TODO: Add your command handler code here
CDibObject *pTemplate;
static int nIndex = 1;
CFileDialog FileDlg( TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter );
FileDlg.m_ofn.nFilterIndex = (DWORD) nIndex;
if( FileDlg.DoModal() == IDOK )
{
CString strPathName = FileDlg.GetPathName();
nIndex = (int) FileDlg.m_ofn.nFilterIndex;
//設置等待光標
BeginWaitCursor();
pTemplate = new CDibObject( strPathName.GetBuffer(3) );
//取消等待光標
EndWaitCursor();
//讀入圖像文件失敗
if( pTemplate == NULL )
{
AfxMessageBox("無法創建匹配模板圖像類對象!");
//返回FALSE
return;
}
//在點處理CPointPro類中創建用來繪制直方圖的數據
CPointPro PointOperation( pTemplate );
//判斷是否為256色灰度圖像
if(!PointOperation.IsGray256())
{
AfxMessageBox("匹配模板圖像不是256級灰度圖像,無法進行操作!");
//返回FALSE
return;
}
//原始圖像大小
int nOldWidth = m_pDibObject->GetWidth();
int nOldHeight = m_pDibObject->GetHeight();
//模板圖像大小
int nTempWidth = pTemplate->GetWidth();
int nTempHeight = pTemplate->GetHeight();
//兩個圖像的大小應一致
if (nTempWidth > nOldWidth || nTempHeight > nOldHeight)
{
AfxMessageBox("模板圖像太大,無法完成操作!");
return;
}
//創建點處理CPointPro類對象
CAreaPro AreaPro( m_pDibObject );
// 更改光標形狀
BeginWaitCursor();
AreaPro.TemplateMatch(pTemplate);
// 恢復光標
EndWaitCursor();
// 更新視圖
UpdateAllViews(NULL);
}
}
void CDipDoc::OnUpdateDetectTemplate(CCmdUI* pCmdUI)
{
//判斷當前是否有圖像對象
if( m_pDibObject == NULL ) return;
//在點處理CPointPro類中創建用來繪制直方圖的數據
CPointPro PointOperation( m_pDibObject );
//判斷是否為256色灰度圖像
pCmdUI->Enable(PointOperation.IsGray256());
}
void CDipDoc::OnDetectProject()
{
//創建投影模式選擇對話框
CDlgProject projectmode;
if(projectmode.DoModal() == IDOK)
{
//創建點處理CPointPro類對象
CAreaPro AreaPro( m_pDibObject );
// 更改光標形狀
BeginWaitCursor();
//選擇投影模式
if(projectmode.m_iProjectMode == 0)
AreaPro.ProjectH();
else
AreaPro.ProjectV();
// 恢復光標
EndWaitCursor();
// 更新視圖
UpdateAllViews(NULL);
}
}
void CDipDoc::OnUpdateDetectProject(CCmdUI* pCmdUI)
{
//創建點處理CPointPro類對象
CPointPro PointOperation( m_pDibObject );
//只對8位二值圖像起作用
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}
void CDipDoc::OnUpdateEdgeFill(CCmdUI* pCmdUI)
{
//創建點處理CPointPro類對象
CPointPro PointOperation( m_pDibObject );
//只對8位二值圖像起作用
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}