zoukankan      html  css  js  c++  java
  • MFC中png格式图片贴图的实现

        MFC中png格式图片贴图的实现(2011-07-14 19:10:29)  ___转载自新浪

        初学vc,正在做五子棋,五子棋中的图片格式都是bmp格式的,所以贴图用CBitmap可以很简单的实现。刚开始也没有在意那么多,今天刚把五子棋做完就兴冲冲的把代码和release版本的exe文件发给我的指导老师看,发现我的文件相当大,所以指导老师给我指出了bmp格式的图片比较占内存,让我寻找一下png格式的贴图。

        于是我在网上搜索了大量的资料,看到了有用API OleLoadPicture来加载JPG、GIF格式的图片,但是这种方法不支持png格式,并且GIF格式只能加载第一帧,所以决定放弃这种方法。还看到可以用库CxImage,但是觉得这种方法比较麻烦,所以也决定放弃。看了很多种方法之后,看到有人说CImage类比较容易,所以打算尝试一下。

       经过阅读网上的资料和方法,终于被我成功加载了一张png格式的背景图片,下面我总结一下贴图的步骤:

    (1)首先在头文件stdafx.h中包含#include <atlimage.h>

    (2)在工程视图文件的Ondraw函数中添加一下代码:

     CImage img;
     HRESULT ret = img.Load(_T("res/wuziqi.png")); //wuziqi.png是我要加载的图片名称,包含路径

     HBITMAP hbitmap = img.Detach();

    //像操作 BMP 图片一样处理图片 ,下面是显示图片的操作

     CBitmap cBitmap;
     BITMAP bitmap;
     CDC memdc;
     cBitmap.Attach(hbitmap);
     memdc.CreateCompatibleDC(pDC);
     memdc.SelectObject(hbitmap);
     cBitmap.GetBitmap(&bitmap);
     pDC->StretchBlt(0,0,800,590,&memdc,0,0,800,590,SRCCOPY);

        下面让我们来看一下StretchBlt这个函数:

    函数功能:函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。

    函数原型:BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);

    参数:

        hdcDest:指向目标设备环境的句柄。

     

      nXOriginDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。

     

      nYOriginDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。

     

      nWidthDest:指定目标矩形的宽度,按逻辑单位表示宽度。

     

      nHeightDest:指定目标矩形的高度,按逻辑单位表示高度。

     

      hdcSrc:指向源设备环境的句柄。

     

      nXOriginSrc:指向源矩形区域左上角的X轴坐标,按逻辑单位表示坐标。

     

      nYOriginSrc:指向源矩形区域左上角的Y轴坐标,按逻辑单位表示坐标。

     

      nWidthSrc:指定源矩形的宽度,按逻辑单位表示宽度。

     

      nHeightSrc:指定源矩形的高度,按逻辑单位表示高度。

     

      dwRop:指定要进行的光栅操作。光栅操作码定义了系统如何在输出操作中组合颜色,这些操作包括刷子、源位图和目标位图等对象。

    因为我的目标窗口宽为800,高为590,并且我的图片大小也是800*590的,我要让整张图片填充整个窗口,所以参数就是pDC->StretchBlt(0,0,800,590,&memdc,0,0,800,590,SRCCOPY);

        我暂时只加载了png格式的图片,至于其他格式的图片的加载是否也能完全参照这个步骤来完成还有待考证,我看到网上说用这个方法gif不能动态的显示,希望大家看到后找到解决方案的能多多指导我。在这里我先谢谢各位了。

  • 相关阅读:
    3Sum Closest
    二叉树的下一个结点
    数组中重复的数字
    不用加减乘除做加法
    和为S的连续正数序列
    数组中只出现一次的数字
    求二叉树的是否为平衡二叉树
    由一道很简单的求两条链表的第一个公共节点的问题引发的思考
    第14章 网络编程
    第13章 文档与串行化
  • 原文地址:https://www.cnblogs.com/zhangq/p/4201446.html
Copyright © 2011-2022 走看看