⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ga---mfcview.cpp

📁 开发环境:Visual C++ .net2003 功能:利用遗传算法求解TSP问题。
💻 CPP
字号:
// GA---MFCView.cpp : implementation of the CGAMFCView class
//

#include "stdafx.h"
#include "GA---MFC.h"

#include "GA---MFCDoc.h"
#include "GA---MFCView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CGAMFCView

IMPLEMENT_DYNCREATE(CGAMFCView, CView)

BEGIN_MESSAGE_MAP(CGAMFCView, CView)
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
END_MESSAGE_MAP()

// CGAMFCView construction/destruction

CGAMFCView::CGAMFCView()
{
	// TODO: add construction code here
	m_pGA = NULL;
}

CGAMFCView::~CGAMFCView()
{
}

BOOL CGAMFCView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

// CGAMFCView drawing

void CGAMFCView::OnDraw(CDC* pDC)
{
	CGAMFCDoc* pDoc = GetDocument();
//	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	
	// TODO: add draw code for native data here
	CRect rect;

	// 获取绘制坐标的文本框            

	//获得对话框上的picture的窗口句柄
	GetClientRect(&rect);
	// 指针

	//内存绘图

	//(1)创建可兼容内存绘图DC
	CDC memDC;
	memDC.CreateCompatibleDC(pDC);  
	//(2)用CBitmap对象创建可兼容位图
	CBitmap memBitmap;
	CBitmap* pOldBmp = NULL;

	memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
	//(3)将CBitmap对象选入CDC对象(memDC)中,并存储原位图,以试当前操作完成后恢复
	pOldBmp = memDC.SelectObject(&memBitmap);
	//(4)在memDC上执行所有绘图操作 
	//将原DC的内容拷贝到可兼容内存DC中
	memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);

	//自定义绘图函数,详细见源程序
	if(m_pGA) WSDrawTSP(&memDC);
	//if(m_pGA) WSDrawTSP(pDC);	
	//m_pGA = NULL;
	/*	DrawWave(&memDC);   */  

	//(5)在memDC上绘图完毕后,用BitBlt()函数把内存绘图拷贝到屏幕上(窗口的DC)
	pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY); 

	//(6)恢复原位图,并释放创建的可兼容DC对象和CBitmap对象
	memDC.SelectObject(pOldBmp);
	memDC.DeleteDC();
	memBitmap.DeleteObject();	
}


// CGAMFCView printing

BOOL CGAMFCView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CGAMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CGAMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}


// CGAMFCView diagnostics

#ifdef _DEBUG
void CGAMFCView::AssertValid() const
{
	CView::AssertValid();
}

void CGAMFCView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CGAMFCDoc* CGAMFCView::GetDocument() const // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGAMFCDoc)));
	return (CGAMFCDoc*)m_pDocument;
}
#endif //_DEBUG


// CGAMFCView message handlers


void CGAMFCView::DrawCity(CDC* pDC, float x, float y)
{
	
	x = ToInt(m_pTvRate*x);
	y = ToInt(m_pTvRate*y);
	//CDC* pDC = this->GetDC();
	
	pDC->MoveTo(x, y);	
	CPen pen(PS_SOLID, 5, RGB(0xff, 0x00, 0x00));
	CPen *oldpen;
	oldpen = pDC->SelectObject(&pen);
	pDC->LineTo(ToInt(x),ToInt(y));//	pDC->LineTo(100, 100);
	pDC->SelectObject(oldpen);

	//pDC->DeleteDC();
}

