请教VC6.0MFC中CBitmap::CreateCompatibleBitmap()函数与CDC::StretchBlt()函数的使用问题!!!
最近在参考一个扫雷程序的编写,虽然可以运行,但是看不到图片!请高手帮我看下。谢谢下面是代码:voidCMineWnd::OnPaint(){CPaintDCdc(this...
最近在参考一个扫雷程序的编写,虽然可以运行,但是看不到图片!请高手帮我看下。谢谢
下面是代码:void CMineWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect m_rcClient;
GetClientRect(&m_rcClient);// 得到客户区的矩形
CBrush m_brsBG(RGB(255,255,255));
CDC dcMemory;
/////////////////////
CBitmap bitmap;
if(!dc.IsPrinting())
{
if(dcMemory.CreateCompatibleDC(&dc))
{
if(bitmap.CreateCompatibleBitmap(&dc,m_rcClient.right,
m_rcClient.bottom))
{
dcMemory.SelectObject(&bitmap);
dcMemory.FillRect(&m_rcClient,&m_brsBG);
///这行是代码本身就有的,作用是画外壳的,
//为了方便先注释。 DrawShell((CPaintDC&)dcMemory);
DrawMineArea((CPaintDC&)dcMemory);//雷区方块函数
dc.BitBlt(m_rcClient.left,m_rcClient.top, m_rcClient.right,m_rcClient.bottom,&dcMemory,0,0,SRCCOPY);
bitmap.DeleteObject();
}
}
}
}
自定义画雷区方块的函数:
void CMineWnd::DrawMineArea(CDC& dc)
{
CDC dcMemory;
dcMemory.CreateCompatibleDC(&dc);
dcMemory.SelectObject(m_bmpMine);
for(int i=0;i<m_uYNum;i++)
{
for(int j=0;j<m_uXNum;j++)
{
if(0==dc.StretchBlt(MINEAREA_FRAME_X+16*j,
MINEAREA_FRAME_Y+16*i,
16,16,&dc,0,16*m_pMines[i][j].uState ,16,16,SRCCOPY))
{
AfxMessageBox("图形拷贝失败!");
}
}
}
}
上面两个函数是在CMineWnd类中,并且:
CMineWnd::CMineWnd()
{
m_bmpMine.LoadBitmap(IDB_MINE_COLOR);
m_uXNum=9;
m_uYNum=9;
}
#define MINEAREA_FRAME_X 12//雷区左上角在窗口的x坐标
#define MINEAREA_FRAME_Y 55//雷区左上角在窗口的y坐标
typedef struct
{
UINT uRow;//雷区对应数组的行
UINT uCol;//列
UINT uState;//当前状态
UINT uAttrib;//方块属性
UINT uOldstate;//历史状态
}MINEWND; //雷方块结构体
MINEWND m_pMines[40][40];
程序运行成功,但是看不到雷区初始化的方块。
就上面的结构体,我定义了一下函数:函数功能是获得鼠标点击所在的方块。
MINEWND CMineWnd::GetMine(CPoint pt)
{
CRect rectMineArea(MINE_AREA_LEFT,MINE_AREA_TOP,
MINE_AREA_LEFT+m_uXNum*MINE_WIDTH,
MINE_AREA_TOP+m_uYNum*MINE_HEIGHT);
if(!rectMineArea.PtInRect(pt)) return 0;
// if(rectMineArea.PtInRect(pt))
else
{
UINT i,j;
i=(pt.x-MINE_AREA_LEFT)/16;
j=(pt.y-MINE_AREA_TOP)/16;
m_pMines[i][j].uRow=i;
m_pMines[i][j].uCol=j;
return m_pMines[i][j];
}
}
运行时无错,但是编译时有个警告说if(!rectMineArea.PtInRect(pt)) return 0;
无法转换int/UINT(值0)型到MINEWND型,请问这时候我该怎么返回? 展开
下面是代码:void CMineWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect m_rcClient;
GetClientRect(&m_rcClient);// 得到客户区的矩形
CBrush m_brsBG(RGB(255,255,255));
CDC dcMemory;
/////////////////////
CBitmap bitmap;
if(!dc.IsPrinting())
{
if(dcMemory.CreateCompatibleDC(&dc))
{
if(bitmap.CreateCompatibleBitmap(&dc,m_rcClient.right,
m_rcClient.bottom))
{
dcMemory.SelectObject(&bitmap);
dcMemory.FillRect(&m_rcClient,&m_brsBG);
///这行是代码本身就有的,作用是画外壳的,
//为了方便先注释。 DrawShell((CPaintDC&)dcMemory);
DrawMineArea((CPaintDC&)dcMemory);//雷区方块函数
dc.BitBlt(m_rcClient.left,m_rcClient.top, m_rcClient.right,m_rcClient.bottom,&dcMemory,0,0,SRCCOPY);
bitmap.DeleteObject();
}
}
}
}
自定义画雷区方块的函数:
void CMineWnd::DrawMineArea(CDC& dc)
{
CDC dcMemory;
dcMemory.CreateCompatibleDC(&dc);
dcMemory.SelectObject(m_bmpMine);
for(int i=0;i<m_uYNum;i++)
{
for(int j=0;j<m_uXNum;j++)
{
if(0==dc.StretchBlt(MINEAREA_FRAME_X+16*j,
MINEAREA_FRAME_Y+16*i,
16,16,&dc,0,16*m_pMines[i][j].uState ,16,16,SRCCOPY))
{
AfxMessageBox("图形拷贝失败!");
}
}
}
}
上面两个函数是在CMineWnd类中,并且:
CMineWnd::CMineWnd()
{
m_bmpMine.LoadBitmap(IDB_MINE_COLOR);
m_uXNum=9;
m_uYNum=9;
}
#define MINEAREA_FRAME_X 12//雷区左上角在窗口的x坐标
#define MINEAREA_FRAME_Y 55//雷区左上角在窗口的y坐标
typedef struct
{
UINT uRow;//雷区对应数组的行
UINT uCol;//列
UINT uState;//当前状态
UINT uAttrib;//方块属性
UINT uOldstate;//历史状态
}MINEWND; //雷方块结构体
MINEWND m_pMines[40][40];
程序运行成功,但是看不到雷区初始化的方块。
就上面的结构体,我定义了一下函数:函数功能是获得鼠标点击所在的方块。
MINEWND CMineWnd::GetMine(CPoint pt)
{
CRect rectMineArea(MINE_AREA_LEFT,MINE_AREA_TOP,
MINE_AREA_LEFT+m_uXNum*MINE_WIDTH,
MINE_AREA_TOP+m_uYNum*MINE_HEIGHT);
if(!rectMineArea.PtInRect(pt)) return 0;
// if(rectMineArea.PtInRect(pt))
else
{
UINT i,j;
i=(pt.x-MINE_AREA_LEFT)/16;
j=(pt.y-MINE_AREA_TOP)/16;
m_pMines[i][j].uRow=i;
m_pMines[i][j].uCol=j;
return m_pMines[i][j];
}
}
运行时无错,但是编译时有个警告说if(!rectMineArea.PtInRect(pt)) return 0;
无法转换int/UINT(值0)型到MINEWND型,请问这时候我该怎么返回? 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询