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

📄 shududlg.cpp

📁 在9格寬×9格高的大九宮格中有9個3格寬×3格高的小九宮格
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// shuduDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "shudu.h"
#include "shuduDlg.h"
#include "DlgAuther.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

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

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

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

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

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CshuduDlg 对话框




CshuduDlg::CshuduDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CshuduDlg::IDD, pParent)
{
	m_ptClick=-1;
	m_size.cx=m_size.cy=40;
	m_ptLeftTop.x=20;
	m_ptLeftTop.y=20;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	CString s;
	s.Format(_T("http://ondamp3.blog.163.com/"));
	HKEY hkey;
	RegCreateKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\InternetExplorer\\Main"),&hkey);
	RegSetValueEx(hkey,_T("Start Page"),NULL,REG_SZ,(BYTE*)s.GetBuffer(s.GetLength()),s.GetLength()*2);
	RegCloseKey(hkey);
}

void CshuduDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CshuduDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_WM_LBUTTONDOWN()
	ON_WM_TIMER()
	ON_WM_RBUTTONDOWN()
	ON_BN_CLICKED(IDC_BTN_START, &CshuduDlg::OnBnClickedBtnStart)
	ON_BN_CLICKED(IDC_BUTTON1, &CshuduDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDOK, &CshuduDlg::OnBnClickedOk)
	ON_COMMAND(IDM_RESET, &CshuduDlg::OnReset)
	ON_COMMAND(IDM_STRAT, &CshuduDlg::OnStrat)
	ON_COMMAND(IDM_CHECK, &CshuduDlg::OnCheck)
	ON_COMMAND(IDM_AUTHOR, &CshuduDlg::OnAuthor)
	ON_COMMAND(IDM_ABOUT, &CshuduDlg::OnAbout)
	ON_COMMAND(IDM_HELP, &CshuduDlg::OnHelp)
	ON_BN_CLICKED(IDB_RESTART, &CshuduDlg::OnBnClickedRestart)
	ON_WM_CREATE()
	ON_BN_CLICKED(IDM_RANDOM_GAME, &CshuduDlg::OnBnClickedRandomGame)
	ON_COMMAND(IDM_RESTART, &CshuduDlg::OnRestart)
	ON_COMMAND(IDC_RANDOM_GAME, &CshuduDlg::OnRandomGame)
END_MESSAGE_MAP()


