求教VC++高手,如何将自己导入的bitmap显示
自己导入一个IDB_PICTURE显示不了。其他部分没问题,就是绘图出现问题。请教高手解答,万分感激。在CGAMEWND中定义了:RECTm_rcClient;CBrus...
自己导入一个IDB_PICTURE显示不了。其他部分没问题,就是绘图出现问题。请教高手解答,万分感激。
在CGAMEWND中定义了:
RECT m_rcClient;
CBrush m_brsBG;
在类初始化中,
CGameWnd::CGameWnd()
{
m_bmp.LoadBitmap(IDB_PICTURE);
m_brsBG.CreateSolidBrush(COLOR_BLACK);
}
绘图函数:
void CGameWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC dcMemory; // 内存设备
CBitmap bitmap;
CRect m_rcClient;
GetWindowRect(&m_rcClient);
// 与dc设备兼容
dcMemory.CreateCompatibleDC(&dc);
// 使得bitmap与实际显示的设备兼容
bitmap.CreateCompatibleBitmap(&dc, m_rcClient.Width(),m_rcClient.Height());
// 内存设备选择物件-位图
dcMemory.SelectObject(&bitmap);
//绘制背景框
dcMemory.FillRect(&m_rcClient, &m_brsBG);
//DrawWall((CPaintDC&) dcMemory);
for (int i = 0; i<M_NUM_HEIGHT; i++)
{
for (int j = 0; j<M_NUM_WIDTH; j++)
{
switch(m_cMap[i][j])
{
case MAP_WALL:
DrawWall((CPaintDC&) dcMemory, i, j);
}
}
}
// 将内存设备的内容拷贝到实际屏幕显示的设备
dc.BitBlt(0, 0, m_rcClient.Width(),m_rcClient.Height(), &dcMemory, 0, 0, SRCCOPY);
bitmap.DeleteObject();
}
void CGameWnd::DrawWall(CPaintDC &dc, int j , int i )
{
CDC dcMemory; //用作内存设备
dcMemory.SelectObject(m_bmp); //将内存设备与位图资源关联
dcMemory.CreateCompatibleDC(&dc); //使得这个设备与dc兼容
dc.StretchBlt(32*j, 32*i, 32, 32, &dcMemory, 0, 0, 32, 32, SRCCOPY);
}
请各位大牛帮忙看下,谢谢! 展开
在CGAMEWND中定义了:
RECT m_rcClient;
CBrush m_brsBG;
在类初始化中,
CGameWnd::CGameWnd()
{
m_bmp.LoadBitmap(IDB_PICTURE);
m_brsBG.CreateSolidBrush(COLOR_BLACK);
}
绘图函数:
void CGameWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC dcMemory; // 内存设备
CBitmap bitmap;
CRect m_rcClient;
GetWindowRect(&m_rcClient);
// 与dc设备兼容
dcMemory.CreateCompatibleDC(&dc);
// 使得bitmap与实际显示的设备兼容
bitmap.CreateCompatibleBitmap(&dc, m_rcClient.Width(),m_rcClient.Height());
// 内存设备选择物件-位图
dcMemory.SelectObject(&bitmap);
//绘制背景框
dcMemory.FillRect(&m_rcClient, &m_brsBG);
//DrawWall((CPaintDC&) dcMemory);
for (int i = 0; i<M_NUM_HEIGHT; i++)
{
for (int j = 0; j<M_NUM_WIDTH; j++)
{
switch(m_cMap[i][j])
{
case MAP_WALL:
DrawWall((CPaintDC&) dcMemory, i, j);
}
}
}
// 将内存设备的内容拷贝到实际屏幕显示的设备
dc.BitBlt(0, 0, m_rcClient.Width(),m_rcClient.Height(), &dcMemory, 0, 0, SRCCOPY);
bitmap.DeleteObject();
}
void CGameWnd::DrawWall(CPaintDC &dc, int j , int i )
{
CDC dcMemory; //用作内存设备
dcMemory.SelectObject(m_bmp); //将内存设备与位图资源关联
dcMemory.CreateCompatibleDC(&dc); //使得这个设备与dc兼容
dc.StretchBlt(32*j, 32*i, 32, 32, &dcMemory, 0, 0, 32, 32, SRCCOPY);
}
请各位大牛帮忙看下,谢谢! 展开
3个回答
展开全部
1.把你的图包含到程序的“Bitmap资源”里,会有提示,主要是说该资源使用了大于256色的调色板,在VC里无法编辑等等,你确定就行
2.定位到 OnPaint(),在if()...else()中的else()下添加如下代码
else
{
//CDialog::OnPaint();//注意要禁止这个调用
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP);
//IDB_BITMAP是你自己的图对应的ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
2.定位到 OnPaint(),在if()...else()中的else()下添加如下代码
else
{
//CDialog::OnPaint();//注意要禁止这个调用
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP);
//IDB_BITMAP是你自己的图对应的ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
将onerasebkgnd函数返回TURE试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
由于我们将通知窗体的标题栏隐藏了,所以对窗体拖动操作还需要我们自己动手进行处理。本文介绍了如何更加高效的进行拖动窗体操作,有些网友在对于非标题栏拖动
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |