看看下面代码,看看能不能加一个功能:

cagates 2010-05-16 09:01:43
怎么把一个光标的位图引入到棋盘中,然后用键盘控制光标移动并下棋
#include "stdafx.h"
#include "Five.h"
#include "Table.h"
#include "Messages.h"
#include "Resource.h"

//////////////////////////////////////////////////////////////////////////
// 构造函数,初始化棋盘数据以及图像数据
//////////////////////////////////////////////////////////////////////////
CTable::CTable()
{
CFiveApp *pApp = (CFiveApp *)AfxGetApp();
// 初始化图像列表
m_iml.Create( 24, 24, ILC_COLOR24 | ILC_MASK, 0, 2 );
// 载入黑、白棋子掩码位图
CBitmap bmpBlack, bmpWhite;
CBitmap m_Choosespace;/////就是这个位图,光标,怎么显示到棋盘中去
bmpBlack.LoadBitmap( IDB_BMP_BLACK );
m_iml.Add( &bmpBlack, 0xff00ff );
bmpWhite.LoadBitmap( IDB_BMP_WHITE );
m_iml.Add( &bmpWhite, 0xff00ff );
m_Choosespace.LoadBitmap(choosespace);
m_iml.Add( &m_Choosespace, 0xff00ff );
// 初始化游戏模式
m_pGame = NULL;
}
//////////////////////////////////////////////////////////////////////////
// 析构函数,释放m_pGame指针
//////////////////////////////////////////////////////////////////////////
CTable::~CTable()
{
CFiveApp *pApp = (CFiveApp *)AfxGetApp();
if ( NULL != m_pGame )
delete m_pGame;
}
//////////////////////////////////////////////////////////////////////////
// 在指定棋盘坐标处绘制指定颜色的棋子
//////////////////////////////////////////////////////////////////////////
void CTable::Draw( int x, int y, int color )
{
POINT pt;
pt.x = 12 + 25 * x;
pt.y = 84 + 25 * y;
CDC *pDC = GetDC();
CPen pen;
pen.CreatePen( PS_SOLID, 1, 0xff );
pDC->SelectObject( &pen );
pDC->SetROP2( R2_NOTXORPEN );
m_iml.Draw( pDC, color, pt, ILD_TRANSPARENT );
STEP step;
// 利用R2_NOTXORPEN擦除先前画出的矩形
if ( !m_pGame->m_StepList.empty() )
{
// 获取最后一个点
step = *( m_pGame->m_StepList.begin() );
pDC->MoveTo( 11 + 25 * step.x, 83 + 25 * step.y );
pDC->LineTo( 36 + 25 * step.x, 83 + 25 * step.y );
pDC->LineTo( 36 + 25 * step.x, 108 + 25 * step.y );
pDC->LineTo( 11 + 25 * step.x, 108 + 25 * step.y );
pDC->LineTo( 11 + 25 * step.x, 83 + 25 * step.y );
}
// 更新最后落子坐标数据,画新的矩形
step.color = color;
step.x = x;
step.y = y;
m_pGame->m_StepList.push_front( step );
pDC->MoveTo( 11 + 25 * step.x, 83 + 25 * step.y );
pDC->LineTo( 36 + 25 * step.x, 83 + 25 * step.y );
pDC->LineTo( 36 + 25 * step.x, 108 + 25 * step.y );
pDC->LineTo( 11 + 25 * step.x, 108 + 25 * step.y );
pDC->LineTo( 11 + 25 * step.x, 83 + 25 * step.y );
ReleaseDC( pDC );
}


