关于VC++中Bitmap析构、变量作用域设定的有关问题
关于VC++中Bitmap析构、变量作用域设定的问题
菜鸟求教:
我最近在看孙鑫的《VC++深入解析》,对于下面的问题向大家请教。
请看下面两个程序:
一:创建一个带位图的插入符 二:画一个填充位图的矩形
Void CDdrawView::OnLButtonUp(UINT nFlags,CPoint point)
{CBitmap bitmap;//正确
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(......)//具体就不写了,是个填充矩形的函数
CView::OnLButtonUp(UINT nFlags,CPoint point)
}
int CText_01caretView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
CBitmap bitmap; //错误!!
bitmap.LoadBitmapW (IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
return 0;
}
现请教:为什么第一个程序中要把CBitmap bitmap的变量申明为VIEW类下的全局变量,而在第二个程序中却可以申明为局部变量呢?
书上说是当OnCreate结束时,bitmap对象会发生析构,和对象相关的资源会丢失,所以 要申明为全局的,但是对于第二个程序来说,它的bitmap不也要析构吗?
谢谢,菜鸟求教。或许各位达人要见笑了,但还是请赐予援手,谢谢!!
------解决方案--------------------
View类的OnCreate函数只在初始化视图的时候调用。
局部变量离开函数OnCreate函数就死亡了,而插入符的生存时间应该是永久的,因此这里不能用局部变量声明cbitmap。
而画矩形OnLButtonUp里面cbitmap也是局部变量,但是只是这里对矩形的生命周期没有做要求罢了。
------解决方案--------------------
菜鸟求教:
我最近在看孙鑫的《VC++深入解析》,对于下面的问题向大家请教。
请看下面两个程序:
一:创建一个带位图的插入符 二:画一个填充位图的矩形
Void CDdrawView::OnLButtonUp(UINT nFlags,CPoint point)
{CBitmap bitmap;//正确
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(......)//具体就不写了,是个填充矩形的函数
CView::OnLButtonUp(UINT nFlags,CPoint point)
}
int CText_01caretView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
CBitmap bitmap; //错误!!
bitmap.LoadBitmapW (IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
return 0;
}
现请教:为什么第一个程序中要把CBitmap bitmap的变量申明为VIEW类下的全局变量,而在第二个程序中却可以申明为局部变量呢?
书上说是当OnCreate结束时,bitmap对象会发生析构,和对象相关的资源会丢失,所以 要申明为全局的,但是对于第二个程序来说,它的bitmap不也要析构吗?
谢谢,菜鸟求教。或许各位达人要见笑了,但还是请赐予援手,谢谢!!
------解决方案--------------------
View类的OnCreate函数只在初始化视图的时候调用。
局部变量离开函数OnCreate函数就死亡了,而插入符的生存时间应该是永久的,因此这里不能用局部变量声明cbitmap。
而画矩形OnLButtonUp里面cbitmap也是局部变量,但是只是这里对矩形的生命周期没有做要求罢了。
------解决方案--------------------