void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CDC dcComp;
dcComp.CreateCompatibleDC(pDC);
dcComp.SelectObject(&bitmap);
BITMAP bmInfo;
bitmap.GetObject(sizeof(bmInfo),&bmInfo);
pDC->BitBlt(50,10,bmInfo.bmWidth,bmInfo.bmHeight, &dcComp, 0,0,SRCCOPY);
}
上述代码中加载一个位图,为什么bmInfo刚定义,没有任何初始化,sizeof(bmInfo)为什么还能求出他的大小,另外,bmInfo.bmWidth和bmInfo.bmHeigth为什么也没被赋值,就能用了?请高手详尽的解答一下。sizeofBitmapBITMAP
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CDC dcComp;
dcComp.CreateCompatibleDC(pDC);
dcComp.SelectObject(&bitmap);
BITMAP bmInfo;
bitmap.GetObject(sizeof(bmInfo),&bmInfo);
pDC->BitBlt(50,10,bmInfo.bmWidth,bmInfo.bmHeight, &dcComp, 0,0,SRCCOPY);
}
上述代码中加载一个位图,为什么bmInfo刚定义,没有任何初始化,sizeof(bmInfo)为什么还能求出他的大小,另外,bmInfo.bmWidth和bmInfo.bmHeigth为什么也没被赋值,就能用了?请高手详尽的解答一下。sizeofBitmapBITMAP
自己好好的再看看程序的每行,实在不懂查 MSDN
最好写成:
sizeof(BITMAP)
因为如果 定义成:
BITMAP *bmInfo;
那么:
sizeof(bmInfo)
就错了!
sizeof()可以计算出一个类他所使用的内存空间。内置类的使用空间一般已经定了下来,定义类一般是内置类的结合,sizeof()可以通过定义类里使用的内置类的内存空间的和来求出定义类的大小。(如一个类POINT使用两个int来储存坐标,sizeof(POINT)就会返回8(int的大小是4,两个int大小就是8))bmInfo.bmWidth和bmInfo.bmHeigth在变量宣言的时候,系统会给他分配内存。因为已经分配了内存,所以其实已经可以使用。都说在 = 0之后再使用是怕变量在赋值前就被使用。在赋值前,变量的内容会是刚分配的内存的内容,这个内容是不确定的,可能会导致程序的结果和你预想的不一样。
在这个函数里,他只会给赋值,所以即使没有=0初始化,使用也是安全的。
-------------
CBitmap bitmap; bmInfo.bmWidth和bmInfo.bmHeigth为什么也没被赋值,就能用了?
---------------------------
bitmap.LoadBitmap(IDB_BITMAP1);
构造函数 2个 要做:
1. 分配内存
2. 初始化 (===0)