我用VC++写的程序为什么显示不了BMP图像文件

我用VC++写的程序为什么显示不了BMP图像文件,第1张

图像是8位图像,必然有调色板,你读取方式不对,没有读取和使用调色板的 *** 作,你这样的读取方式只适用于24位图像

OnDisplay的代码,SetPixel是效率最低的位图显示方式。并且同样的,你这个使用的是24位显示模式,在没有转换的前提下,8bit图像必然显示不了。

视图类的显示代码,应该在OnDraw函数中体现,如果OnDraw函数没有合理的代码,那么不显示是正常的。

标准MFC文档视图结构程序显示BMP,网上有大量的示例代码。鉴于你现在的代码在效率和适用性上很低,强烈建议你彻底放弃当前代码,在网上选择适合的示例作为参考,全部重做。

BOOL BitBlt(

  HDC hdcDest, // 位图显示目标设备环境中

  int nXDest,  // 位图显示在客户区的x坐标

  int nYDest,  // 位图显示在客户区的y坐标

  int nWidth,  // 位图显示的宽度

  int nHeight, // 位图显示的长度

  HDC hdcSrc,  // 源设备环境(包含需要显示的bmp位图)

  int nXSrc,   // 在当前位图中显示的开始x位置

  int nYSrc,   // 在当前位图中显示的开始y位置

  DWORD dwRop  // 映射模式

) //显示bmp位图

#include<windows.h>

#include"resource.h"

 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)

void DrawBrick() 

 

int WINAPI WinMain(HINSTANCE hInstance,

                   HINSTANCE hPrevInstance,

                   PSTR szCmdLine,

                   int iCmdShow)

{

    static  TCHAR   szAppName[] = TEXT("Bmp")

    HWND            hwnd

    MSG             msg

    WNDCLASS        wndclass

     

    wndclass.style          = CS_HREDRAW | CS_VREDRAW

    wndclass.lpfnWndProc    = WndProc

    wndclass.cbClsExtra     = 0

    wndclass.cbWndExtra     = 0

    wndclass.hInstance      = hInstance

    wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION)

    wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW)

    wndclass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH)

    wndclass.lpszMenuName   = NULL

    wndclass.lpszClassName  = szAppName

     

    if(!RegisterClass(&wndclass))

    {

        MessageBox(NULL, TEXT("This program requires Windows NT!"),

            szAppName, MB_ICONERROR)

        return 0

    }

     

    hwnd = CreateWindow(szAppName,

                        TEXT("Bmp Demo"),

                        WS_OVERLAPPEDWINDOW,

                        CW_USEDEFAULT,

                        CW_USEDEFAULT,

                        754,

                        566,

                        NULL,

                        NULL,

                        hInstance,

                        NULL)

     

    ShowWindow(hwnd, iCmdShow)

    UpdateWindow(hwnd)

     

    while(GetMessage(&msg, NULL, 0, 0))

    {

        TranslateMessage(&msg)

        DispatchMessage(&msg)

    }

     

    return msg.wParam

}

 

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    static  HBITMAP hBitmap            //位图句柄  标示位图

    static int     cxBitmap, cyBitmap    //位图的长宽

    BITMAP          bitmap

    HDC             hdc, hdcMem

    HINSTANCE       hInstance

    PAINTSTRUCT     ps

     

    switch(message)

    {

    case WM_CREATE:

        hInstance = ((LPCREATESTRUCT)lParam)->hInstance               //获取窗口的实例句柄

         

        hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1))   //将位图加载到内存中

         

        GetObject(hBitmap, sizeof(BITMAP), &bitmap)

         

        cxBitmap = bitmap.bmWidth//获取位图的长

        cyBitmap = bitmap.bmHeight//获取位图的宽

 

        return 0 

         

    case WM_PAINT:

        hdc = BeginPaint(hwnd, &ps)

         

        hdcMem = CreateCompatibleDC(hdc)//创建一个兼容于hdc设备环境描述表的hdcMem  主要是用于在内存中截图

        SelectObject(hdcMem, hBitmap)   //将位图选到hdcMem中

 

        BitBlt(hdc, -1, -1, cxBitmap, cyBitmap, hdcMem, 0, 0, SRCCOPY)//绘制bmp位图

 

        DeleteDC(hdcMem)

        EndPaint(hwnd, &ps)

 

        return 0

 

    case WM_DESTROY:

        DeleteObject(hBitmap)

        PostQuitMessage(0)

 

        return 0

    }

     

    return DefWindowProc(hwnd, message, wParam, lParam)

}

最好在VC中编译

显示位图文件

HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,_T(“xxx.bmp”),Image_Bitmap,0,0,

Lr_CreateDibSection|Lr_DefaultSize|Lr_LoadFromFile)//加载bmp文件

CBitmap bitmap

bitmap.Attach(hBitmap)//关联位图对象

CDC dcimage

dcimage.CreateCompatibleDC(pDC)//内存DC

BITMAP bmp

bitmap.GetBitmap(&bmp)//获取位图信息

dcimage.SelectObject(&bitmap)//选取位图对象

pDC->BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&dcimage,0,0,SRCCOPY)//显示

这是单文档显示位图文件的方法,你照着看吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11885525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存