求教VC++高手,如何将自己导入的bitmap显示
自己导入一个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);
}
补充:请各位大牛帮忙看下,谢谢!
答案: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);
}
其他:由于我们将通知窗体的标题栏隐藏了,所以对窗体拖动操作还需要我们自己动手进行处理。本文介绍了如何更加高效的进行拖动窗体操作,有些网友在对于非标题栏拖动 将onerasebkgnd函数返回TURE试试
上一个:新电脑上VC6.0问题
下一个:VC中主进程创建子进程问题?