显示真彩BMP需要逻辑调色板吗?
代码如下,有什么错误?
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc,hMemDC;
////////////////////////////读文件///////////////////////////
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi; FILE *fp;
char *buf; if((fp = fopen("E:\\sss.bmp","r")) == NULL)
{
//MessageBox(hWnd,(LPCWSTR)"Filec:\\test.bmpnotfound!",(LPCWSTR)"Error
Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;//打开文件错误,返回
}
fread(&bf,sizeof(bf),1,fp);//将BITMAPFILEHEADER结构从文件中读出,填写到bf中
fread(&bi,sizeof(bi),1,fp);//将BITMAPINFOHEADER结构从文件中读出,填写到bi中
int ImageSize = bi.biWidth * bi.biHeight * 4;
buf = new char[ImageSize];//将实际图片数据从文件中读出
fread(buf,ImageSize,1,fp); HDC hDc;
HBITMAP hBitmap;
HPALETTE hPalette; //没有用到调色板,要产生一个逻辑调色板
LOGPALETTE *pPal; //指向逻辑调色板结构的指针
hPalette=CreatePalette(pPal);   //产生逻辑调色板,hPalette是一个全局变量 hDc = GetDC(hWnd); //获得设备上下文句柄
hBitmap = CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)&bf,CBM_INIT,(LPSTR)buf,(LPBITMAPINFO)&bf,DIB_RGB_COLORS);//产生位图句柄
// ReleaseDC(hWnd,hDc); //释放设备上下文
///////////////////////////////////////////////////////////////////////////
//switch (message)
//{
//case WM_COMMAND:
// wmId    = LOWORD(wParam);
// wmEvent = HIWORD(wParam);
// // 分析菜单选择:
// switch (wmId)
// {
// case IDM_ABOUT:
// DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
// break;
// case IDM_EXIT:
// DestroyWindow(hWnd);
// break;
// default:
// return DefWindowProc(hWnd, message, wParam, lParam);
// }
// break;
//case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);//获得屏幕设备上下文
// TODO: 在此添加任意绘图代码...
////////////////////////////////////////////////////////////////////////
if(hBitmap)//hBitmap一开始是NULL,当不为NULL时表示有图
{
hMemDC = CreateCompatibleDC(hdc);//建立一个内存设备上下文
}
SelectObject(hMemDC,hBitmap);//将位图选入内存设备上下文
BitBlt(hdc,0,0,bi.biWidth,bi.biHeight,hMemDC,0,0,SRCCOPY);//显示位图
DeleteDC(hMemDC);//释放内存设备上下文
///////////////////////////////////////////////////////////////////////////////////
EndPaint(hWnd, &ps);
/*break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}*/
return 0;
}
其中这三句是我后来加的
        HPALETTE hPalette; //没有用到调色板,要产生一个逻辑调色板
LOGPALETTE *pPal; //指向逻辑调色板结构的指针
hPalette=CreatePalette(pPal);   //产生逻辑调色板,hPalette是一个全局变量
我不知道需不需要调色板,求指教!!!

解决方案 »

  1.   

    嗯啊,我知道了,但是还有一个问题,就是,我读取之后将绘图的代码加到case WM_PAINT里,我不知道是不是应该把显示图的代码加到这里边,加进去之后,调试时从来不会进入case WM_PAINT,这是为什么呢?
      

  2.   

    嗯啊,我知道了,但是还有一个问题,就是,我读取之后将绘图的代码加到case WM_PAINT里,我不知道是不是应该把显示图的代码加到这里边,加进去之后,调试时从来不会进入case WM_PAINT,这是为什么呢?
      

  3.   

    '应该把显示图的代码加到这里'
    case WM_PAINT:// 被注释注释掉了 ?
      

  4.   

    我上面贴的代码是注释掉的,但是后来我没有注释掉,
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc,hMemDC;
    ////////////////////////////读文件///////////////////////////
    BITMAPFILEHEADER bf;
    BITMAPINFOHEADER bi; FILE *fp;
    char *buf; if((fp = fopen("E:\\sss.bmp","r")) == NULL)
    {
    return FALSE;//打开文件错误,返回
    }
    fread(&bf,sizeof(bf),1,fp);//将BITMAPFILEHEADER结构从文件中读出,填写到bf中
    fread(&bi,sizeof(bi),1,fp);//将BITMAPINFOHEADER结构从文件中读出,填写到bi中
    int ImageSize = bi.biWidth * bi.biHeight * 4;
    buf = new char[ImageSize];//将实际图片数据从文件中读出
    fread(buf,ImageSize,1,fp); HDC hDc;
    HBITMAP hBitmap; BITMAPINFO   bmi; 
    memset(&bmi,0,sizeof(BITMAPINFO)); 
    bmi.bmiHeader =   bi; hDc = GetDC(hWnd); //获得设备上下文句柄
    hBitmap = CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)&bi,CBM_INIT,(LPSTR)buf,(LPBITMAPINFO)&bmi,DIB_RGB_COLORS);//产生位图句柄 //int a = GetLastError();
    //ReleaseDC(hWnd,hDc); //释放设备上下文

    //hdc = BeginPaint(hWnd, &ps); //获得屏幕设备上下文
    //if(hBitmap)//hBitmap一开始是NULL,当不为NULL时表示有图
    //{
    // hMemDC = CreateCompatibleDC(hdc);//建立一个内存设备上下文
    //}
    //SelectObject(hMemDC,hBitmap);//将位图选入内存设备上下文
    //BitBlt(hdc,0,0,bi.biWidth,bi.biHeight,hMemDC,0,0,SRCCOPY);//显示位图
    //DeleteDC(hMemDC);//释放内存设备上下文
    //EndPaint(hWnd, &ps);///////////////////////////////////////////////////////////////////////////
    switch (message)
    {
    case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // 分析菜单选择:
    switch (wmId)
    {
    case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);//获得屏幕设备上下文
    // TODO: 在此添加任意绘图代码...
    ////////////////////////////////////////////////////////////////////////
    if(hBitmap)//hBitmap一开始是NULL,当不为NULL时表示有图
    {
    hMemDC = CreateCompatibleDC(hdc);//建立一个内存设备上下文
    }
    SelectObject(hMemDC,hBitmap);//将位图选入内存设备上下文
    BitBlt(hdc,0,0,bi.biWidth,bi.biHeight,hMemDC,0,0,SRCCOPY);//显示位图
    DeleteDC(hMemDC);//释放内存设备上下文
    ///////////////////////////////////////////////////////////////////////////////////
    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }就是这个代码,我在switch语句之前先将BMP读取,读取之后我要将它显示出来,就将显示的代码加入了case WM_PAINT中,但是我调试的时候,程序在switch语句之后直接到了default,根本没有进入case WM_PAINT中,我不知道是什么原因,求指点