2011-01-18 6 views
0

私はCreateDIBSectionを使用しようとしています。なぜCreateDIBSection()はcertian BITMAPINFOで失敗しますか?

問題:Windows XPでは

、私はそれがNULLGetLastError = 0

私は2048×1536に例えば画面の解像度を変更しようとすると、それが正しい返しを返し、CreateDIBSectionを呼び出そうとしました値。私はこの機能をテストしている

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); 
+0

なぜそれが失敗するのかは明らかではありません。あなたの質問は本当に "なぜCreateDIBSectionが失敗するのですか?"と思う。あなたがその答えを得ることができれば、本当の問題を解決できるはずです。 –

+0

私はそれを変更しました。私はreail問題はnMemSizeがcertian番号に変更したときにCreateDIBSectionが失敗した本当にだと思います。時にはそれが言う10000で失敗しますが、uは20000より大きいにnMemsizeを変更したときにそれがsuccesed。 – yyy

+0

@yyy: 'bmpinfo.bmiHeader'のポストすべてのフィールド。あなたがそれらに割り当てる値は? – Nawaz

答えて

0

私が問題になっているのは、あなたが含まれていなかったコードのセクションに含まれている可能性があります(エリプスで...)。だから私はお勧め:

  • お使いのデバイスコンテキストをチェックが有効である
  • ZeroMemory
  • 構造サイズ
  • とビットマップ寸法
  • を追加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();  
関連する問題