//////////////////////////////////////////////////////////////////////////
// 处理对方落子后的工作
//////////////////////////////////////////////////////////////////////////
void CTable::Over()
{
// 判断对方是否胜利
if ( Win( 1 - m_color ) )
{
CFiveApp *pApp = (CFiveApp *)AfxGetApp();
pApp->m_nLost++;
CDialog *pDlg = (CDialog *)GetParent();
PlaySound( MAKEINTRESOURCE( IDR_WAVE_LOST ), NULL, SND_RESOURCE | SND_SYNC );
pDlg->MessageBox( _T("您输了,不过不要灰心,失败乃成功之母哦!"), _T("失败"), MB_ICONINFORMATION );

}
m_bWait = FALSE;
}
// 消息映射表
BEGIN_MESSAGE_MAP( CTable, CWnd )
//{{AFX_MSG_MAP(CTable)
ON_WM_PAINT()
ON_WM_LBUTTONUP()
ON_WM_CHAR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////
// 处理WM_PAINT消息
//////////////////////////////////////////////////////////////////////////
void CTable::OnPaint()
{
CPaintDC dc( this );
CDC MemDC;
MemDC.CreateCompatibleDC( &dc );
// 装载棋盘
CBitmap bmp;
CPen pen;
bmp.LoadBitmap( IDB_BMP_QP );
pen.CreatePen( PS_SOLID, 1, 0xff );
MemDC.SelectObject( &bmp );
MemDC.SelectObject( &pen );
MemDC.SetROP2( R2_NOTXORPEN );
// 根据棋盘数据绘制棋子
int x, y;
POINT pt;
for ( y = 0; y < 15; y++ )
{
for ( x = 0; x < 15; x++ )
{
if ( -1 != m_data[x][y] )
{
pt.x = 12 + 25 * x;
pt.y = 84 + 25 * y;
m_iml.Draw( &MemDC, m_data[x][y], pt, ILD_TRANSPARENT );
}
}
}
// 绘制最后落子的指示矩形
if ( NULL != m_pGame && !m_pGame->m_StepList.empty() )
{
STEP step = *( m_pGame->m_StepList.begin() );
MemDC.MoveTo( 11 + 25 * step.x, 83 + 25 * step.y );
MemDC.LineTo( 36 + 25 * step.x, 83 + 25 * step.y );
MemDC.LineTo( 36 + 25 * step.x, 108 + 25 * step.y );
MemDC.LineTo( 11 + 25 * step.x, 108 + 25 * step.y );
MemDC.LineTo( 11 + 25 * step.x, 83 + 25 * step.y );
}
// 完成绘制
dc.BitBlt( 0, 0, 395, 472, &MemDC,0, 0, SRCCOPY );
}
//////////////////////////////////////////////////////////////////////////
// 处理左键弹起消息,为玩家落子之用
//////////////////////////////////////////////////////////////////////////
void CTable::OnLButtonUp( UINT nFlags, CPoint point )
{
STEP stepPut;
if ( m_bWait )
{
MessageBeep( MB_OK );
return;
}
int x, y;
x = ( point.x - 12 ) / 25;
y = ( point.y - 84 ) / 25;
// 如果在(0, 0)~(14, 14)范围内,且该坐标没有落子,则落子于此,否则发声警告并退出过程
if ( x < 0 || x > 14 || y < 0 || y > 14 || m_data[x][y] != -1 )
{
MessageBeep( MB_OK );
return;
}
else
{
// 如果位置合法,则落子
SetData( x, y, m_color );
stepPut.color = m_color;
stepPut.x = x;
stepPut.y = y;

}
// 判断胜利的情况
if ( Win( m_color ) )
{
CFiveApp *pApp = (CFiveApp *)AfxGetApp();
pApp->m_nWin++;
m_pGame->Win( stepPut );
CDialog *pDlg = (CDialog *)GetParent();
PlaySound( MAKEINTRESOURCE( IDR_WAVE_WIN ), NULL, SND_SYNC | SND_RESOURCE );
pDlg->MessageBox( _T("恭喜,您获得了胜利!"), _T("胜利"), MB_ICONINFORMATION );

m_bWait = TRUE;
return;
}
else
{
// 开始等待
m_bWait = TRUE;
// 发送落子信息
PlaySound( MAKEINTRESOURCE( IDR_WAVE_PUT ), NULL, SND_SYNC | SND_RESOURCE );
m_pGame->SendStep( stepPut );
}
}
//////////////////////////////////////////
//处理键盘消息,为落子之用
/////////////////////////////////////
void CTable::OnChar(UINT nChar,UINT nRepCnt,UINT nFlags)
{
STEP stepPut;
POINT pt;
if ( m_bWait )
{
MessageBeep( MB_OK );
return;
}
int x, y;

x = ( pt.x - 12 ) / 25;
y = ( pt.y - 84 ) / 25;
switch(nChar)
{
case VK_W:
y=y-1;break;
case VK_A:
x=x-1;break;
case VK_S:
y=y+1;break;
case VK_D:
x=x+1;break;
default: break;
}

// 如果在(0, 0)~(14, 14)范围内,且该坐标没有落子,则落子于此,否则发声警告并退出过程
if ( x < 0 || x > 14 || y < 0 || y > 14 || m_data[x][y] != -1 )
{
MessageBeep( MB_OK );
return;
}
else if(nChar==VK_RETURN) /*回车确认下子*/
{
// 如果位置合法,则落子
SetData( x, y, m_color );
stepPut.color = m_color;
stepPut.x = x;
stepPut.y = y;

}
// 判断胜利的情况
if ( Win( m_color ) )
{
CFiveApp *pApp = (CFiveApp *)AfxGetApp();
pApp->m_nWin++;
m_pGame->Win( stepPut );
CDialog *pDlg = (CDialog *)GetParent();
PlaySound( MAKEINTRESOURCE( IDR_WAVE_WIN ), NULL, SND_SYNC | SND_RESOURCE );
pDlg->MessageBox( _T("恭喜,您获得了胜利!"), _T("胜利"), MB_ICONINFORMATION );

m_bWait = TRUE;
return;
}
else
{
// 开始等待
m_bWait = TRUE;
// 发送落子信息
PlaySound( MAKEINTRESOURCE( IDR_WAVE_PUT ), NULL, SND_SYNC | SND_RESOURCE );
m_pGame->SendStep( stepPut );
}
}
...全文
81 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2010-05-16
  • 打赏
  • 举报
