📄 taiqiudlg.cpp
字号:
int nPos=41;//目标球在内存位图中的位置
int nj;
pDC=GetDC();
pMemDC=new CDC;
pBmp=new CBitmap;
pMemDC->CreateCompatibleDC(pScreenDC);
pBmp->CreateCompatibleBitmap(pScreenDC, 82, 82);//创建一个82x82的屏幕位图
pOldBmp=pMemDC->SelectObject(pBmp);
//把目标球为中心的82x82位图选入内存
pMemDC->BitBlt(0, 0, 82, 82, pScreenDC, m_ptObjectBall.x-nPos, m_ptObjectBall.y-nPos, SRCCOPY);
pOldPen=(CPen *)pMemDC->SelectStockObject(WHITE_PEN);
//pMemDC->SetPixel(nPos, nPos, RGB(255, 255, 255));
CDashLine line01(pMemDC, pattern, sizeof(pattern)/sizeof(unsigned));
//上左洞垂线
line01.MoveTo(m_ptVerLine[0][0].x+nPos, m_ptVerLine[0][0].y+nPos);
line01.LineTo(m_ptCueBallPos[0].x+nPos, m_ptCueBallPos[0].y+nPos);
line01.LineTo(m_ptVerLine[0][1].x+nPos, m_ptVerLine[0][1].y+nPos);
//上中洞垂线
line01.MoveTo(m_ptVerLine[1][0].x+nPos, m_ptVerLine[1][0].y+nPos);
line01.LineTo(m_ptCueBallPos[1].x+nPos, m_ptCueBallPos[1].y+nPos);
line01.LineTo(m_ptVerLine[1][1].x+nPos, m_ptVerLine[1][1].y+nPos);
//上右洞垂线
line01.MoveTo(m_ptVerLine[2][0].x+nPos, m_ptVerLine[2][0].y+nPos);
line01.LineTo(m_ptCueBallPos[2].x+nPos, m_ptCueBallPos[2].y+nPos);
line01.LineTo(m_ptVerLine[2][1].x+nPos, m_ptVerLine[2][1].y+nPos);
//下左洞垂线
line01.MoveTo(m_ptVerLine[3][0].x+nPos, m_ptVerLine[3][0].y+nPos);
line01.LineTo(m_ptCueBallPos[3].x+nPos, m_ptCueBallPos[3].y+nPos);
line01.LineTo(m_ptVerLine[3][1].x+nPos, m_ptVerLine[3][1].y+nPos);
//下中洞垂线
line01.MoveTo(m_ptVerLine[4][0].x+nPos, m_ptVerLine[4][0].y+nPos);
line01.LineTo(m_ptCueBallPos[4].x+nPos, m_ptCueBallPos[4].y+nPos);
line01.LineTo(m_ptVerLine[4][1].x+nPos, m_ptVerLine[4][1].y+nPos);
//下右洞垂线
line01.MoveTo(m_ptVerLine[5][0].x+nPos, m_ptVerLine[5][0].y+nPos);
line01.LineTo(m_ptCueBallPos[5].x+nPos, m_ptCueBallPos[5].y+nPos);
line01.LineTo(m_ptVerLine[5][1].x+nPos, m_ptVerLine[5][1].y+nPos);
pMemDC->SelectObject(&pen);
int nx, ny;
for(nj=0; nj<6; nj++)
{
//对击球点坐标在内存位图中修正
nx=m_ptCueBallPos[nj].x+nPos;
ny=m_ptCueBallPos[nj].y+nPos;
//画出目标球心到击球点的连线
pMemDC->MoveTo(41, 41);
pMemDC->LineTo(nx, ny);
}
//画出击球点圆
pOldBrush=(CBrush *)pMemDC->SelectStockObject(NULL_BRUSH);
pMemDC->Ellipse(23, 23, 59, 59);
//击球点
pMemDC->SetPixel(m_ptCueBallPos[0].x+nPos, m_ptCueBallPos[0].y+nPos, RGB(255, 0, 0));
pMemDC->SetPixel(m_ptCueBallPos[1].x+nPos, m_ptCueBallPos[1].y+nPos, RGB(255, 0, 0));
pMemDC->SetPixel(m_ptCueBallPos[2].x+nPos, m_ptCueBallPos[2].y+nPos, RGB(255, 0, 0));
pMemDC->SetPixel(m_ptCueBallPos[3].x+nPos, m_ptCueBallPos[3].y+nPos, RGB(255, 0, 0));
pMemDC->SetPixel(m_ptCueBallPos[4].x+nPos, m_ptCueBallPos[4].y+nPos, RGB(255, 0, 0));
pMemDC->SetPixel(m_ptCueBallPos[5].x+nPos, m_ptCueBallPos[5].y+nPos, RGB(255, 0, 0));
//显示出来
pScreenDC->BitBlt(m_ptObjectBall.x-nPos, m_ptObjectBall.y-nPos, 82, 82, pMemDC, 0, 0, SRCCOPY);
pMemDC->SelectObject(pOldBmp);
pMemDC->SelectObject(pOldBrush);
pMemDC->SelectObject(pOldPen);
ReleaseDC(pDC);
delete pMemDC;
delete pBmp;
pMemDC=NULL;
pBmp=NULL;
}
break;
}
::DeleteDC(hScreenDC);
CDialog::OnTimer(nIDEvent);
}
void CTaiQiuDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
KillTimer(m_nTimer);
delete m_pBmp;
m_pBmp=NULL;
UnregisterHotKey(this->m_hWnd, MYHOTKEY);
UnregisterHotKey(this->m_hWnd, MYHOTKEY01);
if(!m_pFloatThread)
{
m_pFloatThread->PostThreadMessage(WM_QUIT, NULL, NULL);
}
CDialog::OnClose();
}
LRESULT CTaiQiuDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
{
if(!m_bMinimize)//如果不是最小化状态
{
CDC * pDC;
CDC * pMemDC;
CBitmap * pOldBmp;
// CBrush * pOldBrush;
HDC hScreenDC=::GetDC(NULL);
CDC * pScreenDC=CDC::FromHandle(hScreenDC);
POINT pt;
double dDst[6];
double dAlfa[6][2];
int nLine=1116;//18*62
// double dLine01;
//double dDist;
int nBall=18;//球直径
int nVerLine=36;//垂线长度
switch(wParam)
{
case MYHOTKEY://定位目标球
if(m_strStatus!="F2定位台桌(已定位)")
{
MessageBox("请先按F2键定位台桌!", "Information", MB_OK);
}
else
{
m_bPaint^=TRUE;//显示击球点
if(m_bPaint)
{
GetCursorPos(&pt);
//目标球球心坐标
pt.x=pt.x+10;
pt.y=pt.y-10;
pDC=GetDC();
pMemDC=new CDC;
pMemDC->CreateCompatibleDC(pDC);
pOldBmp=pMemDC->SelectObject(m_pBmp);
//把窗口Img01的图像拷入位图m_pBmp中
pMemDC->BitBlt(0, 0, 79, 79, pDC, m_rctImg01.left, m_rctImg01.top, SRCCOPY);
//计算目标球与6个球洞的距离
dDst[0]=sqrt(pow((pt.x-m_ptBallHoleTopLeft.x), 2)+pow((pt.y-m_ptBallHoleTopLeft.y), 2));
dDst[1]=sqrt(pow((pt.x-m_ptBallHoleTopMiddle.x), 2)+pow((pt.y-m_ptBallHoleTopMiddle.y), 2));
dDst[2]=sqrt(pow((pt.x-m_ptBallHoleTopRight.x), 2)+pow((pt.y-m_ptBallHoleTopRight.y), 2));
dDst[3]=sqrt(pow((pt.x-m_ptBallHoleBottomLeft.x), 2)+pow((pt.y-m_ptBallHoleBottomLeft.y), 2));
dDst[4]=sqrt(pow((pt.x-m_ptBallHoleBottomMiddle.x), 2)+pow((pt.y-m_ptBallHoleBottomMiddle.y), 2));
dDst[5]=sqrt(pow((pt.x-m_ptBallHoleBottomRight.x), 2)+pow((pt.y-m_ptBallHoleBottomRight.y), 2));
//计算新母球的位置
dAlfa[0][0]=((double)(pt.x-m_ptBallHoleTopLeft.x))/dDst[0];
dAlfa[0][1]=((double)(pt.y-m_ptBallHoleTopLeft.y))/dDst[0];
dAlfa[1][0]=((double)(pt.x-m_ptBallHoleTopMiddle.x))/dDst[1];
dAlfa[1][1]=((double)(pt.y-m_ptBallHoleTopMiddle.y))/dDst[1];
dAlfa[2][0]=((double)(pt.x-m_ptBallHoleTopRight.x))/dDst[2];
dAlfa[2][1]=((double)(pt.y-m_ptBallHoleTopRight.y))/dDst[2];
dAlfa[3][0]=((double)(pt.x-m_ptBallHoleBottomLeft.x))/dDst[3];
dAlfa[3][1]=((double)(pt.y-m_ptBallHoleBottomLeft.y))/dDst[3];
dAlfa[4][0]=((double)(pt.x-m_ptBallHoleBottomMiddle.x))/dDst[4];
dAlfa[4][1]=((double)(pt.y-m_ptBallHoleBottomMiddle.y))/dDst[4];
dAlfa[5][0]=((double)(pt.x-m_ptBallHoleBottomRight.x))/dDst[5];
dAlfa[5][1]=((double)(pt.y-m_ptBallHoleBottomRight.y))/dDst[5];
//击球点相对目标球位置
m_ptCueBallPos[0].x=round(nBall*dAlfa[0][0]);
m_ptCueBallPos[0].y=round(nBall*dAlfa[0][1]);
m_ptCueBallPos[1].x=round(nBall*dAlfa[1][0]);
m_ptCueBallPos[1].y=round(nBall*dAlfa[1][1]);
m_ptCueBallPos[2].x=round(nBall*dAlfa[2][0]);
m_ptCueBallPos[2].y=round(nBall*dAlfa[2][1]);
m_ptCueBallPos[3].x=round(nBall*dAlfa[3][0]);
m_ptCueBallPos[3].y=round(nBall*dAlfa[3][1]);
m_ptCueBallPos[4].x=round(nBall*dAlfa[4][0]);
m_ptCueBallPos[4].y=round(nBall*dAlfa[4][1]);
m_ptCueBallPos[5].x=round(nBall*dAlfa[5][0]);
m_ptCueBallPos[5].y=round(nBall*dAlfa[5][1]);
//垂线相对目标球位置
int nx, ny;
int nf=nVerLine/nBall;
nx=m_ptCueBallPos[0].x;
ny=m_ptCueBallPos[0].y;
m_ptVerLine[0][0].x=nx+nf*ny;
m_ptVerLine[0][0].y=ny-nf*nx;
m_ptVerLine[0][1].x=nx-nf*ny;
m_ptVerLine[0][1].y=ny+nf*nx;
nx=m_ptCueBallPos[1].x;
ny=m_ptCueBallPos[1].y;
m_ptVerLine[1][0].x=nx+nf*ny;
m_ptVerLine[1][0].y=ny-nf*nx;
m_ptVerLine[1][1].x=nx-nf*ny;
m_ptVerLine[1][1].y=ny+nf*nx;
nx=m_ptCueBallPos[2].x;
ny=m_ptCueBallPos[2].y;
m_ptVerLine[2][0].x=nx+nf*ny;
m_ptVerLine[2][0].y=ny-nf*nx;
m_ptVerLine[2][1].x=nx-nf*ny;
m_ptVerLine[2][1].y=ny+nf*nx;
nx=m_ptCueBallPos[3].x;
ny=m_ptCueBallPos[3].y;
m_ptVerLine[3][0].x=nx+nf*ny;
m_ptVerLine[3][0].y=ny-nf*nx;
m_ptVerLine[3][1].x=nx-nf*ny;
m_ptVerLine[3][1].y=ny+nf*nx;
nx=m_ptCueBallPos[4].x;
ny=m_ptCueBallPos[4].y;
m_ptVerLine[4][0].x=nx+nf*ny;
m_ptVerLine[4][0].y=ny-nf*nx;
m_ptVerLine[4][1].x=nx-nf*ny;
m_ptVerLine[4][1].y=ny+nf*nx;
nx=m_ptCueBallPos[5].x;
ny=m_ptCueBallPos[5].y;
m_ptVerLine[5][0].x=nx+nf*ny;
m_ptVerLine[5][0].y=ny-nf*nx;
m_ptVerLine[5][1].x=nx-nf*ny;
m_ptVerLine[5][1].y=ny+nf*nx;
//保存目标球位置
m_ptObjectBall.x=pt.x;
m_ptObjectBall.y=pt.y;
m_strStatus01="ALT+L目标球(已定位)";
pMemDC->SelectObject(pOldBmp);
ReleaseDC(pDC);
delete pMemDC;
pMemDC=NULL;
m_nTimer01=SetTimer(2, 20, 0);
}
else
{
if(m_nTimer01)
{
m_strStatus01="ALT+L目标球(未定位)";
KillTimer(m_nTimer01);
m_nTimer01=0;
}
}
}
break;
case MYHOTKEY01://定位台桌
GetCursorPos(&pt);
//目标球球心坐标
pt.x=pt.x+10;
pt.y=pt.y-10;
//上左洞
m_ptBallHoleTopLeft.x=pt.x-8;
m_ptBallHoleTopLeft.y=pt.y-332;
//上中洞
m_ptBallHoleTopMiddle.x=pt.x+259;
m_ptBallHoleTopMiddle.y=pt.y-341;
//上右洞
m_ptBallHoleTopRight.x=pt.x+525;
m_ptBallHoleTopRight.y=m_ptBallHoleTopLeft.y;
//下左洞
m_ptBallHoleBottomLeft.x=m_ptBallHoleTopLeft.x;
m_ptBallHoleBottomLeft.y=pt.y-72;
//下中洞
m_ptBallHoleBottomMiddle.x=m_ptBallHoleTopMiddle.x;
m_ptBallHoleBottomMiddle.y=pt.y-63;
//下右洞
m_ptBallHoleBottomRight.x=m_ptBallHoleTopRight.x;
m_ptBallHoleBottomRight.y=m_ptBallHoleBottomLeft.y;
m_strStatus = _T("F2定位台桌(已定位)");
break;
}
UpdateData(FALSE);
InvalidateRect(NULL, false);//重画窗口
}
return 0;
}
inline const int CTaiQiuDlg::round(double x)
{
if(x>=0)
{
x=x+0.5;
}
else
{
x=x-0.5;
}
return((int)(x));
}
void CTaiQiuDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
switch(nType)
{
case SIZE_MINIMIZED:
m_bPaint=FALSE;
KillTimer(m_nTimer);
KillTimer(m_nTimer01);
if(m_pFloatThread)
{
m_pFloatThread->PostThreadMessage(WM_QUIT, NULL, NULL);
}
m_bMinimize=TRUE;
break;
case SIZE_RESTORED:
m_pFloatThread=AfxBeginThread(RUNTIME_CLASS(CFloatThread));
Sleep(200);
m_bMinimize=FALSE;
m_nTimer=SetTimer(1, 40, 0);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -