📄 llkdlg.cpp
字号:
{
if (GetPicIndex(i, j) > 0)
{
if ((GetValue(i, j) & LS_CLICK) == LS_CLICK)
{
pDC->BitBlt(TILEX(j), TILEY(i), PIC_WIDTH, PIC_HEIGHT,
&HeadDC, PIC_WIDTH * (GetPicIndex(i, j) - 1), 0, SRCCOPY);
}
else
{
pDC->BitBlt(TILEX(j), TILEY(i),PIC_WIDTH, PIC_HEIGHT,
&FaceDC, PIC_WIDTH * (GetPicIndex(i, j) - 1), 0, SRCCOPY);
}
}
}
}
CPen pen( PS_SOLID ,2,RGB(0,0,255));
CPen *pOldPen = pDC->SelectObject(&pen);
if (!m_nButton && !m_bMouse) //判断是否绘选择框
{
pDC->MoveTo(m_nPane_x+14, m_nPane_y+55);
pDC->LineTo(m_nPane_x+38, m_nPane_y+55);
pDC->MoveTo(m_nPane_x+38, m_nPane_y+54);
pDC->LineTo(m_nPane_x+38, m_nPane_y+87);
pDC->LineTo(m_nPane_x+13, m_nPane_y+87);
pDC->LineTo(m_nPane_x+14, m_nPane_y+54);
}
HeadDC.DeleteDC();
FaceDC.DeleteDC();
facebmp.DeleteObject();
headbmp.DeleteObject();
pOldPen->DeleteObject();
}
int CLlkDlg::GetValue(int x, int y) //得到坐标值
{
return CJL_MAP[x][y];
}
void CLlkDlg::StartGame() //产生随机位图
{
int i, j;
int temprand;
for (i = 1; i <= ROW_NUMBER ; i++)
{
for (j = 1; j <= LINE_NUMBER ; j++)
{
while (1)
{
temprand = Random() % 21; //随机产生21张位图中的1张
if (PIC_INDEX[temprand] < 4 ) //位图使用次数小于4
{
PIC_INDEX[temprand]++;
CJL_MAP[i][j] |= temprand + 1; //选择位图
break;
}
}
}
}
InitEvent();
ListPicPlace();
}
void CLlkDlg::InitEvent() //初始化事件
{
int i, x = 0, y = 0, tempx, tempy;
int randevent, randplace;
int EVENT[4] = {LS_NONE, LS_PROMPT, LS_SHUFFLE, LS_SCORE}; //事件("无","提示","洗牌","加分")
for (i = 0; i < 4; i++)
{
randplace = Random() % (ROW_NUMBER * LINE_NUMBER) + 1;
tempy = randplace % LINE_NUMBER;
tempx = randplace / LINE_NUMBER;
if (tempx != x && tempy !=y)
{
x = tempx;
y = tempy;
randevent = Random() % 4;
CJL_MAP[tempx][tempy] |= EVENT[randevent];
}
}
}
void CLlkDlg::InitMap() //初始化位图
{
int i, j;
for(i = 0; i < VIRTUAL_ROW; i++)
{
for(j = 0; j < VIRTUAL_LINE; j++)
{
CJL_MAP[i][j] = 0;
}
}
for(i = 0; i < 28; i++)
{
PIC_INDEX[i] = 0;
PIC_PLACE[i + 1] = NULL;
}
PIC_PLACE[0] = NULL;
}
void CLlkDlg::ListPicPlace() //设置位图
{
int i, j;
for (i = 1; i < ROW_NUMBER; i++)
{
for (j = 1; j < LINE_NUMBER; j++)
{
if (GetPicIndex(i, j) > 0)
{
AddPicPlace(i, j);
}
}
}
}
void CLlkDlg::AddPicPlace(int x, int y) //链表中增加位图
{
int nIndex = GetPicIndex(x, y);
LPCJL_PATH pPic;
if ((pPic = (LPCJL_PATH) GlobalAlloc(GPTR, sizeof(CJL_PATH))) == NULL)
{
printf("GlobalAlloc() failed with error %d\n", GetLastError());
return;
}
pPic->x = x;
pPic->y = y;
pPic->prev = PIC_PLACE[nIndex];
PIC_PLACE[nIndex] = pPic;
}
int CLlkDlg::GetPicIndex(int x, int y) //得到当前的位图标识
{
int nVal = GetValue(x, y);
int nRes = nVal & 255;
return nRes;
}
void CLlkDlg::AddTime() //增加时间函数
{
if (m_nMin != 2)
{
m_nSec2 += 2; //一次增加2秒
if(m_nSec2 >= 10)
{
m_nSec1++;
m_nSec2 %= 10;
if (m_nSec1 == 6)
{
m_nMin++;
m_nSec1 = 0;
if (m_nMin == 2)
{
m_nMin = 2;
m_nSec1 = 0;
m_nSec2 = 0;
}
}
}
if (m_nPos)
{
m_nPos -= (m_nSpeed * 2); //时间条前移2单位
if (m_nPos <= 0)
m_nPos = 0;
}
}
}
BOOL CLlkDlg::CheckConn(int x1, int y1, int x2, int y2) //判断是否可连
{
if (CheckLineConn(x1, y1, x2, y2))
{
return TRUE;
}
else if (CheckOneDotConn(x1, y1, x2, y2))
{
return TRUE;
}
else if (CheckTwoDotConn(x1, y1, x2, y2))
{
return TRUE;
}
return FALSE;
}
BOOL CLlkDlg::CheckLineConn(int x1, int y1, int x2, int y2) //判断连接是否为一条线
{
if (x1 != x2 && y1 != y2)
return FALSE;
int i, nMax, nMin;
BOOL bConn;
bConn = TRUE;
if (x1 == x2)
{
nMax = max(y1, y2);
nMin = min(y1, y2);
for (i = 1; i < nMax - nMin; i++)
{
if (GetPicIndex(x1, nMin + i) != 0)
{
bConn = FALSE;
}
}
return bConn;
}
bConn = TRUE;
if (y1 == y2)
{
nMax = max(x1, x2);
nMin = min(x1, x2);
for (i = 1; i < nMax - nMin; i++)
{
if (GetPicIndex(nMin + i, y1) != 0)
{
bConn = FALSE;
}
}
return bConn;
}
return bConn;
}
BOOL CLlkDlg::CheckOneDotConn(int x1, int y1, int x2, int y2) //判断连接是否为一个拐点
{
int xMin, xMax, yMin, yMax;
xMin = min(x1, x2);
xMax = max(x1, x2);
yMin = min(y1, y2);
yMax = max(y1, y2);
if ((x1 < x2 && y1 < y2) || (x1 > x2 && y1 > y2))
{
if (CheckLineConn(xMin, yMin, xMax + 1, yMin)
&& CheckLineConn(xMax, yMin - 1, xMax, yMax))
{
return TRUE;
}
if (CheckLineConn(xMin, yMin, xMin, yMax + 1)
&& CheckLineConn(xMin -1, yMax, xMax, yMax))
{
return TRUE;
}
}
if ((x1 > x2 && y1 < y2) || (x1 < x2) && (y1 > y2))
{
if (CheckLineConn(xMax, yMin, xMin - 1, yMin)
&& CheckLineConn(xMin, yMin - 1, xMin, yMax))
{
return TRUE;
}
if (CheckLineConn(xMax, yMin, xMax, yMax + 1)
&& CheckLineConn(xMax + 1, yMax, xMin, yMax))
{
return TRUE;
}
}
return FALSE;
}
BOOL CLlkDlg::CheckTwoDotConn(int x1, int y1, int x2, int y2) //判断连接是否为两个拐点
{
int xMin, xMax, yMin, yMax, i;
xMin = min(x1, x2);
xMax = max(x1, x2);
yMin = min(y1, y2);
yMax = max(y1, y2);
if ((x1 <= x2 && y1 <= y2) || (x1 >= x2 && y1 >= y2))
{
for (i = 1; i <= yMax - yMin; i++)
{
if (CheckLineConn(xMin, yMin, xMin, yMin + i + 1)
&& CheckLineConn(xMin - 1, yMin + i, xMax + 1, yMin + i)
&& CheckLineConn(xMax, yMin + i -1, xMax, yMax))
{
return TRUE;
}
}
for (i = 1; i <= xMax - xMin; i++)
{
if (CheckLineConn(xMin, yMin, xMin + i + 1, yMin)
&& CheckLineConn(xMin + i, yMin - 1, xMin + i, yMax + 1)
&& CheckLineConn(xMin + i -1, yMax, xMax, yMax))
{
return TRUE;
}
}
if (CheckLineConn(xMax, yMin, xMax, yMax))
{
for (i = 1; i <= yMin; i++)
{
if (CheckLineConn(xMin, yMin, xMin, yMin - i)
&& CheckLineConn(xMin - 1, yMin - i, xMax + 1, yMin - i)
&& CheckLineConn(xMax, yMin - i, xMax, yMax))
{
return TRUE;
}
}
}
if (CheckLineConn(xMin, yMin, xMin, yMax))
{
for (i = 1; i<= VIRTUAL_LINE - yMax; i++)
{
if (CheckLineConn(xMin, yMin, xMin, yMax + i)
&& CheckLineConn(xMin - 1, yMax + i, xMax + 1, yMax + i)
&& CheckLineConn(xMax, yMax + i, xMax, yMax))
{
return TRUE;
}
}
}
if (CheckLineConn(xMin, yMax, xMax, yMax))
{
for (i = 1; i<= xMin; i++)
{
if (CheckLineConn(xMin, yMin, xMin - i, yMin)
&& CheckLineConn(xMin - i, yMin - 1, xMin - i, yMax + 1)
&& CheckLineConn(xMin - i, yMax, xMax, yMax))
{
return TRUE;
}
}
}
if (CheckLineConn(xMin, yMin, xMax, yMin))
{
for (i = 1; i<= VIRTUAL_ROW - xMax; i++)
{
if (CheckLineConn(xMin, yMin, xMax + i, yMin)
&& CheckLineConn(xMax + i, yMin - 1, xMax + i, yMax + 1)
&& CheckLineConn(xMax + i, yMax, xMax, yMax))
{
return TRUE;
}
}
}
}
else
{
for (i = 1; i <= yMax - yMin; i++)
{
if (CheckLineConn(xMax, yMin, xMax, yMin + i + 1)
&& CheckLineConn(xMax + 1, yMin + i, xMin - 1, yMin + i)
&& CheckLineConn(xMin, yMin + i -1, xMin, yMax))
{
return TRUE;
}
}
for (i = 1; i <= xMax - xMin; i++)
{
if (CheckLineConn(xMin, yMax, xMin + i + 1, yMax)
&& CheckLineConn(xMin + i, yMin - 1, xMin + i, yMax + 1)
&& CheckLineConn(xMin + i -1, yMin, xMax, yMin))
{
return TRUE;
}
}
if (CheckLineConn(xMin, yMax, xMin, yMin))
{
for (i = 1; i <= yMin; i++)
{
if (CheckLineConn(xMin, yMax, xMin, yMin - i)
&& CheckLineConn(xMin - 1, yMin - i, xMax + 1, yMin - i)
&& CheckLineConn(xMax, yMin - i, xMax, yMin))
{
return TRUE;
}
}
}
if (CheckLineConn(xMax, yMin, xMax, yMax))
{
for (i = 1; i <= VIRTUAL_LINE - yMax; i++)
{
if (CheckLineConn(xMin, yMax, xMin, yMax + i)
&& CheckLineConn(xMin - 1, yMax + i, xMax + 1, yMax + i)
&& CheckLineConn(xMax, yMax + i, xMax, yMin))
{
return TRUE;
}
}
}
if (CheckLineConn(xMax, yMin, xMin, yMin))
{
for (i = 1; i <= xMin; i++)
{
if (CheckLineConn(xMin, yMax, xMin - i, yMax)
&& CheckLineConn(xMin - i, yMax + 1, xMin - i, yMin - 1)
&& CheckLineConn(xMin - i, yMin, xMax, yMin))
{
return TRUE;
}
}
}
if (CheckLineConn(xMin, yMax, xMax, yMax))
{
for (i = 1; i <= VIRTUAL_ROW - xMax; i++)
{
if (CheckLineConn(xMin, yMax, xMax + i, yMax)
&& CheckLineConn(xMax + i, yMax + 1, xMax + i, yMin - 1)
&& CheckLineConn(xMax + i, yMin, xMax, yMin))
{
return TRUE;
}
}
}
}
return FALSE;
}
void CLlkDlg::DrawSemiTransparentRect(CDC *pDstDC, CRect rtTran, COLORREF clrSrc) //半透明函数
{
int nSavedDC = pDstDC->SaveDC();//保存原始DC
int nWidth = rtTran.Width();//半透明区域的宽度
int nHeight = rtTran.Height();//半透明区域的高度
//拷屏 , 新建一个DC来拷贝目标区域
CDC bmpDC;
bmpDC.CreateCompatibleDC(pDstDC);
CBitmap bmp ;
bmp.CreateCompatibleBitmap(pDstDC , nWidth , nHeight);
CBitmap* pOldBmp = (CBitmap*)bmpDC.SelectObject(&bmp);
bmpDC.BitBlt(0 , 0 , nWidth , nHeight , pDstDC , rtTran.left , rtTran.top , SRCCOPY);
//获取bmpDC中的图形数据到BYTE数组
HDC hDIBDC = CreateCompatibleDC(NULL);
BITMAPINFO hdr;
ZeroMemory(&hdr , sizeof(BITMAPINFO));
hdr.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
hdr.bmiHeader.biWidth = nWidth;
hdr.bmiHeader.biHeight = nHeight;
hdr.bmiHeader.biPlanes = 1;
hdr.bmiHeader.biBitCount = 32;
//这里统一用32位图形 ,原因是32位图形结构相对固定 , 每个
//像素用4个字节表示 。每行末尾不需要添加额外的字节。
//而24位图形 , 每行末尾需要添加额外的字节 , 以保证每行的
//字节数是4的整数倍
//如果想缩减开销和字节数 , 可以采用24位的图形 ,不过就会多
//出一些判断添加额外自己的代码 。
BYTE * pbtPixels = NULL ;
HBITMAP hDIBitmap = CreateDIBSection(hDIBDC,(BITMAPINFO *)&hdr,DIB_RGB_COLORS,(void **)&pbtPixels,NULL,0);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hDIBDC, hDIBitmap);
BitBlt(hDIBDC,0,0,nWidth,nHeight,bmpDC.m_hDC,0,0,SRCCOPY);
SelectObject(hDIBDC, hOldBmp);
//对BYTE数组进行Alpha混和
int nPixelSize = 4 ;//每个像素点用4个字节来存储
BYTE btSR = GetRValue(clrSrc);
BYTE btSG = GetGValue(clrSrc);
BYTE btSB = GetBValue(clrSrc);
for(int i = 0 ; i < nHeight ; i ++)
{
for(int j = 0 ; j < nWidth ; j ++)
{
BYTE btB = pbtPixels[i * nWidth * nPixelSize + j * nPixelSize ] ;
BYTE btG = pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 1 ] ;
BYTE btR = pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 2 ] ;
btB = (btSB + btB ) >> 1 ;
btG = (btSG + btG ) >> 1 ;
btR = (btSR + btR ) >> 1 ;
// btB = btSB * 0.1 + (1-0.1) * btB;
// btG = btSG * 0.1 + (1-0.1) * btG;
// btR = btSR * 0.1 + (1-0.1) * btR;
pbtPixels[i * nWidth * nPixelSize + j * nPixelSize ] = btB ;
pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 1 ] = btG ;
pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 2 ] = btR ;
}
}
//绘制最终半透明图形到目标区域
SetDIBitsToDevice(pDstDC->GetSafeHdc(),rtTran.left,rtTran.top,nWidth,nHeight,
0,0,0,nHeight,(void*)pbtPixels,(BITMAPINFO*)&hdr,DIB_RGB_COLORS);
//析构和清空
bmpDC.SelectObject(pOldBmp);
bmp.DeleteObject();
delete [] pbtPixels ;
bmpDC.DeleteDC();
DeleteObject(hDIBDC);
DeleteObject(hDIBitmap);
pDstDC->RestoreDC(nSavedDC);//恢复初始DC
pbtPixels=NULL;
}
void CLlkDlg::DrawTime(CDC *pDC, CString min, CString sec1, CString sec2) //绘时间条
{
CDC Mydc1,Mydc2;
CBitmap TimeFram,TimeLable;
TimeFram.LoadBitmap(IDB_TIMEFRAM);
TimeLable.LoadBitmap(IDB_TIMELABLE);
int time = int(155 - GetPos());
Mydc1.CreateCompatibleDC(pDC);
Mydc1.SelectObject(&TimeFram);
Mydc2.CreateCompatibleDC(pDC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -