为了搞课程设计,这几天学了一些MFC的知识,因为没有真正的入门学习,而是直接学一下课程设计游戏项目里面要学的一些知识,确实很困难,之前看了孙鑫大神的vc++教程的,但是当时只是想学c++的部分,看到mfc的时候的不想看,谁知现在就用上了,要学寒假回去再学吧,现在写一些这几天学习中碰到的问题,也许只是mfc的一些基础知识。
1: CDC *pDC = this->GetDC() ;
CDC dc;
dc.CreateCompatibleDC(pDC); //
创建与指定设备兼容的内存设备上下文环境时,要在
dc.SelectObject(bitmap1);之前,不然虽然编译通过了,但运行时不能显示图片。
CBitmap bitmap1;
bitmap1.LoadBitmap(IDB_BITMAP1);
dc.SelectObject(bitmap1);
2:要设定变量的初始值绝对不能在OnDraw()或OnPaint()函数里面进行
例如:
void CTest26View::OnDraw(CDC* pDC)
{
a = 10;
b = 20;} //如果想将这两个数设置为起点坐标,那么每次重绘的时候都会重新设置,导致移动不了图片,一直都重绘在原来的位置,被这个小问题难到了,一直都以为是因为键盘没有跟图片联系起来或者没有进行重绘才不能移动图片的,所以就卡在这里了。
所以设定变量的初始值就在***view的构造函数里面进行。
3::把bmp图片边沿透明化:
bitmap2和bitmap3加载的分别是
和
出来效果:
bmp透明教程参考:http://blog.csdn.net/poem_qianmo/article/details/7338082
dc.SelectObject(bitmap3);
pDC->BitBlt(a,b,a+128,b+128,&dc,0,0,SRCAND);
dc.SelectObject(bitmap2);
pDC->BitBlt(a,b,a+128,b+128,&dc,0,0,SRCPAINT);
4:移动后重绘画面,最后不要在OnDraw()里面进行,那样会画面不断地闪动,我的理解是
Invalidate() 就是调用OnDraw(),当在里面进行时,会进入死循环,画面就会不断闪动。所以要重绘画面要在坐标参数改变后马上进行。
void CTest26View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
a = point.x;
b = point.y;
Invalidate();
}
最后贴上OnDraw()和 OnLButtonDown()的代码
void CTest26View::OnDraw(CDC* pDC)
{
CTest26Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(rect);
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap bitmap1,bitmap2,bitmap3;
bitmap1.LoadBitmap(IDB_BITMAP1);
bitmap2.LoadBitmap(IDB_BITMAP2);
bitmap3.LoadBitmap(IDB_BITMAP3);
dc.SelectObject(bitmap1);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
dc.SelectObject(bitmap3);
pDC->BitBlt(a,b,a+128,b+128,&dc,0,0,SRCAND);
dc.SelectObject(bitmap2);
pDC->BitBlt(a,b,a+128,b+128,&dc,0,0,SRCPAINT);
//Invalidate();
// TODO: add draw code for native data here
}
void CTest26View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
a = point.x;
b = point.y;
Invalidate();
}