?? cqueen.cpp
字號:
#include "stdafx.h"
#include "cqueen.h"
Cqueen::Cqueen(int row)
{
m_bruning=false;
m_pisaveqplace=NULL;
m_pgridbitmap=NULL;//柵欄位圖
m_pplacelist=NULL;
setrow(row);
m_inowcol=0;
}
Cqueen::Cqueen()
{
m_bruning=false;
m_pisaveqplace=NULL;
m_pplacelist=NULL;
setrow(0);
}
Cqueen::~Cqueen()
{
if(m_pisaveqplace!=NULL)
delete m_pisaveqplace;
if(m_pgridbitmap!=NULL)
delete m_pgridbitmap;
freelist();
}
CSize Cqueen::getqueengridsize()//獲取棋盤柵欄的尺寸
{
return m_sizeview;
}
int Cqueen::getqueenplace(int row)//獲取皇后所在的排號
{
int ret=-1;
if(row<m_icount&&row>=0)
ret=m_pisaveqplace[row];//取得保存起來的皇后的位置
return ret;
}
void Cqueen::setrow(int row)//設置皇后棋盤的排數
{
if(m_bruning)//???
{
return;
}
m_icount=row;
m_sizeview.cx=m_icount*40;//1
m_sizeview.cy=m_icount*40;//2這兩個都是用來設置棋盤的大小的
if(row==0||m_bruning)
return;
if(m_pgridbitmap!=NULL)
{
delete m_pgridbitmap;
}
//繪制操作涉及三類對象,一類是輸出對象包括CDC及其派生類,一類是繪制工具對象文本圖形對象,CFont,CBrush,CPen等,一類是屬于基本數據類型,如CPoint,CSize,CRect等
m_pgridbitmap=new CBitmap();//位圖是一種位矩陣,每一個顯示象素都對應于其中的一個或多個位。可以利用位圖來表示圖像,也可以利用它來創建刷子。
CDC *pDC=CDC::FromHandle(::GetDC(NULL));//返回設備環境類對象的指針
CDC memdc;
memdc.CreateCompatibleDC(pDC);
CRect rect(0,0,m_sizeview.cx,m_sizeview.cy);
m_pgridbitmap->CreateCompatibleBitmap(pDC,m_sizeview.cx,m_sizeview.cy);
CBitmap *oldbmp=memdc.SelectObject(m_pgridbitmap);
//CBrush brush(RGB(255,255,0));//改變棋盤的背景色,刷子定義了一種位圖形式的像素,利用它可以對區域內部填充顏色。
//memdc.FillRect(rect,&brush);
//CBrush brushblue(RGB(0,255,255));//2改變棋盤的顏色,創建了一個顏色刷子。
for(int i=0;i<m_icount;i++)//根據棋盤的大小,劃出棋盤
{
//rect.SetRect(0,0,40,40);//確定棋盤的大小為(左上角坐標,左下角)
//rect.OffsetRect(0,i*40);//確定移動量(左右,上下)
for(int j=0;j<m_icount;j++)
{
//if(((j+i)%2))
// memdc.FillRect(rect,&brushblue);//用2的顏色填充矩形
//rect.OffsetRect(40,0);
memdc.FillSolidRect(j*40,i*40,40,40,RGB(68, 71, 140));
memdc.Draw3dRect(j*40,i*40,40,40,RGB(0,0,225),RGB(225,225,0));
}
}
memdc.SelectObject(oldbmp);
::ReleaseDC(NULL,pDC->GetSafeHdc());
if(m_pisaveqplace!=NULL)
delete m_pisaveqplace;
m_pisaveqplace=new int [m_icount];
for(int j=0;j<m_icount;j++)
{
m_pisaveqplace[j]=-1;
}
freelist();
m_pplacelist=new placelist[10];
m_ilistmaxsize=10;
m_ilistnowsize=0;
m_idrawindex=-1;
}
void Cqueen::computqueenplace(int column,CView *view)
{
int row=0;
int i;
int col;
m_inowcol=column;
if(column==m_icount)
{
addplace(m_pisaveqplace);
m_bruning=false;
return;
}
m_bruning=true;
int *iplaceover=new int [m_icount];
for(i=0;i<m_icount;i++)
{
iplaceover[i]=true;
}
for(i=0;i<column;i++)
{
col=m_pisaveqplace[i];
if((col-(column-i))>=0)
{
iplaceover[col-(column-i)]=false;
}
if((col+(column-i))<m_icount)
{
iplaceover[col+(column-i)]=false;
}
iplaceover[col]=false;
}
for(i=0;i<m_icount;i++)
{
if(iplaceover[i])
{
m_pisaveqplace[column]=i;
if(view!=NULL&&m_idrawindex==-1)
{
CDC *pDC=view->GetDC();
drawqueenn(pDC);
view->ReleaseDC(pDC);
Sleep(20);
}
computqueenplace(column+1,view);
}
}
m_bruning=false;
delete[] iplaceover;
m_inowcol=0;
}
void Cqueen::drawqueenn(CDC *pDC)//畫出皇后
{
CBitmap bitmap;
CDC memdc;
memdc.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC,m_sizeview.cx,m_sizeview.cy);
CBitmap *oldbmp=memdc.SelectObject(&bitmap);
drawgrid(&memdc);
drawqueen(&memdc);
pDC->BitBlt(0,0,m_sizeview.cx,m_sizeview.cy,&memdc,0,0,SRCCOPY);
memdc.SelectObject(oldbmp);
}
void Cqueen::drawgrid(CDC *pDC)
{
if(m_pgridbitmap!=NULL)
{
CDC memdc;
memdc.CreateCompatibleDC(pDC);
CBitmap *oldbitmap=memdc.SelectObject(m_pgridbitmap);
pDC->BitBlt(0,0,m_sizeview.cx,m_sizeview.cy,&memdc,0,0,SRCCOPY);
memdc.SelectObject(oldbitmap);
}
}
void Cqueen::drawqueen(CDC *pDC)//畫出棋盤上的皇后
{
CBrush brush(RGB(255,123,200));//給皇后填充的顏色
CRect rect;//畫皇后的區域大小
CBrush *oldbrush=pDC->SelectObject(&brush);
for(int i=0;i<=m_icount;i++)
{
rect.SetRect(0,0,40,40);//畫皇后的大小
if(m_idrawindex>-1)//瀏覽畫出的皇后時有用
rect.OffsetRect(m_pplacelist[m_idrawindex].place[i]*40,i*40);
else
rect.OffsetRect(m_pisaveqplace[i]*40,i*40);
pDC->Rectangle(rect);//確定皇后的形狀
}
pDC->SelectObject(oldbrush);
}
void Cqueen::addplace(int *place)
{
if(m_ilistnowsize==m_ilistmaxsize)
{
m_ilistmaxsize+=10;
placelist *temlist=new placelist[m_ilistmaxsize];
for(int i=0;i<m_ilistnowsize;i++)
{
temlist[i].place=m_pplacelist[i].place;
}
delete[] m_pplacelist;
m_pplacelist=temlist;
}
int *iplace=new int[m_icount];
for(int i=0;i<m_icount;i++)
{
iplace[i]=place[i];
}
m_pplacelist[m_ilistnowsize++].place=iplace;
}
void Cqueen::freelist()
{
for(int i=0;i<m_ilistnowsize;i++)
{
if(m_pplacelist[i].place!=NULL)
{
delete[] m_pplacelist[i].place;
}
}
if(m_pplacelist)
{
delete[] m_pplacelist;
}
m_ilistmaxsize=10;
m_ilistnowsize=0;
}
void Cqueen::drawlist(int index)
{
if(index<m_ilistnowsize)
{
m_idrawindex=index;
}
else
{
m_idrawindex=-1;
}
}
int Cqueen::getlistsize()
{
return m_ilistnowsize;
}
int Cqueen::getdrawindex()
{
return m_idrawindex;
}
void Cqueen::savetobmpfile()
{
CString name;
CFileDialog fdlg(false,NULL,NULL,OFN_HIDEREADONLY,"bmp file(*.bmp)|*.bmp||");
if(fdlg.DoModal()==IDOK)
{
name=fdlg.GetPathName();
CString tem;
tem=name.Right(name.GetLength()-name.ReverseFind('.'));
tem.MakeLower();
if(tem!=".bmp")
{
name+=".bmp";
}
}
else
{
return;
}
CDC *pDC=CDC::FromHandle(::GetDC(NULL));
CBitmap bm;
bm.CreateCompatibleBitmap(pDC,m_sizeview.cx,m_sizeview.cy);
CDC tdc;
tdc.CreateCompatibleDC(pDC);
CBitmap *pold=tdc.SelectObject(&bm);
drawqueenn(&tdc);
tdc.SelectObject(pold);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
LPSTR lpdata=(LPSTR)::GlobalAlloc(GPTR,size);
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
GetDIBits(pDC->GetSafeHdc(),bm,0,bih.biHeight,lpdata,(BITMAPINFO *)&bih,DIB_RGB_COLORS);
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<<8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite))
{
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bfh,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpdata,size);
bf.Close();
}
GlobalFree(lpdata);
::ReleaseDC(NULL,pDC->GetSafeHdc());
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -