Qt显示wmf格式图片
        夸平台的Qt不并不支持Auto CAD的输出图wmf。那么怎么才能在Qt下显示wmf格式图片呢?智能用win32 api了。具体过程下面一一介绍。
        首先说明下怎么在Qt下使用windows的api。
        1、包含库文件:#include <windows.h>。
        2、找到lib文件。从vc中拷贝也好,从网上下载也好,找到gdi32.lib。并把它放在mingw中的lib文件夹下,然后在工程文件.pro中加入 LIBS += -lgdi32  。
        3、如果想做成发布文件的话,当然还要在加入gdi32.dll文件。
        接着就看代码怎么写了。新建一个工程,这里就选QWidget类型的吧。然后在widget.h文件中加入以下代码:
        typedef struct tagOLDRECT
{    short left;

short top;

short right;

short bottom;}

OLDRECT;typedef struct

{        DWORD   key;

WORD        hmf;

OLDRECT        bbox;

WORD    inch;

DWORD   reserved;

WORD    checksum;}

ALDUSMFHEADER;

typedef struct{

qint16           Left;

qint16            Top;

qint16           Right;

qint16          Bottom;

} PWMFRect16;

struct WmfPlaceableFileHeader{

UINT32          Key;            
    qint16           Hmf;           
    PWMFRect16      BoundingBox;   
    qint16           Inch;           
    UINT32          Reserved;      
    qint16           Checksum;      
};    这些代码是准备工作,提供显示需要用到的一些结构数据。
    然后在加入成员变量:
    ALDUSMFHEADER m_aldusMFHeader;
    HANDLE h_emf;
    准备工作做好了,接着来看实现部分:
    重写PaintEvent函数,并在里面加入以下代码:
    QPainter painter(this);                   //用win32 api显示wmf格式图片部分

QFile file(fileName);

file.open(QIODevice::ReadOnly);

DWORD                   dwIsAldus;

METAHEADER                mfHeader;

DWORD                    dwSize;

DWORD                        seekpos;

if(file.read((char *)&dwIsAldus, sizeof(dwIsAldus)) != sizeof(dwIsAldus))

;

if (dwIsAldus != ALDUSKEY)

{                      seekpos = 0;

memset(&m_aldusMFHeader,0, sizeof(m_aldusMFHeader));

}    else

{                        file.seek(0);

if (file.read((char *)&m_aldusMFHeader, ALDUSMFHEADERSIZE) != ALDUSMFHEADERSIZE)                          seekpos = ALDUSMFHEADERSIZE;    }

file.seek(seekpos);

if (file.read((char *)&mfHeader, sizeof(mfHeader)) != sizeof(mfHeader))

if ((mfHeader.mtType != 1) && (mfHeader.mtType != 2))

;

dwSize = mfHeader.mtSize * 2;

BYTE* lpMFBits = new BYTE [dwSize];

if (lpMFBits == NULL)

;    file.seek(seekpos);

if (file.read((char *)lpMFBits, dwSize) == dwSize)

