代码之家  ›  专栏  ›  技术社区  ›  SmacL

CreateCompatibleBitmap在Windows mobile 6上失败

  •  1
  • SmacL  · 技术社区  · 14 年前

    我正在visualstudio2008下将一个应用程序从windowsmobile2003移植到windowsmobile6;

    CClientDC ClientDC(this);
     CRect Rect;
     GetClientRect(&Rect);
    
     int nWidth = Rect.Width(),nHeight = Rect.Height();
     CBitmap Temp;
     if (!Temp.CreateCompatibleBitmap(&ClientDC,nWidth,nHeight))
     {
      LogError(elvl_Debug,_T("Error creating bitmap (%s)"),LastSysError());
    
     } else
     {
      BITMAP bmpinfo;
      Temp.GetBitmap(&bmpinfo);
     }
    

    CreateCompatibleBitmap 是8,意思是“没有足够的内存来处理命令”。nWidth是350,nHeight是400,显示是每像素16位,所以我的位图高达280K。我使用的设备有256mb的程序内存,我已经告诉链接器保留4mb的堆栈和64mb的堆。你知道我做错了什么,更重要的是找到了解决办法吗?自从ce2.1以来,我一直在windowsce上使用类似于上面的代码,没有任何问题。

    编辑:

    CClientDC ClientDC(this);
    CRect Rect;
    GetClientRect(&Rect);
    int nWidth = Rect.Width(),nHeight = Rect.Height();
    BITMAPINFOHEADER bmi = { sizeof(bmi) }; 
    bmi.biWidth = nWidth; 
    bmi.biHeight = nHeight; 
    bmi.biPlanes = 1; 
    bmi.biBitCount = 8; 
    HDC hdc = CreateCompatibleDC(NULL); 
    BYTE* pbData = 0; 
    HBITMAP DIB = CreateDIBSection(hdc, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, (void**)&pbData, NULL, 0);
    CBitmap *pTempBitmap = CBitmap::FromHandle(DIB);
    
    1 回复  |  直到 10 年前
        1
  •  3
  •   Community PPrice    7 年前

    我没有做过任何windowsce/windowsmobile编程,但是我处理过一个 similar problem ( CreateCompatibleBitmap ERROR_NOT_ENOUGH_MEMORY )在桌面窗口中。显然,从我在网上看到的情况来看,Windows可能会对依赖于设备的位图的可用内存实施全局限制(例如,某些视频驱动程序可能会选择在视频RAM中存储与设备相关的位图,在这种情况下,您的视频卡上的RAM数量会受到限制。)例如,请参阅, this thread

    一种解决方案是使用与设备无关的位图,即使它们有轻微的性能损失。