mainfrm.cpp

来自「一个非常全的vc编程的原程序代码是关于图像处理的!」· C++ 代码 · 共 2,610 行 · 第 1/5 页

CPP
2,610 行
字号
		MessageBox("请先打开一个窗口!", "Error");
		return; 
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount != 8) && (BitCount != 24)){
		MessageBox("此操作只能用于处理灰度图或24位真彩色图!", "Attention");
		return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	pDoc->m_pDib->LaplaceEdgeDetect(1);

	CDC* pDC = CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuLap2() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount != 8) && (BitCount != 24)){
		MessageBox("此操作只能用于处理灰度图或24位真彩色图!", "Attention");
		return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	pDoc->m_pDib->LaplaceEdgeDetect(2);

	CDC* pDC = CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuLap3() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount != 8) && (BitCount != 24)){
		MessageBox("此操作只能用于处理灰度图或24位真彩色图!", "Attention");
		return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	pDoc->m_pDib->LaplaceEdgeDetect(3);

	CDC* pDC = CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuSobel1() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount != 8) && (BitCount != 24)){
		MessageBox("此操作只能用于处理灰度图或24位真彩色图!", "Attention");
		return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	pDoc->m_pDib->SobelEdgeDetect(1);

	CDC* pDC = CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuSobel2() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount != 8) && (BitCount != 24)){
		MessageBox("此操作只能用于处理灰度图或24位真彩色图!", "Attention");
		return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	pDoc->m_pDib->SobelEdgeDetect(2);

	CDC* pDC = CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuBlur() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount != 8) && (BitCount != 24)){
		MessageBox("此操作只能用于处理灰度图或24位真彩色图!", "Attention");
		return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	pDoc->m_pDib->Blur();

	CDC* pDC = CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuAffine() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount == 1) || (BitCount == 4)){
		MessageBox("此操作只能用于处理灰度图或真彩色图!", "Attention");
		return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	m_AffineDlg.m_mode = NEAREST;
	m_AffineDlg.DoModal();

	CDC* pDC = CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnAffine(int mode)
{
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();

    pDoc->m_operFlag = TRUE;

	pDoc->m_pDib->Affine(	m_AffineDlg.m_x,  
							m_AffineDlg.m_y,
							m_AffineDlg.m_wig,
							m_AffineDlg.m_slue,
							mode);

	CSize sizeTotal(pDoc->m_pDib->GetWidth(), pDoc->m_pDib->GetHeight());
	pView->SetScrollSizes(MM_TEXT, sizeTotal);

	CDC* pDC = CWnd->GetDC();
    CWnd->Invalidate();
}

void CMainFrame::OnMenuChangeCanvasSize() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	m_CanvasSizeDlg.DoModal();

	CDC* pDC=CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnChangeCanvasSize()
{
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();

    pDoc->m_operFlag = TRUE;
    
	pDoc->m_pDib->ChangeCanvasSize(m_CanvasSizeDlg.m_Width, 
								   m_CanvasSizeDlg.m_Height,
		                           m_CanvasSizeDlg.m_id);

	CSize sizeTotal(pDoc->m_pDib->GetWidth(), pDoc->m_pDib->GetHeight());
	pView->SetScrollSizes(MM_TEXT,sizeTotal);

	CDC* pDC=CWnd->GetDC();
    CWnd->Invalidate();
    return;
}

void CMainFrame::OnMenuAffineInterpolation() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount == 1) || (BitCount == 4)){
		MessageBox("此操作只能用于处理灰度图或真彩色图!", "Attention");
		return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	m_AffineDlg.m_mode = BIINTERPO;
	m_AffineDlg.DoModal();

	CDC* pDC=CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}


void CMainFrame::OnMenuMedianFilter() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount != 8) && (BitCount != 24)){
		MessageBox("此操作只能用于处理灰度图或24位真彩色图!", "Attention");
		return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	pDoc->m_pDib->MedianFilter();

	CDC* pDC = CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuSobel3() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount != 8) && (BitCount != 24)){
		MessageBox("此操作只能用于处理灰度图或24位真彩色图!", "Attention");
		return;
	}
	
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	pDoc->m_pDib->SobelEdgeDetect(3);

	CDC* pDC = CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuErosion() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd == NULL){
		MessageBox("请先打开一个窗口!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
    if(pDoc == NULL){
		MessageBox("请先打开一个Bmp文件!", "Error");
		return;
	}    
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	int BitCount = pDoc->m_pDib->GetBitCount();
	if((BitCount != 8) && (BitCount != 24)){
		MessageBox("此操作只能用于处理灰度图或24位真彩色图!", "Attention");
		return;
	}
	
    if(!pDoc->m_pDib->IsBinary()){
		MessageBox("此操作只能处理二值图。", "Error");
		return;
	}

    //save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);

	pDoc->m_pDib->Erosion

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?