защо CreateDIBSection() се проваля с определен BITMAPINFO?

Опитвам се да използвам CreateDIBSection.

проблем:

В Windows XP се опитах да извикам CreateDIBSection, той връща NULL и GetLastError = 0

Когато се опитам да променя разделителната способност на екрана, например на 2048 x 1536, тя връща правилната стойност.

Тествах тази функция да има някаква връзка с nMemSize (не непременно малък брой).

Въпрос:

Има ли някакъв гаранционен начин да се гарантира, че CreateDIBSection връща правилната стойност?

nScreenWidth = 1024;
nScreenHeight= 768;
 = nScreenWidth*nScreenHeight*3*7
HDC hdc = ::GetDC(hWnd);
m_hBmpMapFile = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, nMemSize, NULL);

BITMAPINFO bmpInfo = {0};
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = nScreenWidth;
bmpInfo.bmiHeader.biHeight = nScreenHeight;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;
bmpInfo.bmiHeader.biCompression = 0;
bmpInfo.bmiHeader.biSizeImage = nMemSize;
bmpInfo.bmiHeader.biXPelsPerMeter = 0;
bmpInfo.bmiHeader.biYPelsPerMeter = 0;
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;
bmpInfo.bmiColors[0].rgbBlue = 204;
bmpInfo.bmiColors[0].rgbGreen = 204;
bmpInfo.bmiColors[0].rgbRed = 204;
bmpInfo.bmiColors[0].rgbReserved = 0;
PVOID pvBits;

m_hBmpAllWstDskWallpaper = ::CreateDIBSection(hdc, &bmpInfo, DIB_RGB_COLORS, &pvBits, m_hBmpMapFile, 0); 

person yyy    schedule 18.01.2011    source източник
comment
Е, не е ясно защо се проваля. Мисля, че въпросът ви наистина трябва да бъде защо CreateDIBSection се проваля?. Ако можете да получите отговор на това, тогава трябва да можете да разрешите истинския си проблем.   -  person David Heffernan    schedule 18.01.2011
comment
добре, промених го. Мисля, че реалният проблем наистина е, че CreateDIBSection се проваля, когато nMemSize се промени на определено число. понякога се проваля с да речем 10 000, но когато промените nMemsize на по-голям 20 000, успява.   -  person yyy    schedule 18.01.2011
comment
@yyy: Публикувайте всички полета на bmpinfo.bmiHeader. Какви ценности им приписвате?   -  person Nawaz    schedule 18.01.2011
comment
Моля, предоставете пълния код. Би било много по-лесно за нас да кажем (или познаем) къде може да е проблемът. И защо е * 7 в уравнението nMemSize?   -  person detunized    schedule 18.01.2011
comment
съжалявам, току що редактирах. *3 за RGB байтове, *7 е за 7 пъти размера на екрана. правя голям хоризонтален панорамен екран.   -  person yyy    schedule 18.01.2011
comment

Показвам bg от моето приложение с помощта на UIImageView. За да поддържам правилното завъртане на интерфейса, пиша layoutSubviews метод. В този метод свойството .frame се променя правилно, но когато се опитам да променя изображението на UIImageView точно така:

view = [self viewWithTag:1002];    
 ((UIImageView *)view).image = [UIImage imageNamed:@"portrait.png"];

Нищо не се промени. Направих ли нещо нередно или е невъзможно да променя изображението на UIImageView в метода layoutSubviews?

  -  person MW_dev    schedule 18.01.2011
comment
nScreenWidth винаги ли се дели равномерно на 4?   -  person Mark Ransom    schedule 20.02.2012


Отговори (1)


Подозирам, че проблемът може да се съдържа в частта от кода, която не сте включили (в елипсите ...). Затова препоръчвам:

  • Проверете дали контекстът на вашето устройство е валиден
  • Нулева памет
  • Добавете размера на структурата
  • И размери на растерни изображения
  • Преместете извикванията на GetLastError, за да се уверите, че контекстът на устройството е валиден (може би по-ранно извикване на API е неуспешно)

Кодът по-долу изглежда работи, след като добавих препоръките по-горе, надявам се да помогне:

        HDC hdc = ::GetDC(hWnd); 
        int nScreenWidth = 1024; 
        int nScreenHeight= 768; 
        int nMemSize = nScreenWidth*nScreenHeight*3*7;
        HANDLE m_hBmpMapFile = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, nMemSize, NULL); 
        BITMAPINFO bmpInfo; 
        //clear the memory
        ZeroMemory(&bmpInfo.bmiHeader, sizeof(BITMAPINFOHEADER));
        //struct size
        bmpInfo.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
        //dimensions
        bmpInfo.bmiHeader.biWidth = nScreenWidth;
        bmpInfo.bmiHeader.biHeight = nScreenHeight;
        bmpInfo.bmiHeader.biPlanes = 1; 
        bmpInfo.bmiHeader.biBitCount = 32; 
        bmpInfo.bmiHeader.biSizeImage=nMemSize; 
        void *pvBits = NULL;
        HANDLE m_hBmpAllWstDskWallpaper = ::CreateDIBSection(hdc, &bmpInfo, DIB_RGB_COLORS, &pvBits, m_hBmpMapFile, 0);
        int nError = ::GetLastError();      
person MW_dev    schedule 18.01.2011