<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    用CImage類來顯示PNG、JPG等圖片

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    系統環境:Windows 7
    軟件環境:Visual Studio 2008 SP1
    本次目的:實現VC單文檔、對話框程序顯示圖片效果

          CImage 是VC.NET中定義的一種MFC/ATL共享類,也是ATL的一種工具類,它提供增強型的(DDB和DIB)位圖支持,可以裝入、顯示、轉換和保存多種格式的圖像文件,包括BMP、GIF、JPG、PNG、TIF等。CImage是一個獨立的類,沒有基類。(CImage類是基于GDI+的,從VC.NET起引進,VC 6.0中沒有。)
    ATL (Active Template Library,活動模板庫)是一套基于模板的 C++ 類,用以簡化小而快的 COM 對象的編寫。
    為了在MFC程序中使用CImage類,必須包含ATL的圖像頭文件atlimage.h:(在VS08 SP1中不用包含)

    #include <atlimage.h>

    這是一個強大的圖像處理類,下面分別詳細介紹在文檔、對話框下的顯示圖片。

    對于單文檔程序: 
    步驟一:添加頭文件(由于我使用的是VS2008SP1,所以我未添加上面的頭文件。)
    步驟二:在Doc頭文件里面聲明對象,如:CImage img ;
    步驟三:在Doc實現函數里面的序列化Serialize函數

    void CImagePNGDoc::Serialize(CArchive& ar)
    {
        if (ar.IsStoring())
        {
            // TODO: 在此添加存儲代碼
        }
        else
        {
            // TODO: 在此添加加載代碼
            if(!img.IsNull()) img.Destroy();
            img.Load(ar.GetFile()->GetFilePath());
     
        }
    }

    步驟四:在視圖View的實現文件OnDraw()里面

    void CImagePNGView::OnDraw(CDC* pDC )
    {
        CImagePNGDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        if (!pDoc)
            return;

        // TODO: 在此處為本機數據添加繪制代碼    
        if(!pDoc->img.IsNull()) pDoc->img.Draw(pDC->m_hDC, 0, 0); 
    }

    完成,以上可以顯示大多數的圖片格式。

    對于對話框程序: 
    步驟一:在對話框的頭文件聲明一個對象,如:CImage img ;
    步驟二:在對話框的實現函數OnPaint()函數里面

    void CTestDlg::OnPaint()
    {
        if (IsIconic())
        {
            CPaintDC dc(this); // 用于繪制的設備上下文

            SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

            // 使圖標在工作區矩形中居中
            int cxIcon = GetSystemMetrics(SM_CXICON);
            int cyIcon = GetSystemMetrics(SM_CYICON);
            CRect rect;
            GetClientRect(&rect);
            int x = (rect.Width() - cxIcon + 1) / 2;
            int y = (rect.Height() - cyIcon + 1) / 2;

            // 繪制圖標
            dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
            CPaintDC dc(this);        
            if(!img.IsNull()) img.Destroy();
            img.Load(_T("圖片3.png"));             
            if(!img.IsNull()) img.Draw(dc.m_hDC, 0, 0);
         
            CDialog::OnPaint();        
        }
    }

    完成。上述可實現對話框顯示大多數圖片。

          特別注意,只有用Load()方式才能打開其他的圖片格式,若是用資源加載的方式,則顯示不出。下面介紹一種讓PNG透明顯示的方法:

    if(!img.IsNull())img.TransparentBlt (dc.m_hDC,0,0,img.GetWidth(),img.GetHeight(),RGB(255,255,255));

    一般透明色為白色,即只需要把關鍵色設置為白色即可。網上有很多相關的資料,可以參考一下:
    使用CImage顯示透明的PNG圖片 http://blog.csdn.net/wormsun/archive/2008/11/13/3293741.aspx 
    PNG透明背景顯示之路 http://m9551.blog.sohu.com/29092953.html
     
    CImage http://hi.baidu.com/cauciee/blog/item/3053490994877438e8248822.html

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全