{        h_emf =SetWinMetaFileBits(dwSize, lpMFBits,NULL , NULL);

QRect rect(0,0,this->width()*2,this->height());

PlayEnhMetaFile(painter.paintEngine()->getDC(),(HENHMETAFILE__*)h_emf,(RECT*)&rect);        //关键的一行,显示用的。    }
显示部分的代码主要是这么个过程:创建图元文件,得到wmf的句柄,然后转换成emf格式,然后在将emf显示出来。如果有兴趣可以仔细看下。没兴趣的话,注意下这里最后一条函数,就是用来显示emf的函数,因为这里的参数关系到显示的结果。
     PlayEnhMetaFile(painter.paintEngine()->getDC(),(HENHMETAFILE__*)h_emf,(RECT*)&rect);
第一个参数是设备上下文句柄,就是你要画在哪个设备上。第二个参数是emf文件的句柄。关键是第三个参数,控制显示的位置,以及显示的大小。因为wmf是矢量图,所以是没有大小的,显示结果完全由这个rect来控制。
     这样我们就实现了Qt下wmf的显示。
     如果你想把wmf放到一个较大的工程中,而不是简单的图片显示器的话,你或许会发现一个问题。画图时会把内容画到旁边的窗口上。例如一个mainWindow有toolbar、label、widget等子窗口,而你在widget里画图,如果你想显示的很大,结果就会画到旁边的窗口中。这个问题到目前为止我还有找到解决的办法。因为Qt中用QPainter、QPaintEngine、QPaintDevice来实现2D画图。决定怎么在设备上画的,是封装好的QPaintEngine,而QPaintEngine是不对用户开放的。Qt跟windows本来就不是一回事,非要用Qt来显示Wmf就会出现一些不兼容。
     在CSDN上层看见一大侠发的帖子,其中讲到重在PaintEngine函数,返回NULL来解决这个问题,我实验了下,没有起作用。也不知是我代码错了,还是怎么的。希望有路过的大侠可以指点下。

Qt显示wmf格式图片相关推荐

  1. 学习QT之显示SVG格式图片

    SVG的英文全称是Scalable Vector Graphics,即可缩放的矢量图形.它是有万维网联盟在2000年8月制定的一种新的二维矢量图形格式,也是规范中的网格矢量图形标准,是一个开发的图形标 ...

  2. OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移、缩放和旋转操作

    OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移.缩放和旋转操作 C3DWidget.h #pragma once#include <QtWidgets/QApplic ...

  3. 【数字图像处理】一.MFC详解显示BMP格式图片

    本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...

  4. MFC详解显示BMP格式图片

    本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...

  5. 如何将CAD转换为WMF格式图片?

    WMF图片是由简单的线条和封闭线条(图形)组成的矢量图,如何将CAD转换为WMF格式图片?今天就给大家具体演示一下.演示操作如下: cad转wmf转换器 https://www.xunjiecad.c ...

  6. WMF格式图片的特点

    CAD制图过程中,我们常常会转换CAD图纸的各种格式.其中就有WMF格式,WMF格式是一种图元文件,图元文件的扩展名包括.WMF和.EMF两种.今天我想和大家简单的分享一下WMF格式图片的特点. WM ...

  7. 怎样把CAD转换为WMF格式图片呢?

    WMF图片是由简单的线条和封闭线条(图形)组成的矢量图,其主要特点是文件非 常小,可以任意缩放而不影响图像质量.怎样把CAD转换为WMF格式图片呢?今天就给大家具体演示一下.演示操作如下: cad转w ...

  8. QT显示Raw格式的图片

    在使用QT进行图像显示时,对于如jpg和png等图片格式的实现可以借助QT很方便的就实现,但是使用QT显示Raw数据时,则相对麻烦一点,主要的原因在于Raw格式的图片不包含关于图片的高度.宽度和数据类 ...

  9. osd 显示 png格式图片水印

    最近做音视频项目需要做水印,且提供的水印为png格式图片,通过学习和尝试,终于解决.osd需要的是显示内容的数据,其核心就是将png图片解码成一系列数据. 解码库版本:libpng-1.6.35 1. ...

最新文章

  1. OpenGL + VS2015 + Windows10配置
  2. 用存储过程生成记录编号
  3. 对没有标记为安全的activex控件进行初始化和脚本运行_新的C++安全编码规则出炉...
  4. aptitude安装出现依赖_oeasy 教您玩转linux 之 010210 应用管理 aptitude
  5. 设计模式(十)——抽象工厂模式
  6. 多线程----join插队
  7. 亲历腾讯WEB前端开发三轮面试经历及面试题
  8. 循环队列的java结构_java数据结构之循环队列(数组实现)
  9. 《Web安全之机器学习入门》一 第3章 机器学习概述
  10. ajax php 返回数组并父子给变量,将字符串变量从PHP发送回数组变量的ajax ...?
  11. 求职过程记录(4)——启明星出现
  12. linux内核文件cache机制,Linux内核文件Cache机制
  13. 一体机的扫描至网络共享的设置
  14. 搭建以太坊私有链-单机2节点
  15. JavaSE——多线程
  16. 科研写作之word技巧——首行缩进、图 表 公式 自动编号和引用、子标题细节
  17. 查看linux是多少位
  18. 逆时针旋转某一角度的旋转矩阵
  19. 开发工具篇第三讲:Maven从入门到实战
  20. MySQL必知必会二十三:使用存储过程

热门文章

  1. 工厂模式及简单的工厂模式详解
  2. 计算长方形的周长和面积(类和对象)(SDUT 3339)
  3. 单片机快速入门:12864液晶屏实现多功能数字时钟
  4. 自定义Office中格式刷的快捷键
  5. 使用nslookup验证DNS的SRV记录
  6. 计算机软考access 题的做法_软考初级信息处理技术员下午试题(一)
  7. 发现一个巨好的迅雷资源网站
  8. 华为手机连接Wi-Fi提示 “网络拒绝接入”
  9. ios系统可以使用python吗_怎么使用 Python 开发 iOS 程序
  10. 视频直播源码 直播软件搭建进行直播推流时,对声音进行音质优化