回复
POINT pt;
for ( y = 0; y < 15; y++ )
{
for ( x = 0; x < 15; x++ )
{
if ( -1 != m_data[x][y] )
{
pt.x = 12 + 25 * x;
pt.y = 84 + 25 * y;
m_iml.Draw( &MemDC, m_data[x][y], pt, ILD_TRANSPARENT );
=========
这个是你画光标的过程?你用位图当作光标,为什么这样画啊?直接贴图不行吗?而且,直接用一个光标资源不是更好,为什么用位图呢
cagates 2010-05-16
  • 打赏
  • 举报
回复
散分了
cagates 2010-05-16
  • 打赏
  • 举报
回复
大家再看看,帮帮忙啊!现在就是不知道这怎么把光标放到(7,7)这个位置
cagates 2010-05-16
  • 打赏
  • 举报
回复
//////////////////////////////////////////////////////////////////////////
// 处理WM_PAINT消息
//////////////////////////////////////////////////////////////////////////
void CTable::OnPaint()
{
CPaintDC dc( this );
CDC MemDC;
MemDC.CreateCompatibleDC( &dc );
// 装载棋盘
CBitmap bmp;
CBitmap m_Choosespace;//定义已有的光标位图
CPen pen;
bmp.LoadBitmap( IDB_BMP_QP );
m_Choosespace.LoadBitmap(choosespace);
pen.CreatePen( PS_SOLID, 1, 0xff );
MemDC.SelectObject( &bmp );
MemDC.SelectObject( &pen );
MemDc.SelectObject( &m_Choosespace );
MemDC.SetROP2( R2_NOTXORPEN );
// 根据棋盘数据绘制棋子
int x, y;
POINT pt;
for ( y = 0; y < 15; y++ )
{
for ( x = 0; x < 15; x++ )
{
if ( -1 != m_data[x][y] )
{
pt.x = 12 + 25 * x;
pt.y = 84 + 25 * y;
m_iml.Draw( &MemDC, m_data[x][y], pt, ILD_TRANSPARENT );
}
}
}
// 绘制最后落子的指示矩形
if ( NULL != m_pGame && !m_pGame->m_StepList.empty() )
{
STEP step = *( m_pGame->m_StepList.begin() );
MemDC.MoveTo( 11 + 25 * step.x, 83 + 25 * step.y );
MemDC.LineTo( 36 + 25 * step.x, 83 + 25 * step.y );
MemDC.LineTo( 36 + 25 * step.x, 108 + 25 * step.y );
MemDC.LineTo( 11 + 25 * step.x, 108 + 25 * step.y );
MemDC.LineTo( 11 + 25 * step.x, 83 + 25 * step.y );
}
// 完成绘制
dc.BitBlt( 0, 0, 395, 472, &MemDC,0, 0, SRCCOPY );
}
看看是不是这么写的,光标的坐标在屏幕的(7,7)处,这样运行的话看不到棋盘
wltg2001 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cagates 的回复:]
此论坛无人啊!
[/Quote]
不是无人,而是你的代码那么长,谁有精力去看啊,你先提炼下自己的问题好吧
cagates 2010-05-16
  • 打赏
  • 举报
回复
此论坛无人啊!
cagates 2010-05-16
  • 打赏
  • 举报
回复
高手一定要来帮帮啊!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