zoukankan      html  css  js  c++  java
  • 《Windows游戏编程大师技巧》某些不兼容代码转换到Windows7 vs2010

    搞了2个小时了,其实很简单,有两个函数Windows API官方说明上写着仅限Windows 16bit平台使用,但是为神马我虚拟机的32位XP可以用呢?

    这个问题暂时想不通,不过总算是解决了.

    只需要把OpenFile函数换成了CreateFile函数把_lread函数换成了ReadFile函数,把_lclose函数换成了CloseHandle函数,然后注释掉_lseek函数即可.

    附上相关函数的官方帮助文档:

    _lseek:http://msdn.microsoft.com/zh-cn/library/1yee101t(v=VS.80).aspx

    _lread:找不到

    _lclose:找不到.

    CreateFile:http://msdn.microsoft.com/zh-cn/library/aa363858%28en-us,VS.85%29.aspx

    ReadFile:http://msdn.microsoft.com/zh-cn/library/aa365467.aspx

    CloseHandle:http://msdn.microsoft.com/en-us/library/ms724211(v=VS.85).aspx

    书上P279,Load_Bitmap_File函数

    int Load_Bitmap_File(BITMAP_FILE_PTR bitmap, char *filename)
    {
    // this function opens a bitmap file and loads the data into bitmap

    HANDLE file_handle;  // the file handle
    int    index;        // looping index

    UCHAR   *temp_buffer = NULL; // used to convert 24 bit images to 16 bit
    OFSTRUCT file_data;          // the file data information

    // open the file if it exists
    //if ((file_handle = OpenFile(filename,&file_data,OF_READ))==-1)
    //   return(0);
    if ((file_handle = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == NULL) //注意这里,把OpenFile函数换成了CreateFile函数
        return(0);

    // now load the bitmap file header
    //_lread(file_handle, &bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER));
    DWORD numberOfBytesRead;
    ReadFile(file_handle, &bitmap->bitmapfileheader, sizeof(BITMAPFILEHEADER),&numberOfBytesRead,NULL); //注意这里,把_lread函数换成了ReadFile函数


    // test if this is a bitmap file
    if (bitmap->bitmapfileheader.bfType!=BITMAP_ID)
       {
       // close the file
       //_lclose(file_handle);
        CloseHandle(file_handle); //注意这里把_lclose函数换成了CloseHandle函数

       // return error
       return(0);
       } // end if

    // now we know this is a bitmap, so read in all the sections

    // first the bitmap infoheader

    // now load the bitmap file header
    //_lread(file_handle, &bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER));
    ReadFile(file_handle,&bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER),&numberOfBytesRead,NULL);//注意这里,把_lread函数换成了ReadFile函数

    // now load the color palette if there is one
    if (bitmap->bitmapinfoheader.biBitCount == 8)
       {
      // _lread(file_handle, &bitmap->palette,MAX_COLORS_PALETTE*sizeof(PALETTEENTRY));
        ReadFile(file_handle,&bitmap->palette,MAX_COLORS_PALETTE*sizeof(PALETTEENTRY),&numberOfBytesRead,NULL);//注意这里,把_lread函数换成了ReadFile函数

       // now set all the flags in the palette correctly and fix the reversed
       // BGR RGBQUAD data format
       //for (index=0; index < MAX_COLORS_PALETTE; index++)
       //    {
       //    // reverse the red and green fields
       //    int temp_color                = bitmap->palette[index].peRed;
       //    bitmap->palette[index].peRed  = bitmap->palette[index].peBlue;
       //    bitmap->palette[index].peBlue = temp_color;
       //   
       //    // always set the flags word to this
       //    bitmap->palette[index].peFlags = PC_NOCOLLAPSE;
       //    } // end for index   //这段反转RGB顺序的代码貌似没什么意义,因为不管有没有这段代码,程序在Windows 7 x64下运行时显示的图像都是花的,不管是我编译出来的还是书上光盘自带的程序,都是花的...

        } // end if

    // finally the image data itself
    //_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END); //这代码没搞懂,为什么到这里要移动一下文件指针呢?也没有找到对应Handle的seek函数,注释掉也能用.


    // now read in the image, if the image is 8 or 16 bit then simply read it
    // but if its 24 bit then read it into a temporary area and then convert
    // it to a 16 bit image

    if (bitmap->bitmapinfoheader.biBitCount==8 || bitmap->bitmapinfoheader.biBitCount==16 ||
        bitmap->bitmapinfoheader.biBitCount==24)
       {
       // delete the last image if there was one
       if (bitmap->buffer)
           free(bitmap->buffer);

       // allocate the memory for the image
       if (!(bitmap->buffer = (UCHAR *)malloc(bitmap->bitmapinfoheader.biSizeImage)))
          {
          // close the file
          //_lclose(file_handle);
            CloseHandle(file_handle);//注意这里把_lclose函数换成了CloseHandle函数

          // return error
          return(0);
          } // end if

       // now read it in
       //_lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage);
       ReadFile(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage,&numberOfBytesRead,NULL);//注意这里,把_lread函数换成了ReadFile函数

       } // end if
    else
       {
       // serious problem
       return(0);

       } // end else

    #if 0
    // write the file info out
    printf("\nfilename:%s \nsize=%d \nwidth=%d \nheight=%d \nbitsperpixel=%d \ncolors=%d \nimpcolors=%d",
            filename,
            bitmap->bitmapinfoheader.biSizeImage,
            bitmap->bitmapinfoheader.biWidth,
            bitmap->bitmapinfoheader.biHeight,
            bitmap->bitmapinfoheader.biBitCount,
            bitmap->bitmapinfoheader.biClrUsed,
            bitmap->bitmapinfoheader.biClrImportant);
    #endif

    // close the file
    //_lclose(file_handle);
    CloseHandle(file_handle);//注意这里把_lclose函数换成了CloseHandle函数

    // flip the bitmap
    Flip_Bitmap(bitmap->buffer,
                bitmap->bitmapinfoheader.biWidth*(bitmap->bitmapinfoheader.biBitCount/8),
                bitmap->bitmapinfoheader.biHeight);

    // return success
    return(1);

    } // end Load_Bitmap_File

    运行结果:

    image

    程序刚启动的瞬间颜色是正常的,但是闪烁过后就变成花的了.暂时不知道什么原因,不过至少可以显示出图片了

    image

    XP下运行的效果,同样的,按ESC退出程序时也会变花.

    虚拟XP下程序启动瞬间不会闪烁.

  • 相关阅读:
    安装RF
    python-ssh
    视频下载
    【学时总结】◆学时·V◆ 逆元法
    【赛时总结】 ◇赛时·IV◇ CODE FESTIVAL 2017 Final
    【赛时总结】 ◇赛时·III◇ AtCoder ABC-099
    【软件笔记】 ◆笔记·I◆ 各类冷门函数细解
    【学时总结】 ◆学时·IV◆ 数位DP
    【赛时总结】 ◇赛时·I◇ AtCoder ARC-098
    【学时总结】 ◆学时·III◆ 二分图
  • 原文地址:https://www.cnblogs.com/DreamCreator/p/1953961.html
Copyright © 2011-2022 走看看