超级熟悉MFC中Bitmap的进
首先说明我是准备用MFC做个游戏.....1.才开始就遇到了问题.我想用一个位图来画对话框的背景.以下是我的代码,运行后我一切换其他程序就报错....voidCGggDl...
首先说明我是准备用MFC做个游戏.....
1.才开始就遇到了问题.我想用一个位图来画对话框的背景.以下是我的代码,运行后我一切换其他程序就报错....
void CGggDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
CDC *pDC=GetDC();
Backdc.CreateCompatibleDC(pDC);
Backdc.SelectObject(&bitmap);
RECT rect;
GetClientRect(&rect);
pDC->BitBlt(0, 0, rect.right, rect.bottom, &Backdc,0, 0, SRCCOPY);
}}
我怀疑后很大可能是因为我的代码加错地方了....
2.还有,不知道MFC封装了TransparentBlt个函数没.因为很多位图都是有其他颜色的.
3.我像实现一个这个效果,比如一个飞机爆炸了放出爆炸动画.就类似于用FLASH做游戏可以把爆炸一针一针的放出来..MFC下怎么做???
请高人指点.....回答得好再加分 展开
1.才开始就遇到了问题.我想用一个位图来画对话框的背景.以下是我的代码,运行后我一切换其他程序就报错....
void CGggDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
CDC *pDC=GetDC();
Backdc.CreateCompatibleDC(pDC);
Backdc.SelectObject(&bitmap);
RECT rect;
GetClientRect(&rect);
pDC->BitBlt(0, 0, rect.right, rect.bottom, &Backdc,0, 0, SRCCOPY);
}}
我怀疑后很大可能是因为我的代码加错地方了....
2.还有,不知道MFC封装了TransparentBlt个函数没.因为很多位图都是有其他颜色的.
3.我像实现一个这个效果,比如一个飞机爆炸了放出爆炸动画.就类似于用FLASH做游戏可以把爆炸一针一针的放出来..MFC下怎么做???
请高人指点.....回答得好再加分 展开
展开全部
1. Backdc.SelectObject(&bitmap); 选中对象句柄后没有释放。
解决办法:
CGdiObject* hOldBmp = Backdc.SelectObject(&bitmap);
....
pDC->BitBlt(0, 0, rect.right, rect.bottom
BackDc.SelectObject(hOldBmp);
DeleteObject(BackDc.GetSafeHdc());
2. 使用 TransparentBlt 要附加库 Msimg32.lib
3.如果要实现动态效果,必须:
A 要屏蔽 wm_erasebkgnd消息,否则刷新背景会导致画面非常闪烁。
B 使用双缓存,就是类似你程序中 BackDC,最好做成类成员变量
C 使用时钟控制画面的变化,可以做的很平滑,BitBlt 很快。
解决办法:
CGdiObject* hOldBmp = Backdc.SelectObject(&bitmap);
....
pDC->BitBlt(0, 0, rect.right, rect.bottom
BackDc.SelectObject(hOldBmp);
DeleteObject(BackDc.GetSafeHdc());
2. 使用 TransparentBlt 要附加库 Msimg32.lib
3.如果要实现动态效果,必须:
A 要屏蔽 wm_erasebkgnd消息,否则刷新背景会导致画面非常闪烁。
B 使用双缓存,就是类似你程序中 BackDC,最好做成类成员变量
C 使用时钟控制画面的变化,可以做的很平滑,BitBlt 很快。
展开全部
CClientDC clientDC(this);
CDC memDC;
memDC.CreateCompatibleDC(&clientDC);
CRect rcClient;
GetClientRect(&rcClient);
CBitmap membitmap;
membitmap.CreateCompatibleBitmap(&clientDC,rcClient.Width(),rcClient.Height());
memDC.SelectObject(&membitmap);
for(int x=0;x<rcClient.right;x++)
{
for(int y=0;y<rcClient.bottom;y++)
memDC.SetPixel(x,y,x*y);
}
clientDC.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memDC,0,0,SRCINVERT);
位置没有错误,可能你的代码有点问题,上面的代码你复制到CDialog::OnPaint(); 后面看看效果
CDC memDC;
memDC.CreateCompatibleDC(&clientDC);
CRect rcClient;
GetClientRect(&rcClient);
CBitmap membitmap;
membitmap.CreateCompatibleBitmap(&clientDC,rcClient.Width(),rcClient.Height());
memDC.SelectObject(&membitmap);
for(int x=0;x<rcClient.right;x++)
{
for(int y=0;y<rcClient.bottom;y++)
memDC.SetPixel(x,y,x*y);
}
clientDC.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memDC,0,0,SRCINVERT);
位置没有错误,可能你的代码有点问题,上面的代码你复制到CDialog::OnPaint(); 后面看看效果
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void CGggDlg::OnPaint()
{
CPaintDC dc(this);
if (IsIconic())
{
// device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
CDC Backdc;
Backdc.CreateCompatibleDC(&dc);
Backdc.SelectObject(&bitmap);
RECT rect;
GetClientRect(&rect);
dc.BitBlt(0, 0, rect.right, rect.bottom, &Backdc,0, 0, SRCCOPY);
}
代码给你改好了
2。有这个函数 要包含一个库文件 MSIMG32.LIB
3.这个很复杂 ,吧所有的图片做出来 然后隔一段时间换一个图就好了
就跟原始的做动画片一样就OK
{
CPaintDC dc(this);
if (IsIconic())
{
// device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
CDC Backdc;
Backdc.CreateCompatibleDC(&dc);
Backdc.SelectObject(&bitmap);
RECT rect;
GetClientRect(&rect);
dc.BitBlt(0, 0, rect.right, rect.bottom, &Backdc,0, 0, SRCCOPY);
}
代码给你改好了
2。有这个函数 要包含一个库文件 MSIMG32.LIB
3.这个很复杂 ,吧所有的图片做出来 然后隔一段时间换一个图就好了
就跟原始的做动画片一样就OK
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
极有可能是 你要显示的资源 在你要访问的时候 已经被析构了,你看你看一下你的位图的生命周期有没有问题!
最好把他定义成成员函数!CBitmap bitmap;然后在类的构造函数中 加载位图,用LoadBitmap 方法 试下!
另外 希望那个你怎么 报错的也写出来!
最好把他定义成成员函数!CBitmap bitmap;然后在类的构造函数中 加载位图,用LoadBitmap 方法 试下!
另外 希望那个你怎么 报错的也写出来!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询