CBitmap CrateBitmap

CreateBitmap,SetBitmapBits用法,怎么显示不出来呢
CClientDC pDC(this);
CDC DSDC,DC;
CBitmap bitmap1;
CBitmap* bitmap;
bitmap = memDCShibie.GetCurrentBitmap();
unsigned int * buf = (unsigned int *) new BYTE[imageWidth*imageHeight*4];
long a = bitmap->GetBitmapBits (imageWidth *imageHeight*4,buf);//a=20155392,û´í£¬Äõõ½Êý¾Ý
//pDC.StretchBlt (rectCuantuCtrl.left,rectCuantuCtrl.top,rectCuantuCtrl.Width(),rectCuantuCtrl.Height(),
// &memDCShibie,0,0,2592,1944,SRCCOPY);//ÏÔʾµÃ³öÀ´£¬Ö¤Ã÷memDCShibieÀïÃæÓÐͼƬÔÚ
bitmap1.CreateBitmap(2592,1944,1,4,buf);
//long b = bitmap1.SetBitmapBits (imageWidth *imageHeight*4,buf);
DC.CreateCompatibleDC (&pDC);
DC.SelectObject (&bitmap1);
pDC.StretchBlt (rectCuantuCtrl.left,rectCuantuCtrl.top,rectCuantuCtrl.Width(),rectCuantuCtrl.Height(),
&DC,0,0,2592,1944,SRCCOPY);
怎么显示不出来呢,a的值没错啊,为什么,利用createbitmap把32位位图变成1位位图,这样不对吗

------解决方案--------------------------------------------------------
不好意思,GDI只能处理当前屏幕的颜色模式,你的当前屏幕的颜色模式应该是32位色,所以你用GDI的函数只能处理32位色的CBitmap。如果你用GDI加载一张16位色的图片,你会发现它根本显示不出来。
如果你想这样用,请使用而GDI+
------解决方案--------------------------------------------------------
Sample Code:
C/C++ code
CBitmap bitmap;
    unsigned int *pImageRawDate = (unsigned int *) new BYTE[64 * 64 * 4];
    memset(pImageRawDate, 0xFF, 64 * 64 * 4);
    bitmap.CreateBitmap(64, 64, 1, 4, pImageRawDate);

    HDC hMainDC = ::GetDC(m_hWnd);
    HDC hMemoryDC = ::CreateCompatibleDC(hMainDC);
    HDC hBitmapDC = ::CreateCompatibleDC(hMainDC);
    HBITMAP hMainSurface = ::CreateCompatibleBitmap(hMainDC, 800, 600);
    ::SelectObject(hMemoryDC, hMainSurface);
    ::BitBlt(hMainDC, 0, 0, 800, 600, hMemoryDC, 0, 0, SRCCOPY);

    ::SelectObject(hBitmapDC, &bitmap);
    ::BitBlt(hMemoryDC, 0, 0, 64, 64, hBitmapDC, 0, 0, SRCCOPY);
				
### MFC 中 `CBitmap` 类的使用方法 #### 加载位图资源 为了在应用程序中加载并显示位图,可以利用 `LoadBitmap()` 函数来读取嵌入到项目中的图像资源。下面是一个例子展示了如何初始化多个位图: ```cpp void CSDITestView::InitBitmap() { m_my_Bitmap[0].bmp.LoadBitmapW(IDB_BITMAP1); m_my_Bitmap[1].bmp.LoadBitmapW(IDB_BITMAP2); m_my_Bitmap[2].bmp.LoadBitmapW(IDB_BITMAP3); m_my_Bitmap[3].bmp.LoadBitmapW(IDB_BITMAP4); m_my_Bitmap[4].bmp.LoadBitmapW(IDB_BITMAP5); m_my_Bitmap[5].bmp.LoadBitmapW(IDB_BITMAP6); m_my_Bitmap[6].bmp.LoadBitmapW(IDB_BITMAP7); m_my_Bitmap[7].bmp.LoadBitmapW(IDB_BITMAP8); } ``` 这段代码通过调用 `LoadBitmapW()` 方法将指定 ID 的位图加载到了内存中[^4]。 #### 创建和操作临时位图 当需要动态创建而非仅限于预定义资源时,则可以通过编程方式构建新的位图实例。这里展示了一种创建固定大小空白位图的方法,并将其属性设置为特定宽度、高度以及颜色深度: ```cpp CBitmap drawBmp; drawBmp.CreateBitmap(256, 256, 1, 32, NULL); BITMAP bm; drawBmp.GetObject(sizeof(BITMAP), &bm); drawBmp.SetBitmapBits(pDoc->dataCount, pDoc->lData); ``` 上述片段说明了怎样建立一个尺寸为 256×256 像素、具有 32 bpp (bits per pixel) 颜色分辨率的新位图对象[^3]。 #### 绘制位图到窗口或控件上 一旦拥有了有效的 `CBitmap` 对象之后,就可以考虑把它渲染出来供用户查看了。通常情况下会借助 GDI 设备上下文来进行实际的画面输出工作。以下是几种常见的做法之一——把位图绘制在一个已有的窗口客户区内: ```cpp CDC dcMemory; dcMemory.CreateCompatibleDC(pDC); dcMemory.SelectObject(&drawBmp); // 使用 StretchBlt 而不是 BitBlt 可以减少某些情况下的错误发生率 pDC->StretchBlt( 0, 0, 256, 256, &dcMemory, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY ); Invalidate(NULL); ``` 此部分强调了采用 `StretchBlt` 来替代容易出现问题的传统 `BitBlt` 技术的重要性。 另外,在处理来自文件而不是内置资源的数据时,也可以按照相似的方式完成加载过程: ```cpp CBitmap mybitmap; mybitmap.LoadBitmap(IDB_BITMAP3); // 或者从其他来源获取数据... CDC *pdc = GetDC(); CDC bmp; bmp.CreateCompatibleDC(pdc); bmp.SelectObject(&mybitmap); pdc->BitBlt(0, 0, 30, 50, &bmp, 0, 0, SRCCOPY); mybitmap.DeleteObject(); ReleaseDC(pdc); ``` 该段落描述了另一种场景下如何有效地管理 DC 生命周期及其关联的对象释放问题[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值