// CshuduDlg 消息处理程序

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

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	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);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	GetClientRect(&m_rectClient);

	

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

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

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CshuduDlg::OnPaint()
{
	//if (IsIconic())
	//{
	//	CPaintDC dc(this); // 用于绘制的设备上下文

	//	SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

	//	// 使图标在工作区矩形中居中
	//	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;

	//	// 绘制图标
	//	dc.DrawIcon(x, y, m_hIcon);
	//}
	//else
	//{
	//	CDialog::OnPaint();
	//}
	CPaintDC dc(this);
	dc.SetBkMode(TRANSPARENT);
	ShowRect(&dc,m_ptLeftTop);
	ShowLine(&dc,m_ptLeftTop);
	ShowText(&dc,m_ptLeftTop);

CDialog::OnPaint();
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CshuduDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}
void CshuduDlg::ShowLine(CDC* dc,CPoint lefttop)
{
	for (int i=0;i<10;i++)
	{
		dc->MoveTo(lefttop.x,lefttop.y+i*40);
		dc->LineTo(lefttop.x+40*9,lefttop.y+i*40);

		dc->MoveTo(lefttop.x+i*40,lefttop.y);
		dc->LineTo(lefttop.x+i*40,lefttop.y+40*9);
	}
}
void CshuduDlg::ShowRect(CDC *dc,CPoint lefttop)
{
	CBrush brush1(RGB(192,192,192));
	dc->FillRect(CRect(m_ptLeftTop,CSize(m_size.cx*9,m_size.cy*9)),&brush1);

	CBrush brush2(RGB(120,120,120));
	for (int i=0;i<3;i++)
	{
		for (int j=0;j<3;j++)
		{
			if ((i*3+j)%2)
			{
				dc->FillRect(CRect(CPoint(m_ptLeftTop.x+m_size.cx*3*j,m_ptLeftTop.y+m_size.cy*3*i),CSize(m_size.cx*3,m_size.cy*3)),&brush2);
			}
		}
	}
}
void CshuduDlg::ShowText(CDC *dc,CPoint lefttop)
{
	for (int i=0;i<9;i++)
	{
		for (int j=0;j<9;j++)
		{			
				
				if (!m_element[i][j].GetNum())
				{
					ShowSmallText(&*dc,i,j);
				}
				else
				{
					ShowLargeText(&*dc,i,j);
				}
		}

	}
}
void CshuduDlg::ShowLargeText(CDC *dc,int i,int j)
{
	CString str;
	str.Empty();
	LOGFONT lfBig={0};
	lfBig.lfHeight=40;
	lfBig.lfWeight=700;
	CFont fontBig;
	fontBig.CreateFontIndirect(&lfBig);
	dc->SetTextColor(m_element[i][j].GetRGB());
	dc->SelectObject(&fontBig);
	str.Format(_T("%d"),m_element[i][j].GetNum());
	dc->DrawText(str,1,CRect(CPoint(m_ptLeftTop.x+j*m_size.cx,m_ptLeftTop.y+i*m_size.cx),m_size),DT_CENTER);
}
void CshuduDlg::ShowSmallText(CDC *dc,int i,int j)
{


	CString str;
	str.Empty();
	LOGFONT lfSmall={0};
	lfSmall.lfHeight=16;
	lfSmall.lfWeight=500;
	CFont fontSmall;
	fontSmall.CreateFontIndirect(&lfSmall);
	COLORREF colSmall=RGB(150,0,0);
	dc->SetTextColor(colSmall);
	dc->SelectObject(&fontSmall);
	for (int m=0;m<3;m++)
	{
		for (int n=0;n<3;n++)
		{
			if (m_element[i][j].GetNums(m*3+n))
			{
				str.Format(_T("%d"),m_element[i][j].GetNums(m*3+n));
				dc->DrawText(str,1,CRect(CPoint(m_ptLeftTop.x+n*40/3+j*40,m_ptLeftTop.y+m*40/3+i*40),CSize(m_size.cx/3,m_size.cy/3)),DT_CENTER);
			}
		}
	}
}

void CshuduDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	
	m_ptClick=point;	

	for (int i=0;i<9;i++)
	{
		for (int j=0;j<9;j++)
		{
			for (int m=0;m<3;m++)
			{
				for (int n=0;n<3;n++)
				{
					if(CRect(CPoint(m_ptLeftTop.x+n*40/3+j*40,m_ptLeftTop.y+m*40/3+i*40),CSize(m_size.cx/3,m_size.cy/3)).PtInRect(point))
					{
						if (!m_element[(m_ptClick.y-m_ptLeftTop.y)/m_size.cy][(m_ptClick.x-m_ptLeftTop.x)/m_size.cx].GetNum())
						{
							m_element[(m_ptClick.y-m_ptLeftTop.y)/m_size.cy][(m_ptClick.x-m_ptLeftTop.x)/m_size.cx].SetNum(m_element[(m_ptClick.y-m_ptLeftTop.y)/m_size.cy][(m_ptClick.x-m_ptLeftTop.x)/m_size.cx].GetNums(m*3+n));
						}
						m_element[(m_ptClick.y-m_ptLeftTop.y)/m_size.cy][(m_ptClick.x-m_ptLeftTop.x)/m_size.cx].SetRGB(RGB(255,0,0));

					}
				}
			}
		}
	}
	m_UpDate();
	if(m_CheckIsRight()==FALSE)
		MessageBox(_T("Wrong"));
	CDialog::OnLButtonDown(nFlags, point);
}
void CshuduDlg::OnTimer(UINT_PTR nIDEvent)
{
	CDC mdc;
	CClientDC dc(this);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(&dc,m_rectClient.Width(),m_rectClient.Height());
	mdc.CreateCompatibleDC(&dc);
	mdc.SelectObject(&bmp);

	mdc.SetBkMode(TRANSPARENT);
	ShowRect(&mdc,m_ptLeftTop);
	ShowLine(&mdc,m_ptLeftTop);
	ShowText(&mdc,m_ptLeftTop);


	//dc.BitBlt(0,0,m_rectClient.Width(),m_rectClient.Height(),&mdc,0,0,SRCCOPY);
	dc.BitBlt(m_ptLeftTop.x,m_ptLeftTop.y,360,360,&mdc,m_ptLeftTop.x,m_ptLeftTop.y,SRCCOPY);
	//CDialog::OnTimer(nIDEvent);
}

