精华内容
下载资源
问答
  • MFC读取PNG文件显示

    2018-01-15 08:51:38
    MFC读取PNG文件显示MFC读取PNG文件显示MFC读取PNG文件显示MFC读取PNG文件显示
  • MFC 绘制PNG图片

    2018-11-19 15:13:29
    MFC 绘制PNG,jpg等图片,从资源中绘制和从文件中绘制,内存中显示图片
  • MFC 按钮上显示png图片, 以及文本
  • MFC 显示透明png图片

    千次阅读 2018-02-27 16:24:54
    需要载入一张公司的logo,透明PNG图片。查了很多资料都没显示,也不想使用其他类。最后用Cimage基本解决。1.在对话框类的头文件中定义:[cpp] view plain copyCImage img; 2.在Onpaint消息响应函数中载入图片并...

    工作需要又得使用MFC编调试软件。

    需要载入一张公司的logo,透明PNG图片。

    查了很多资料都没显示,也不想使用其他类。最后用Cimage基本解决。

    1.在对话框类的头文件中定义:

    [cpp]  view plain  copy
    1. CImage img;  

    2.在Onpaint消息响应函数中载入图片并显示图片。

    [cpp]  view plain  copy
    1. if (IsIconic())  
    2. {  
    3.         CPaintDC dc(this); // 用于绘制的设备上下文  
    4.   
    5.         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  
    6.   
    7.         // 使图标在工作区矩形中居中  
    8.         int cxIcon = GetSystemMetrics(SM_CXICON);  
    9.         int cyIcon = GetSystemMetrics(SM_CYICON);  
    10.         CRect rect;  
    11.         GetClientRect(&rect);  
    12.         int x = (rect.Width() - cxIcon + 1) / 2;  
    13.         int y = (rect.Height() - cyIcon + 1) / 2;  
    14.   
    15.   
    16.         // 绘制图标  
    17.         dc.DrawIcon(x, y, m_hIcon);  
    18.     }  
    19.     else  
    20.     {  
    21.             CPaintDC dc(this);          
    22.             if(!img.IsNull()) img.Destroy();  
    23.               img.Load(_T("12.png"));                           //load载入,否则不显示  
    24.             TransparentPNG(&img);                               //调用透明化处理函数  
    25.             if(!img.IsNull()) img.Draw(dc.m_hDC, 80, 20);      //以左上角为原点,按原始大小,在(80,20)处贴图  
    26.   
    27.             CDialogEx::OnPaint();  
    28.     }  


    3.直接载入将会的到衣服背景色不透明的图片,很傻单也简单实用的办法,将png图像的没像素的RGB值惊进行处理,消除白色背景。

    [cpp]  view plain  copy
    1. void TransparentPNG(CImage *png)    
    2. {    
    3.     for(int i = 0; i <png->GetWidth(); i++)  <span style="white-space:pre;">              </span>//遍历像素处理  
    4.     {    
    5.         for(int j = 0; j <png->GetHeight(); j++)    
    6.         {    
    7.             unsigned char* pucColor = reinterpret_cast<unsigned char*>(png->GetPixelAddress(i , j));    
    8.             pucColor[0] = pucColor[0] *pucColor[3] / 255;    
    9.             pucColor[1] = pucColor[1] *pucColor[3] / 255;    
    10.             pucColor[2] = pucColor[2] *pucColor[3] / 255;    
    11.         }    
    12.     }    
    13. }  

    至此就简单的实现了。

    方式二:

    AlphaBlend是Window自带的GDI函数,在作GUI的时候为了达到更漂亮的效果我们常常用它.

     

    BLENDFUNCTION是AlphaBlend用控制透明效果的重要参数.

     

    定义如下:

     

    typedef struct _BLENDFUNCTION {
      BYTE     BlendOp;
      BYTE     BlendFlags;
      BYTE     SourceConstantAlpha;
      BYTE     AlphaFormat;
    }BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;

     

    BlendOp: 这个参数必须也只能为AC_SRC_OVER(0x00),意思就是把源图片覆盖到目标之上.

    BlendFlags: 必须为0

    SourceConstantAlpha: 简写为SCA,指定源图片的透明度,这个值是会和源图片的Alpha通道值合并计算的.

    AlphaFormat: 可以填两种,一种是0x00,一种是AC_SRC_ALPHA(0x01).填0的话,AlphaBlend据说就和BitBlt一样了,我没有试验过~填1的话,源DC必须是32位的DC不然的话,AlphaBlend会返回参数错误.

     

    计算公式(当SCA不是0xFF时):

          输出像素(R,G,B,A) = 源像素(R,G,B,A) * SCA / 0xFF + 目标像素(R,G,B,A) * (1.0 - SCA / 0xFF)

    当SCA是0xFF时,计算公式

          输出像素(R,G,B,A) = 源像素(R,G,B,A) + 目标像素(R,G,B,A) * (1.0 - 源像素(A) / 0xFF)

    混合计算公式

           输出像素(R,G,B) = 源像素(R,G,B) * SCA / 0xFF + 目标像素(R,G,B) * (1.0 - 源像素(A) / 0xFF * SCA / 0xFF)


    1. if (IsIconic())  
    2. {  
    3.         CPaintDC dc(this); // 用于绘制的设备上下文  
    4.   
    5.         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  
    6.   
    7.         // 使图标在工作区矩形中居中  
    8.         int cxIcon = GetSystemMetrics(SM_CXICON);  
    9.         int cyIcon = GetSystemMetrics(SM_CYICON);  
    10.         CRect rect;  
    11.         GetClientRect(&rect);  
    12.         int x = (rect.Width() - cxIcon + 1) / 2;  
    13.         int y = (rect.Height() - cyIcon + 1) / 2;  
    14.   
    15.   
    16.         // 绘制图标  
    17.         dc.DrawIcon(x, y, m_hIcon);  
    18.     }  
    19.     else  
    20.     {  
    21.                            CPaintDC dc(this);
    if (!img.IsNull()) img.Destroy();
    img.Load(_T("logo.png"));                           //load载入,否则不显示  
    HDC hMemDC;
    HBITMAP bmpMem;
    bmpMem = CreateCompatibleBitmap(dc.m_hDC, 413, 69);
    hMemDC = CreateCompatibleDC(dc.m_hDC);
    HGDIOBJ hOldObj =  ::SelectObject(hMemDC, bmpMem);


    BLENDFUNCTION bindfun;


    //设置AlphaBind的最后一个参数  
    bindfun.BlendOp = AC_SRC_OVER;
    bindfun.BlendFlags = 0;
    bindfun.SourceConstantAlpha = 255;
    bindfun.AlphaFormat = AC_SRC_ALPHA;  // AC_SRC_ALPHA


    //img.AlphaBlend(hMemDC, 0, 0, 413, 69, 0, 0, 413, 69, bindfun);


    AlphaBlend(hMemDC, 0, 0, 413, 69, img.GetDC(), 0, 0, 413, 69, bindfun);
    ::TransparentBlt(dc.m_hDC, 80, 20, 413, 69, hMemDC, 0, 0, 412, 68, RGB(0, 0, 0));                CDialogEx::OnPaint();       }  

    展开全文
  • mfc加载PNG图片

    千次阅读 2018-07-27 15:10:32
    Image image(_T("1.png")); //资源加载 BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR,Image *&pImg) { HINSTANCE hInst = AfxGetResourceHandle(); HRSRC hRsrc = ::FindResource (hIn...

    方法一(GDI+):

    //本地加载
    Image image(_T("1.png")); 
    
    
    //资源加载
    BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR,Image *&pImg)
    {
    	HINSTANCE hInst = AfxGetResourceHandle();
    	HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type
    	if (!hRsrc)
    		return FALSE;
    	// load resource into memory
    	DWORD len = SizeofResource(hInst, hRsrc);
    	BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
    	if (!lpRsrc)
    		return FALSE;
    	// Allocate global memory on which to create stream
    	HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
    	BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
    	memcpy(pmem,lpRsrc,len);
    	GlobalUnlock(m_hMem);
    	IStream* pstm;
    	CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
    	// load from stream
    	pImg=Gdiplus::Image::FromStream(pstm);
    	// free/release stuff
    	pstm->Release();
    	FreeResource(lpRsrc);
    	GlobalFree(m_hMem);
    	return TRUE;
    }
    
    
    //绘制
    Graphics graphics(pDC->m_hDC); 
    //用本地或者资源加载image
    graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight());

    方法二(CImage):

    //本地加载
    CImage Image;
    Image.Load(strPath);
    
    //资源加载
    BOOL LoadImageFromResource(CImage *pImage, UINT nResID,LPCTSTR lpTyp)
    {
    	if ( pImage == NULL) 
    		return false;
    	pImage->Destroy();
    	// 查找资源
    	HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);
    	if (hRsrc == NULL) 
    		return false;
    	// 加载资源
    	HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
    	if (hImgData == NULL)
    	{
    		::FreeResource(hImgData);
    		return false;
    	}
    	// 锁定内存中的指定资源
    	LPVOID lpVoid = ::LockResource(hImgData);
    	LPSTREAM pStream = NULL;
    	DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
    	HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);
    	LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew);
    	::memcpy(lpByte, lpVoid, dwSize);
    	// 解除内存中的指定资源
    	::GlobalUnlock(hNew);
    	// 从指定内存创建流对象
    	HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);
    	if ( ht != S_OK )
    	{
    		GlobalFree(hNew);
    	}
    	else
    	{
    		// 加载图片
    		pImage->Load(pStream);
    		GlobalFree(hNew);
    	}
    	// 释放资源
    	::FreeResource(hImgData);
    	return true;
    }
    
    //绘制
    CDC *pDC = GetDC();
    CImage Image;
    
    //用本地或者资源加载Image
    
    if (Image.IsNull())
    {
    	MessageBox(_T("没加载成功"));
    	return -1;
    }
    //注意:一定要将透明通道处理一下
    if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
    {
    	int i;
    	int j;
    	for (i = 0; i < Image.GetWidth(); i++)
    	{
    		for (j = 0; j < Image.GetHeight(); j++)
    		{
    			byte *pByte = (byte *)Image.GetPixelAddress(i, j);
    			pByte[0] = pByte[0] * pByte[3] / 255;
    			pByte[1] = pByte[1] * pByte[3] / 255;
    			pByte[2] = pByte[2] * pByte[3] / 255;
    		}
    	}
    }
    Image.Draw(pDC->m_hDC, 0, 0);
    Image.Destroy();
    ReleaseDC(pDC);
    

    推荐一本c++书籍,个人认为写的比较好的,对学习帮助很大的

    c++ primer

    展开全文
  • mfc 对话框显示PNG

    千次阅读 2018-07-19 16:30:11
    Image image(_T("D:\\Documents\\Visual Studio 2008\\Projects\\ShowPng\\ShowPng\\res\\light.png"), FALSE); graphics.DrawImage(&image,250, 60,image.GetWidth(),image.GetHeight()); //绘制背景 //...

    使用GDI+可以轻松实现

    首先在CxxApp.cpp中加载GDI+

    BOOL CxxApp::InitInstance()
    {
    	// 如果一个运行在 Windows XP 上的应用程序清单指定要
    	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
    	//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
    	INITCOMMONCONTROLSEX InitCtrls;
    	InitCtrls.dwSize = sizeof(InitCtrls);
    	// 将它设置为包括所有要在应用程序中使用的
    	// 公共控件类。
    	InitCtrls.dwICC = ICC_WIN95_CLASSES;
    	InitCommonControlsEx(&InitCtrls);
    
    	CWinAppEx::InitInstance();
    
    	AfxEnableControlContainer();
    
    	//装载GDI+
    
    	GdiplusStartupInput m_gdiplusStartupInput;ULONG_PTR m_pGdiToken;
    	GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
    
    	// 标准初始化
    	// 如果未使用这些功能并希望减小
    	// 最终可执行文件的大小,则应移除下列
    	// 不需要的特定初始化例程
    	// 更改用于存储设置的注册表项
    	// TODO: 应适当修改该字符串,
    	// 例如修改为公司或组织名
    	...
    	// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
    	//  而不是启动应用程序的消息泵。
    
    	//卸载GDI+
    	GdiplusShutdown(m_pGdiToken);
    	return FALSE;
    }

    在CxxDlg的Onpaint中实现显示

    void CShowPngDlg::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
    	{
    		CDC *pDC;
    
    		pDC =GetDC();
    
    		CRect  rect;
    
    		GetClientRect(&rect); 
    
    		Graphics graphics( pDC->m_hDC);     
    		Image image(_T("D:\\Documents\\Visual Studio 2008\\Projects\\ShowPng\\ShowPng\\res\\light.png"), FALSE);     
    		graphics.DrawImage(&image,250, 60,image.GetWidth(),image.GetHeight());  //绘制背景
    
    
    		//CPaintDC dc(this);        
    		//if(!img.IsNull()) img.Destroy();
    		//img.Load(_T("D:\\Documents\\Visual Studio 2008\\Projects\\ShowPng\\ShowPng\\res\\light.png"));                           //load载入,否则不显示
    		//TransparentPNG(&img);                               //调用透明化处理函数
    		//if(!img.IsNull()) 
    		//	img.Draw(dc.m_hDC, 200, 50);            
    		   
    		
    		CDialog::OnPaint();
    	}
    }
    

     

    显示效果如下:

    展开全文
  • MFCPNG图片按钮

    千次阅读 2015-07-02 11:23:56
    MFCPNG图片按钮 #pragma once #include "afxwin.h" ///////////////////////////////////////////////////////////////////// // 工程: YF_GCM -> ButtonDemo // 作者: ** // 描述: 自绘制位图按钮 // ...
    MFC的PNG图片按钮
     
    pngbutton.h
     
    #pragma once
    #include "afxwin.h"
    
    / 
    // 工程: YF_GCM -> ButtonDemo 
    // 作者: **
    // 描述: 自绘制位图按钮
    // 主要函数:
    //         SetButtonUpBitmapEx()设置鼠标放置在按钮上的图片
    //         SetButtonDownBitmapEx()设置按钮按下的图片
    //         SetButtonNormalBitmapEx()设置鼠标不在按钮是的图片
    // 日期: 2013.12.16
    // 版本: 1.0
    // 修改: 
    / 
    // CBitmapButtonEx
    
    class CPngButton : public CBitmapButton
    {
        DECLARE_DYNAMIC(CPngButton)
    
    public:
        CPngButton();
        virtual ~CPngButton();
    
    protected:
        DECLARE_MESSAGE_MAP()
    
    protected:
    
        virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    
    public:
        // 设置按钮抬起图片
        BOOL SetButtonUpBitmapEx(const CString& szFilePath);
        // 设置按钮按下图片
        BOOL SetButtonDownBitmapEx(const CString& szFilePath);
        // 普通按钮图片
        BOOL SetButtonNormalBitmapEx(const CString& szFilePath);
    protected:
        virtual void PreSubclassWindow();
    public:
        virtual BOOL PreTranslateMessage(MSG* pMsg);
        afx_msg void OnMouseMove(UINT nFlags, CPoint point);
        afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
        afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    protected:
        BOOL m_lButtonDown;
        // 按钮有效区域
    //     CRgn m_btRgn;
        // 绘制按钮图片区域
    //     CRect m_rectDrawButton;
    private:
        // 图片
        CImage m_imageButtonUp;
        CImage m_imageButtonDown;
        CImage m_imageBitmapNormal;
        CDC m_bkDc; // 记录背景
        bool m_first;
    public:
    
    protected:
        BOOL m_bMouseOver;
        BOOL m_bTrack;
    public:
    };

     

    pngbutton.cpp
    
    
    
    / 
    // 工程: YF_GCM -> ButtonDemo 
    // 作者: **
    // 描述: 自绘制位图按钮
    // 主要函数:
    //         SetButtonUpBitmapEx()设置鼠标放置在按钮上的图片
    //         SetButtonDownBitmapEx()设置按钮按下的图片
    //         SetButtonNormalBitmapEx()设置鼠标不在按钮是的图片
    // 日期: 2013.12.16
    // 版本: 1.0
    // 修改: 
    / 
    
    #include "stdafx.h"
    #include "pngbutton.h"
    #include "TransparentPNG.h"
    // #include "LogToFile.h"
    
    // CBitmapButtonEx
    
    IMPLEMENT_DYNAMIC(CPngButton, CBitmapButton)
    
        CPngButton::CPngButton()
        : CBitmapButton()
        , m_lButtonDown(FALSE)
        , m_bMouseOver(FALSE)
        , m_bTrack(FALSE)
        , m_first(true)
    {
    }
    
    CPngButton::~CPngButton()
    {
        if (NULL != m_imageButtonUp)
        {
            ::DeleteObject(m_imageButtonUp);
        }
        if (NULL != m_imageButtonDown)
        {
            ::DeleteObject(m_imageButtonDown);
        }
        if (NULL != m_imageBitmapNormal)
        {
            ::DeleteObject(m_imageButtonDown);
        }
    }
    
    
    BEGIN_MESSAGE_MAP(CPngButton, CBitmapButton)
        ON_WM_LBUTTONDOWN()
        ON_WM_LBUTTONUP()
        ON_WM_MOUSEMOVE()
    END_MESSAGE_MAP()
    
    
    
    // CBitmapButtonEx 消息处理程序
    
    BOOL CPngButton::SetButtonUpBitmapEx(const CString& szFilePath)
    {
        if (!m_imageButtonUp.IsNull())
        {
            m_imageButtonUp.Destroy();
        }
        m_imageButtonUp.Load(szFilePath);
        if (!m_imageButtonUp.IsNull())
        {
            CTransparentPNG tran;
            tran(&m_imageButtonUp);
        }
        return !m_imageButtonUp.IsNull();
    }
    
    
    BOOL CPngButton::SetButtonNormalBitmapEx(const CString& szFilePath)
    {
        if (!m_imageBitmapNormal.IsNull())
        {
            m_imageBitmapNormal.Destroy();
        }
        m_imageBitmapNormal.Load(szFilePath);
        if (!m_imageBitmapNormal.IsNull())
        {
            CTransparentPNG tran;
            tran(&m_imageBitmapNormal);
        }
        return !m_imageBitmapNormal.IsNull();
    }
    
    // BOOL CPngButton::SetRedPointImage(const CString& szFilePath)
    // {
    //     if (!m_imageRedPoint.IsNull())
    //     {
    //         m_imageRedPoint.Destroy();
    //     }
    //     m_imageRedPoint.Load(szFilePath);
    //     if (!m_imageRedPoint.IsNull())
    //     {
    //         CTransparentPNG tran;
    //         tran(&m_imageRedPoint);
    //     }
    //     return !m_imageRedPoint.IsNull();
    // }
    BOOL CPngButton::SetButtonDownBitmapEx(const CString& szFilePath)
    {
        if (!m_imageButtonDown.IsNull())
        {
            m_imageButtonDown.Destroy();
        }
        m_imageButtonDown.Load(szFilePath);
        if (!m_imageButtonDown.IsNull())
        {
            CTransparentPNG tran;
            tran(&m_imageButtonDown);
        }
        return !m_imageButtonDown.IsNull();
    }
    
    void CPngButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        // TODO:  添加您的代码以绘制指定项
        CRect rect =  lpDrawItemStruct->rcItem;
    
        if (m_first)
        {// 复制背景
            CDialog* pParent=(CDialog*)GetParent();  
            CPoint pt(0,0);  
            MapWindowPoints(pParent,&pt,1);  
            CDC * pdc = GetParent ()->GetDC ();
            m_bkDc.CreateCompatibleDC (pdc);
            CBitmap memBmp;
            memBmp.CreateCompatibleBitmap(pdc, rect.right, rect.bottom);
            m_bkDc.SelectObject(&memBmp);
            m_bkDc.BitBlt (0, 0, rect.right, rect.bottom, pdc, pt.x, pt.y, SRCCOPY);
            ReleaseDC (pdc);
            m_first = false;
        }
    //     CClientDC dc(this);
    //     dc.Rectangle (rect);
        // 背景
        CDC* thisdc = NULL;
        thisdc = GetDC();
        thisdc->BitBlt (0, 0, rect.right, rect.bottom, &m_bkDc, 0/*rect.right*/, 0/*rect.bottom*/, SRCCOPY);
        
        if (m_lButtonDown)
        {
            if (m_imageButtonDown.IsNull())
            {
    //             CString szLog;
    //             szLog.Format(_T("m_imageButtonDown 未加载背景图片!"));
    //             AppLog(szLog);
            }
            else
            {
                m_imageButtonDown.Draw(thisdc->m_hDC, rect/*m_rectDrawButton*/);
            }
        }
        else
        {
            if (m_bMouseOver)
            {
                if (m_imageButtonUp.IsNull())
                {
    //                 CString szLog;
    //                 szLog.Format(_T("m_imageButtonUp 未加载背景图片!"));
    //                 AppLog(szLog);
                }
                else
                {
                    m_imageButtonUp.Draw(thisdc->m_hDC, rect/*m_rectDrawButton*/);
                }
            }
            else
            {
                if (m_imageBitmapNormal.IsNull())
                {
    //                 CString szLog;
    //                 szLog.Format(_T("m_imageBitmapNormal 未加载背景图片!"));
    //                 AppLog(szLog);
                }
                else
                {
                    m_imageBitmapNormal.Draw(thisdc->m_hDC, rect/*m_rectDrawButton*/);
                }
            }
        }
        if (0 == this->ReleaseDC(thisdc))
        {
    //         CString szLog;
    //         szLog.Format(_T("ReleaseDC error!"));
    //         AppLog(szLog);
        }
    }
    
    void CPngButton::PreSubclassWindow()
    {
        // TODO: 在此添加专用代码和/或调用基类
    
        ModifyStyle(0, WS_CLIPCHILDREN | BS_OWNERDRAW ); //设置按钮的有效区域 
    
    //     CRect rect;
    //     GetClientRect(&rect);
    //     CDialog* pParent=(CDialog*)GetParent();  
    //     CPoint pt(rect.left, rect.top);  
    //     MapWindowPoints(pParent, &pt, 1);  
    //     CDC * pdc = GetParent ()->GetDC ();
    //     // 复制背景
    //     m_bkDc.CreateCompatibleDC (pdc);
    //     CBitmap memBmp;
    //     memBmp.CreateCompatibleBitmap(pdc, rect.right, rect.bottom);
    //     m_bkDc.SelectObject(&memBmp);
    //     m_bkDc.BitBlt (0, 0, rect.right, rect.bottom, pdc, 0, 0, SRCCOPY);
    //     ReleaseDC (pdc); 
    
    //     m_btRgn.CreateRectRgnIndirect (rc);
    //     SetWindowRgn(m_btRgn, TRUE); 
    
        CBitmapButton::PreSubclassWindow();
    }
    
    void CPngButton::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        m_lButtonDown = TRUE;
        CBitmapButton::OnLButtonDown(nFlags, point);
    }
    
    void CPngButton::OnLButtonUp(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        m_lButtonDown = FALSE;
        CBitmapButton::OnLButtonUp(nFlags, point);
    }
    
    BOOL CPngButton::PreTranslateMessage(MSG* pMsg)
    {
        // TODO: 在此添加专用代码和/或调用基类
    
        if(pMsg->message==WM_MOUSELEAVE) 
        {
            m_bTrack=FALSE;
            m_bMouseOver = FALSE;
            InvalidateRect(NULL);
        }
        else if (pMsg->message==WM_MOUSEHOVER)
        {
            m_bMouseOver = TRUE;
            InvalidateRect(NULL);
        }
    
        return CBitmapButton::PreTranslateMessage(pMsg);
    }
    
    void CPngButton::OnMouseMove(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        if(!m_bTrack)
        {
            TRACKMOUSEEVENT tme;
            tme.cbSize=sizeof(TRACKMOUSEEVENT);
            tme.dwFlags=TME_HOVER | TME_LEAVE;
            tme.dwHoverTime=HOVER_DEFAULT;
            tme.hwndTrack=m_hWnd;
    
            m_bTrack=_TrackMouseEvent(&tme);
        }
    
        CBitmapButton::OnMouseMove(nFlags, point);
    }
    CTransparentPNG 地址

    点击打开链接https://gitee.com/user.zt/codes/rni2jtabfxcykzu7lvo3067

    因gitee.com代码段公共访问功能关闭导致上述链接失效,现将代码贴出。

    CTransparentPNG 

    /
    // 工程: 
    // 作者: 
    // 描述: 处理png图片,使背景变白
    // 主要函数:
    // 日期: 2014.11.28
    // 版本: 1.0
    // 修改:
    /
    #pragma once
    class CTransparentPNG
    {
    
    public:
        CTransparentPNG() {}
        ~CTransparentPNG() {}
    
    
        bool operator()(CImage* image) {
            if (!image)
                return false;
            if (image->GetBPP() != 32)
                return false;
            for (int i = 0; i < image->GetWidth(); ++i)
            {
                for (int j = 0; j < image->GetHeight(); ++j)
                {
                    unsigned char* pucColor = reinterpret_cast<unsigned char*>(image->GetPixelAddress(i, j));
                    pucColor[0] = pucColor[0] * pucColor[3] / 255;
                    pucColor[1] = pucColor[1] * pucColor[3] / 255;
                    pucColor[2] = pucColor[2] * pucColor[3] / 255;
                }
            }
    
            return true;
        }
    
        static bool TransPng(CImage* image)
        {
            if (!image)
                return false;
            if (image->GetBPP() != 32)
                return false;
            for (int i = 0; i < image->GetWidth(); ++i)
            {
                for (int j = 0; j < image->GetHeight(); ++j)
                {
                    unsigned char* pucColor = reinterpret_cast<unsigned char*>(image->GetPixelAddress(i, j));
                    pucColor[0] = pucColor[0] * pucColor[3] / 255;
                    pucColor[1] = pucColor[1] * pucColor[3] / 255;
                    pucColor[2] = pucColor[2] * pucColor[3] / 255;
                }
            }
            return true;
        }
    
    };
    
    

     

     

     

     

     

     

    展开全文
  • MFC利用libpng源码库显示PNG图片

    热门讨论 2009-08-18 16:36:51
    MFC利用libpng源码库显示PNG图片
  • void ShowImage(void* pImage) { COleStreamFile osf; osf.CreateMemoryStream(NULL); osf.Write(pImage, 1024 * 10); osf.SeekToBegin();... if (SUCCEEDED(image.Load(osf.GetStream()))) ... ...
  • mfc picture控件显示png图片

    千次阅读 2017-01-19 14:31:49
    onpaint函数里添加程序: ...Image image(L"./res/png/light.png"); // Construct an image graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight()); delete pDC;
  • MFC view显示Png图片(bitmap方式显示)

    千次阅读 2013-07-13 21:27:48
    str.Format("layer (%d).png", layernum); filename = BMPFolder + "\\" + str; layerPng.Load(filename); hBitmap=layerPng.Detach(); CBitmap bmp; BITMAP l_bitMap; bmp.Attach(hBitmap); ...
  • 简介:可以显示本地的背景透明的PNG图片的方法 多字节字符集 效果图 主要代码 CImage m_Image; m_Image.Load("1.png");//装载图片 if(m_Image.IsNull()) { return; } CClientDC dc(this); m_Image.Draw( dc, ...
  • 因为PNG包含Alpha通道,所以不同于BITMAP,在MFC中使用CImage类对其进行处理,通常使用load和draw成员函数。 所以标题的论述可以进一步解释为,使用CImage实现双缓冲。 通常的双缓冲方法为(首先将消息函数afx_msg...
  • MFC环境下显示透明PNG图片

    千次阅读 2014-04-25 16:30:31
    工作需要又得使用MFC变调试软件。
  • 1.GDI+画透明图层(alpha)的png图片 stdafx加入如下: #include <comdef.h>//初始化一下com口 #include "GdiPlus.h" using namespace Gdiplus; #pragma comment(lib,"gdiplus.lib") 开始初始化:.....
  • mfc中插入PNG透明图片

    千次阅读 2019-02-28 11:34:03
    mfc中插入PNG透明图片记录下在mfc中插入png透明图片的方法新建项目在对话框界面中插入两个 Picture Control在...新入坑c++,使用的是vs2015,想在一个mfc项目中插入外部的png图片。发现默认的image控件只能直接拖放b...
  • mfc加载png

    2016-07-19 15:07:47
    使用时直接调用里面的showPNG函数,传递窗口指针,资源id,以及显示的位置即可 #pragma once #include "stdafx.h" BOOL LoadImageFromResource(CImage *pImage, UINT nResID, LPCTSTR lpTyp) { if (pImage == ...
  • MFCpng格式图片贴图的实现(2011-07-14 19:10:29) ___转载自新浪 初学vc,正在做五子棋,五子棋中的图片格式都是bmp格式的,所以贴图用CBitmap可以很简单的实现。刚开始也没有在意那么多,今天刚把五子棋做完就...
  • 原地址:MFCpng格式图片贴图的实现 学vc,正在做五子棋,五子棋中的图片格式都是bmp格式的,所以贴图用CBitmap可以很简单的实现。刚开始也没有在意那么多,今天刚把五子棋做完就兴冲冲的把代码和release版本的exe...
  • //【1】加载图片 CImage image_src, image_dst; image_src.Load(_T("./res/Windows_Logo_1995.png")); //【2】设置控件为位图模式、居中显示 picture.ModifyStyle(0xF, SS_BITMAP | SS_CENTERIMAGE); //【3】对原...
  • 如题 找了很久资料 代码都报错 无能为力 来此求助 非常感谢! 代码中一个 Path 来传入外部图片路径
  • MFC常常需要显示图片信息,当前测试了png jpg两种图片显示方法,均可用。 CString FilePath = _T("D:\\jinbing\\test\\test_1_8_1\\mfc\\mfc\\img\\2.png"); CImage image; image.Load(FilePath); image.Draw...
  • @这两天弄了拆分窗口和图片显示,还有把前面的基础又弄了下。 @之前界面这块用的是动态拆分窗口,可是考虑到别的操作,包括图片显示区域以及具体操作的时候,窗口的索引等信息会出现莫名其妙现在不理解的问题。...
  • 加载png图片 MFC

    千次阅读 2012-11-13 19:07:52
    加载png图片的两个解决办法。一个是用GDI+,另外就是用vs.net MFC自带的CImage。     方法1: 1.GDI+画透明图层(alpha)的png图片 ----------------------------------------------------------------------...
  • MFC的PNG贴图按钮类(详细注释) (转载请注明出处) 作者:梦镜谷雨 ...可以载入通过资源的ID加载也可以通过外部动态加载PNG图片,可以选择半透明贴膜效果。 参考代码:https://blog.csdn.net/qq_16123...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,834
精华内容 1,133
关键字:

mfc显示png图片