關于CBitmap的使用
在初始化CBitmap對象時,常用Cbitmap::LoadBitmap,即如下兩種:
BOOL LoadBitmap(LPCTSTR lpszRecourceName);
BOOL LoadBitmap(UINT nIDResource);
MSDN中的說明為:
" 返回值調用成功時返回非零值,否則為。
lpszResourceName指向一個包含了位圖資源名字的字符串(該字符串以null結尾)。NIDResource指定位圖資源中資源的ID號。說明本函數從應用的可執行文件中加載由lpszResourceName指定名字或者由nIDResource指定的ID號標志的位圖資源。加載的位圖被附在Cbitmap對象上。如果由lpszResourceName指定名字的對象不存在,或者沒有足夠的內存加載位圖,函數將返回。可以調用函數CgdiObject::DeleteObject刪除由LoadBitmap加載的位圖,否則Cbitmap的析構函數將刪除該位圖對象。警告 在刪除位圖對象之前,要保證它沒有被選到設備上下文中。在Windows3.1以及以后的版本中,增加了如下的位圖:OBM_UPARROWIORM_DNARROWIOBM_RGARROWIOBM_LFARROWI ......"
剛開始用的時候,我直接把圖像路徑名給了 lpszRecourceName,可總是不成功.仔細檢查了程序,也沒發現錯誤.可為什么呢?...CSDN一查才發現問題出在 lpszRecourceName上. lpszRecourceName按字面意思好像是"指向資源的名稱字符串",可實際呢?卻不是一般理解的磁盤上的資源文件名,而是VC工程內部已導入的資源名,所以把外部文件的名稱賦給它當然不成功了.問題怎么解決呢?---用API函數HBITMAP LoadImage("文件名");不過改函數返回的是指向Load圖片的句柄,所以需要用到CBitmap的Attach方法:
//直接從外部文件加載圖片
HBITMAP bitmap;
bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),strFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_backBitmap.DeleteObject();
if(!m_backBitmap.Attach(bitmap))
{
MessageBox("導入背景圖失敗!","提示",MB_OK);
return;
}
****************************************
void CitemView::getBitMap( CDC *pDC )
{
CDC MemDC;
HBITMAP hBmp;
BITMAP bm;
CBitmap Bitmap;
CPoint point( 10, 10);
CString cStr;
//hBmp = (HBITMAP)::LoadImage(NULL,"BG.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"BG.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
Bitmap.DeleteObject();
Bitmap.Attach( hBmp );
Bitmap.GetObject(sizeof(BITMAP),&bm);
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&Bitmap);
pDC->BitBlt(point.x, point.y, bm.bmWidth, bm.bmHeight, &MemDC, 0, 0, SRCCOPY);
MemDC.DeleteDC();
}
***************************************************
請問LoadBitmap( LPCTSTR lpszResourceName )中lpszResourceName 是指哪個名字
BOOL LoadBitmap(LPCTSTR lpszResourceName);
BOOL LoadBitmap(UINT nIDResource);
nIDResource 是指資源ID
但lpszResourceName是指什么呢
比如:我創建了一個BITMAP資源IDB_BITMAP1 ; lpszResourceName是指什么呢,是硬盤上的bitmap1.bmp嗎,如果是,以下代碼為什么是錯的。
CBitmap bmp;
bmp.LoadBitmap("d:\\..\\res\\bitmpa1.bmp");
CDC memdc;
BITMAP bmstru;
bmp.GetBitmap(&bmstru);
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(&bmp);
pDC->BitBlt(0,0,bmstru.bmWidth,bmstru.bmHeight,&memdc,0,0,SRCCOPY);
用Notepad打開*.rc文件,找到類似下面一行:
IDB_BITMAP BITMAP "res\\background.bmp"
改成:
Bitmap1 BITMAP "res\background.bmp"
或者,在VC中察看位圖資源的屬性,將其ID欄內改為"Bitmap"(注意,一定要加引號)。
然后調用:
bmp.LoadBitmap("Bitmap1");
保證成功。
資源可以用一個整數來標示,也可以用一個字符串標示。但無論如何,這些ID都不是指位圖文件名。不要將它們混淆。
posted on 2009-03-16 10:54 isabc 閱讀(2579) 評論(0) 編輯 收藏 引用 所屬分類: VC界面