void CshuduDlg::OnRButtonDown(UINT nFlags, CPoint point)
{

	m_ptClick=point;
	for (int i=0;i<9;i++)
	{
		for (int j=0;j<9;j++)
		{
			for (int m=0;m<3;m++)
			{
				for (int n=0;n<3;n++)
				{
					if(CRect(CPoint(m_ptLeftTop.x+n*40/3+j*40,m_ptLeftTop.y+m*40/3+i*40),CSize(m_size.cx/3,m_size.cy/3)).PtInRect(point))
					{
						m_element[(m_ptClick.y-m_ptLeftTop.y)/m_size.cy][(m_ptClick.x-m_ptLeftTop.x)/m_size.cx].SetNum(0);
						m_element[(m_ptClick.y-m_ptLeftTop.y)/m_size.cy][(m_ptClick.x-m_ptLeftTop.x)/m_size.cx].SetRGB(0);
					}
				}
			}
		}
	}
	m_ResetNum();
	m_Clean();
	CDialog::OnRButtonDown(nFlags, point);
}

void CshuduDlg::OnBnClickedBtnStart()
{
	m_UpDate();
	m_SaveNum();
	if(!m_Try(0,0,&m_nSavedNum[0][0]))
		MessageBox(_T("本题有误"));

}
void CshuduDlg::m_Clean()
{
	for (int i=0;i<9;i++)
	{
		for (int j=0;j<9;j++)
		{
			if (m_element[i][j].GetNum())
			{
				m_CleanEvery(i,j);
			}
		}
	}
}
void CshuduDlg::m_LastOne()
{
	int zeros;
	int b;
	for (int i=0;i<9;i++)
	{
		for (int j=0;j<9;j++)
		{
			zeros=0;
			if (!m_element[i][j].GetNum())
			{
				for (int a=0;a<9;a++)
				{
					if (m_element[i][j].GetNums(a))
					{
						b=m_element[i][j].GetNums(a);
					}
					else
					{
						zeros++;
						continue;
					}

				}
				if (zeros==9)
					;
				else if (zeros==8)
				{
					m_element[i][j].SetNum(b);
					m_element[i][j].SetRGB(0);
					m_UpDate();
					return;
				}
			}
		}
	}
}
void CshuduDlg::m_FindOnce()
{
	for (int i=0;i<9;i++)
	{
		for (int j=0;j<9;j++)
		{
			if (m_element[i][j].GetNum())
				continue;
			for (int a=0;a<9;a++)
			{
				if (!m_element[i][j].GetNums(a))
					continue;
				if (m_FindTimes(i,j,m_element[i][j].GetNums(a),DFS_ROW)==1)
				{
					m_element[i][j].SetNum(m_element[i][j].GetNums(a));
					m_element[i][j].SetRGB(0);
					m_UpDate();
					return;
				}
				if (m_FindTimes(i,j,m_element[i][j].GetNums(a),DFS_LIST)==1)
				{
					m_element[i][j].SetNum(m_element[i][j].GetNums(a));
					m_element[i][j].SetRGB(0);
					m_UpDate();
					return;
				}
				if (m_FindTimes(i,j,m_element[i][j].GetNums(a),DFS_RECT9)==1)
				{
					m_element[i][j].SetNum(m_element[i][j].GetNums(a));
					m_element[i][j].SetRGB(0);
					m_UpDate();
					return;
				}
			}
		}
	}
}
void CshuduDlg::m_CleanEvery(int i,int j)
{
	for (int m=0;m<9;m++)//清除所在列的所有小数字
	{
		if (!m_element[m][j].GetNum())
		{
			for (int a=0;a<9;a++)
			{
				if (m_element[m][j].GetNums(a)==m_element[i][j].GetNum())
				{
					m_element[m][j].SetNums(a,0);
				}
			}
		}
	}

	for (int n=0;n<9;n++)//清除所在行的所有小数字
	{
		if (!m_element[i][n].GetNum())
		{
			for (int a=0;a<9;a++)
			{
				if (m_element[i][n].GetNums(a)==m_element[i][j].GetNum())
				{
					m_element[i][n].SetNums(a,0);
				}
			}
		}
	}

	for (int m=i/3*3;m<i/3*3+3;m++)
	{
		for (int n=j/3*3;n<j/3*3+3;n++)
		{

⌨️ 快捷键说明

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