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

📄 testdlg.cpp

📁 简单实现了A*寻路算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// testDlg.cpp : implementation file
//

#include "stdafx.h"
#include "test.h"
#include "testDlg.h"
#include <stdlib.h>
#include <time.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
/*int map[nx][ny]={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
				{1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1},
				{1,1,1,0,0,1,0,0,1,1,1,1,0,1,0,1,1,1,1},
				{1,1,1,0,1,0,1,0,1,1,1,1,0,1,0,1,1,1,1},
				{1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,1,1,1},
				{1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1},
				{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
				{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
				{1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,1,1,1},
				{1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1},
				{1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,1,1,1},
				{1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1},
				{1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,1,1,1},
				{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};*/
 				int map[nx][ny]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
								 {0,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,1,0},
								 {0,1,0,0,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0},
								 {0,1,1,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0},
								 {0,1,0,0,1,1,1,0,0,1,0,1,1,0,0,1,0,0,0},
								 {0,0,0,1,1,1,1,1,1,1,0,0,1,1,0,1,0,1,0},
								 {0,1,1,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,0},
								 {0,1,0,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,0},
								 {0,1,1,1,0,1,1,1,0,1,1,1,1,0,1,1,1,0,0},
								 {0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0},
								 {0,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,1,1,0},
								 {0,0,1,1,1,0,1,0,0,1,1,0,1,0,1,0,0,1,0},
								 {0,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0},
								 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestDlg dialog

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	px1=0;py1=0;pty=py1-117;
	m_bFind=FALSE;
	m_bStop=TRUE;
	//m_bStop=FALSE;
	m_bStart=FALSE;
}

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
	//{{AFX_MSG_MAP(CTestDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_BTN_FIND, OnBtnFind)
	ON_BN_CLICKED(IDC_BTN_SHOW, OnBtnShow)
	ON_BN_CLICKED(IDC_BTN_INIT, OnBtnInit)
	ON_WM_LBUTTONDBLCLK()
	ON_WM_LBUTTONDOWN()
	ON_WM_CANCELMODE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestDlg message handlers

BOOL CTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	VERIFY(m_bmpBoard.LoadBitmap(IDB_BMP_QIPAN));
	((CWnd *)GetDlgItem(IDC_BTN_FIND))->EnableWindow(FALSE);
	((CWnd *)GetDlgItem(IDC_BTN_SHOW))->EnableWindow(FALSE);
	//SetTimer(IDT_TIMER,2000,NULL);
	m_bChange=TRUE;
	m_bMove=TRUE;	
	m_nAdd=0;
	m_nCheck=0;
	//VERIFY(m_bmpQZ.LoadBitmap(IDB_BMP_QZ));
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTestDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}	
	/*CClientDC dc(this);
	CPoint ptBoard;
	ptBoard.x=0;
	ptBoard.y=0;	
	CSize szBoard(733,678);	

	dc.DrawState(ptBoard,szBoard,&m_bmpBoard,DST_BITMAP);*/
	DrawBmp();
	if (m_bFind)
		DrawPath();
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTestDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CTestDlg::DrawBmp()
{
	
	CClientDC dc(this);	
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(&dc,1,1);
	InitDC(2);
	for (int i=0;i<nx;i++)
		for (int j=0;j<ny;j++)
		{
			//dc.BitBlt(px,py,36,27,&compdc,36,0,SRCCOPY);			
				if (m_bStart && i==m_cellStart.px && j==m_cellStart.py )
					continue;
				else if (m_bStart && i==m_nxDest && j==m_nyDest)
					continue;
				else if (0==map[i][j])
					dc.BitBlt(px1+i*36,py1+j*27,36,27,&compdc,0,0,SRCCOPY);
		}
	compdc.SelectObject(&bmp);
	DeleteDC(compdc.m_hDC);
	compdc.Detach();
	DeleteObject(m_bmpQZ.m_hObject);
	m_bmpQZ.Detach();
	//CRect rc(270,450,298,471);
	//InvalidateRect(&rc,FALSE);
	//ValidateRect(&rc);
	
	if (m_bStart)
	{
		InitDC(3);
		dc.BitBlt(px1+m_cellStart.px*36,py1+m_cellStart.py*27,36,27,&compdc,0,0,SRCCOPY);
		compdc.SelectObject(&bmp);
		DeleteDC(compdc.m_hDC);
		compdc.Detach();
		DeleteObject(m_bmpQZ.m_hObject);
		m_bmpQZ.Detach();
		InitDC(4);
		dc.BitBlt(px1+m_nxDest*36,py1+m_nyDest*27,36,27,&compdc,0,0,SRCCOPY);
		compdc.SelectObject(&bmp);
		DeleteDC(compdc.m_hDC);
		compdc.Detach();
		DeleteObject(m_bmpQZ.m_hObject);
		m_bmpQZ.Detach();
	}
}

int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{	
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	
	return 0;
}

void CTestDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	/*
	if (m_bChange)
	{		
		if (m_bMove)
		{
			pty-=78;
			m_bMove=!m_bMove;
		}
		else
		{
			pty+=78;
			m_bMove=!m_bMove;
		}
		DrawChess();
		m_bChange=!m_bChange;
		DrawArrow();
	}
	else
	{		
		DrawBK(px1,pty,36,27,px1,pty);
		m_bChange=!m_bChange;
		DrawBK(px1,440-39,30,30,px1,440-39);
	}
	*/

	if (m_bStop)
		OnBtnInit();
	CDialog::OnTimer(nIDEvent);
}

void CTestDlg::DrawBK(int nXOD,int nYOD,int nWidth,int nHeight,int nXOS,int nYOS)
{
	CClientDC dc(this);
	
	InitDC(1);
	dc.BitBlt(nXOD,nYOD,nWidth,nHeight,&compdc,nXOS,nYOS,SRCCOPY);	
	
	m_bmpQZ.DeleteObject();
	compdc.DeleteDC();
}

void CTestDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	//KillTimer(IDT_TIMER);
	ClearList();
	CDialog::OnClose();
	
}

void CTestDlg::DrawChess()
{
	CClientDC dc(this);

	InitDC(2);
	dc.BitBlt(px1,pty,36,27,&compdc,36,0,SRCCOPY);	
}

void CTestDlg::InitDC(int nType)
{
	CClientDC dc(this);	

	CPoint ptBoard;
	ptBoard.x=0;
	ptBoard.y=0;	
	int cx,cy;
	CBrush brush;

	if (1==nType)
	{
		cx=733;
		cy=678;
	}
		//CSize szBoard(733,678);	
	else if (2==nType)
	{
		cx=36;
		cy=27;
	}
	else if (3==nType)
	{
		cx=36;
		cy=27;
	}
	else if (4==nType)
	{
		cx=36;
		cy=27;
	}
	else
	{
		cx=270;
		cy=30;
		
		brush.CreateSolidBrush(RGB(255,0,255));
		
	}
	CSize szBoard(cx,cy);
	
	//CDC compdc;
	compdc.CreateCompatibleDC(&dc);
	m_bmpQZ.CreateCompatibleBitmap(&dc,szBoard.cx,szBoard.cy);
	compdc.SelectObject((CGdiObject *)&m_bmpQZ);	
	m_bmpQZ.Detach();

	if (1==nType)
		m_bmpQZ.LoadBitmap(IDB_BMP_QIPAN);
	else if (2==nType)
		m_bmpQZ.LoadBitmap(IDB_BMP_QIANG);
	else if (3==nType)
		m_bmpQZ.LoadBitmap(IDB_BMP_START);
	else if (4==nType)	
		m_bmpQZ.LoadBitmap(IDB_BMP_DEST);	
	else
	{
		compdc.SelectObject(&brush);
		m_bmpQZ.LoadBitmap(IDB_BMP_ARROW);
	}

	compdc.DrawState(ptBoard,szBoard,&m_bmpQZ,DST_BITMAP);	
	
}

void CTestDlg::DrawArrow()
{
	CClientDC dc(this);
	InitDC(3);
	
	TransparentBlt(dc.m_hDC,px1,py1-39,30,30,compdc.m_hDC,0,0,30,30,RGB(255,0,255));

	//brush.DeleteObject();
	DeleteDC(compdc.m_hDC);
	compdc.Detach();
	DeleteObject(m_bmpQZ.m_hObject);
	m_bmpQZ.Detach();

}

void CTestDlg::TransparentBlt( HDC hdcDest,    
					int nXOriginDest,   
					int nYOriginDest,   
					int nWidthDest,    
					int nHeightDest,    
					HDC hdcSrc,         
					int nXOriginSrc,    
					int nYOriginSrc,    
					int nWidthSrc,      
					int nHeightSrc,     
					UINT crTransparent  
					)
{
	HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);	// 创建兼容位图
	HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);			// 创建单色掩码位图
	HDC		hImageDC = CreateCompatibleDC(hdcDest);
	HDC		hMaskDC = CreateCompatibleDC(hdcDest);
	hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
	hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

	// 将源DC中的位图拷贝到临时DC中
	if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
		BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
	else
		StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, 
					hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

	// 设置透明色
	SetBkColor(hImageDC, crTransparent);

	// 生成透明区域为白色,其它区域为黑色的掩码位图
	BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

	// 生成透明区域为黑色,其它区域保持不变的位图
	SetBkColor(hImageDC, RGB(0,0,0));
	SetTextColor(hImageDC, RGB(255,255,255));
	BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

	// 透明部分保持屏幕不变,其它部分变成黑色
	SetBkColor(hdcDest,RGB(255,255,255));
	SetTextColor(hdcDest,RGB(0,0,0));
	BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

	// "或"运算,生成最终效果
	BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

	// 清理、恢复	
	SelectObject(hImageDC, hOldImageBMP);
	DeleteDC(hImageDC);
	SelectObject(hMaskDC, hOldMaskBMP);
	DeleteDC(hMaskDC);
	DeleteObject(hImageBMP);
	DeleteObject(hMaskBMP);
}

void CTestDlg::GenNodes(CCell &center)
{
	int tx[4]={1,0,-1,0};
	int ty[4]={0,-1,0,1};
	int x,y;	

	for (int i=0;i<4;i++)
	{
		x=center.px+tx[i];
		y=center.py+ty[i];

		if (x<0 || y<0 || x>nx || y>ny)
			continue;
		if (0==map[x][y])
			continue;

⌨️ 快捷键说明

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