void CD3DImageRendering::ChangeTexturue(HBITMAP hBitmap)
{ BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp); DWORD uFHSize = sizeof(BITMAPFILEHEADER); // 文件头的字节
DWORD uIHSize = sizeof(BITMAPINFOHEADER); // 文件信息字节
DWORD uBmpSize = uFHSize + uIHSize + (bmp.bmWidthBytes) * (bmp.bmHeight);// 整个BMP文件字节 // 文件信息
BITMAPINFOHEADER bi;
ZeroMemory(&bi,sizeof(BITMAPINFOHEADER));
bi.biSize = uIHSize;
bi.biWidth = bmp.bmWidth;
bi.biHeight = bmp.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bmp.bmBitsPixel;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrImportant = 0;
bi.biClrUsed = 0; // 文件头
BITMAPFILEHEADER bmfHdr;
ZeroMemory(&bmfHdr,sizeof(BITMAPFILEHEADER));
bmfHdr.bfType = 0x4D42; // "BM"
bmfHdr.bfSize = uBmpSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = uFHSize + uIHSize; BYTE *buffer = new BYTE[uBmpSize];
memcpy( buffer, &bmfHdr, uFHSize);
memcpy( &buffer[uFHSize], &bi, uIHSize);
memcpy( &buffer[uFHSize + uIHSize],bmp.bmBits, (uBmpSize - uFHSize - uIHSize)); // 这里创建是正确的
//LPDIRECT3DTEXTURE9 pTexture = NULL;
//D3DXCreateTextureFromFileInMemory(g_pd3dDevice, buffer, uBmpSize, &pTexture);
/// 下面动态改变纹理数据 ,不正确,请问是什么原因?
D3DSURFACE_DESC Desc;
m_pTextrue->GetLevelDesc(0, &Desc); D3DLOCKED_RECT lockedRect;
if(SUCCEEDED(m_pTextrue->LockRect(0, &lockedRect, NULL, D3DLOCK_DISCARD )))
{
DWORD* imageData = (DWORD*)lockedRect.pBits;
for(int i=0;i<Desc.Height;i++)
{
for (int j=0;j<Desc.Width;j++)
{ int index = i * (lockedRect.Pitch /4) + j;
imageData[index] = buffer[index]; }
} m_pTextrue->UnlockRect(0);
}}
{ BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp); DWORD uFHSize = sizeof(BITMAPFILEHEADER); // 文件头的字节
DWORD uIHSize = sizeof(BITMAPINFOHEADER); // 文件信息字节
DWORD uBmpSize = uFHSize + uIHSize + (bmp.bmWidthBytes) * (bmp.bmHeight);// 整个BMP文件字节 // 文件信息
BITMAPINFOHEADER bi;
ZeroMemory(&bi,sizeof(BITMAPINFOHEADER));
bi.biSize = uIHSize;
bi.biWidth = bmp.bmWidth;
bi.biHeight = bmp.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bmp.bmBitsPixel;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrImportant = 0;
bi.biClrUsed = 0; // 文件头
BITMAPFILEHEADER bmfHdr;
ZeroMemory(&bmfHdr,sizeof(BITMAPFILEHEADER));
bmfHdr.bfType = 0x4D42; // "BM"
bmfHdr.bfSize = uBmpSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = uFHSize + uIHSize; BYTE *buffer = new BYTE[uBmpSize];
memcpy( buffer, &bmfHdr, uFHSize);
memcpy( &buffer[uFHSize], &bi, uIHSize);
memcpy( &buffer[uFHSize + uIHSize],bmp.bmBits, (uBmpSize - uFHSize - uIHSize)); // 这里创建是正确的
//LPDIRECT3DTEXTURE9 pTexture = NULL;
//D3DXCreateTextureFromFileInMemory(g_pd3dDevice, buffer, uBmpSize, &pTexture);
/// 下面动态改变纹理数据 ,不正确,请问是什么原因?
D3DSURFACE_DESC Desc;
m_pTextrue->GetLevelDesc(0, &Desc); D3DLOCKED_RECT lockedRect;
if(SUCCEEDED(m_pTextrue->LockRect(0, &lockedRect, NULL, D3DLOCK_DISCARD )))
{
DWORD* imageData = (DWORD*)lockedRect.pBits;
for(int i=0;i<Desc.Height;i++)
{
for (int j=0;j<Desc.Width;j++)
{ int index = i * (lockedRect.Pitch /4) + j;
imageData[index] = buffer[index]; }
} m_pTextrue->UnlockRect(0);
}}
还是自己搞定