void CGAMFCView::DrawAllCity(CDC* pDC)
{
	int i;
	//CDC* pDC = this->GetDC();		
	CString l_tmpStr;

	for(i = 0; i < m_pGA->m_BaseCityInfo.m_CityNum; ++i)
	{
		DrawCity(pDC, m_pGA->m_BaseCityInfo.m_pCities[i].x, m_pGA->m_BaseCityInfo.m_pCities[i].y);

		l_tmpStr.Format(_T("%2d"), i);
		pDC->TextOut(ToInt(m_pTvRate*m_pGA->m_BaseCityInfo.m_pCities[i].x+2),
			ToInt(m_pTvRate*m_pGA->m_BaseCityInfo.m_pCities[i].y+2),l_tmpStr);
	
		l_tmpStr.Format(_T("%2d"), i);
		pDC->TextOut(ToInt(m_pTvRate*m_pGA->m_BaseCityInfo.m_pCities[i].x+2),ToInt(m_pTvRate*m_pGA->m_BaseCityInfo.m_pCities[i].y+2),l_tmpStr);
	}
	//pDC->DeleteDC();
}

void CGAMFCView::DrawPath(CDC* pDC)
{
	DrawCityConnect(pDC);
}

void CGAMFCView::DrawCityLine(CDC* pDC, float x1, float y1, float x2, float y2)
{
	x1 = ToInt(m_pTvRate*x1);
	y1 = ToInt(m_pTvRate*y1);
	x2 = ToInt(m_pTvRate*x2);
	y2 = ToInt(m_pTvRate*y2);

	//CDC* pDC = this->GetDC();
	pDC->MoveTo(x1, y1);	

	CPen pen(PS_SOLID, 2, RGB(0x00, 0xff, 0x00));
	CPen *oldpen;
	oldpen = pDC->SelectObject(&pen);
	pDC->LineTo(x2, y2);	
	pDC->SelectObject(oldpen);	
	//pDC->DeleteDC();
}
void CGAMFCView::DrawCityConnect(CDC *pDC)
{
	//l_GA.m_pCityInfoOfMembers[0].m_pCityOrder[i]
		
	int i;
	INT l_CityNum =  m_pGA->m_BaseCityInfo.m_CityNum;
	DrawAllCity(pDC);
	for(i = 0; i < l_CityNum; ++i)
	{
		DrawCity(pDC, m_pGA->m_BaseCityInfo.m_pCities[ m_pGA->m_pCityInfoOfMembers[0].m_pCityOrder[i] ].x ,			
						m_pGA->m_BaseCityInfo.m_pCities[ m_pGA->m_pCityInfoOfMembers[0].m_pCityOrder[i] ].y);

		DrawCityLine(pDC, m_pGA->m_BaseCityInfo.m_pCities[ m_pGA->m_pCityInfoOfMembers[0].m_pCityOrder[i] ].x ,
							m_pGA->m_BaseCityInfo.m_pCities[ m_pGA->m_pCityInfoOfMembers[0].m_pCityOrder[i] ].y ,
							m_pGA->m_BaseCityInfo.m_pCities[ m_pGA->m_pCityInfoOfMembers[0].m_pCityOrder[(i+1)%l_CityNum] ].x ,
							m_pGA->m_BaseCityInfo.m_pCities[ m_pGA->m_pCityInfoOfMembers[0].m_pCityOrder[(i+1)%l_CityNum] ].y);

		DrawCity(pDC, m_pGA->m_BaseCityInfo.m_pCities[ m_pGA->m_pCityInfoOfMembers[0].m_pCityOrder[(i+1)%l_CityNum] ].x ,
						m_pGA->m_BaseCityInfo.m_pCities[ m_pGA->m_pCityInfoOfMembers[0].m_pCityOrder[(i+1)%l_CityNum] ].y);		

	}
}

int  CGAMFCView::ToInt(float x)
{
	return (int)(x + 0.5);
}
void CGAMFCView::WSDrawTSP(CDC *pDC)
{
	pDC->FillSolidRect(0, 0, 1000, 1000, 0xffffff);
	//Invalidate();
	
	DrawPath(pDC);
}
void CGAMFCView::StartDraw()
{
	CDC* pDC = this->GetDC();
	OnDraw(pDC);
	pDC->DeleteDC();
}
void CGAMFCView::TextDraw(int x, int y, CString val)
{
	CDC *pDC = this->GetDC();
	//pDC->TextOutW(x, y, val);
	pDC->TextOut(x, y, val);	
	pDC->DeleteDC();
}

⌨️ 快捷键说明

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