zoukankan      html  css  js  c++  java
  • GDI+使用小记

    1.初始化:

    #include <GdiPlus.h>
    using namespace Gdiplus; 
    #pragma comment(lib,"gdiplus.lib")

     GdiplusStartupInput gdiplusStartupInput;
    	GdiplusStartup(&Gdi_token, &gdiplusStartupInput, NULL) ;
    

      GdiplusShutdown(Gdi_token);

    2.使用:
    先贴几个简单的例子:

    绝对路径:

    		    Image image(TEXT("D:\\Program Files\\vs2005_Project\\test\\test\\res\\未标题-1.png"));
    			CPaintDC dc(this);
    			Graphics g(dc) ;
    			g.DrawImage(&image,0,0,image.GetWidth(),image.GetHeight());


    不要写Image img;这样会报错:error C2248: “Gdiplus::Image::Image”: 无法访问 protected 成员(在“Gdiplus::Image”类中声明)

    相对路径:
      

    BOOL LoadResImage(int nResID,Image * &lpImage,LPCTSTR lpType = TEXT("PNG"));
    BOOL LoadResImage(int nResID,Image * &lpImage, LPCTSTR lpType)
    {
    	HINSTANCE hIns=AfxGetInstanceHandle();
    	HRSRC hRsrc = ::FindResource (hIns,MAKEINTRESOURCE(nResID),lpType); // type 
    	if (!hRsrc) 
    		return FALSE; 
    	// load resource into memory 
    	DWORD len = SizeofResource(hIns, hRsrc); 
    	BYTE* lpRsrc = (BYTE*)LoadResource(hIns, hRsrc); 
    	if (!lpRsrc) 
    		return FALSE; 
    	// Allocate global memory on which to create stream 
    	HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len); 
    	//HGLOBAL m_hMem = GlobalAlloc(GHND, len); 
    //=======================================================
    //GMEM_FIXED:分配固定的内存
    //GMEM_MOVEABLE:分配可移动的内存,不能与 GMEM_FIXED 组合使用
    //GMEM_ZEROINIT:将所申请内存初始化为0.
    //=======================================================
    	BYTE* pmem = (BYTE*)GlobalLock(m_hMem); 
    	memcpy(pmem,lpRsrc,len); 
    	IStream* pstm; 
    	HRESULT ht =  CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); 
    	if (ht != S_OK)
    	{
    		GlobalFree(m_hMem);
    		return FALSE ;
    	}
    	// load from stream 
    	lpImage=Gdiplus::Image::FromStream(pstm); 
    	// free/release stuff 
    	GlobalUnlock(m_hMem); 
    	pstm->Release(); 
    	FreeResource(lpRsrc);
             GlobalFree(m_hMem);return TRUE ;
    }

    调用:
    Image *pimage;
                //BOOL result  = LoadResImage(IDR_JPG1,pimage,TEXT("JPG")) ;
    			BOOL result  = LoadResImage(IDB_PNG1,pimage,TEXT("PNG")) ;
    			if (result)
    			{
    				CPaintDC dc(this);
    				Graphics g(dc) ;
    				g.DrawImage(pimage,0,0,pimage->GetWidth(),pimage->GetHeight());
    			}

    小知识:要用PS创建背景透明的PNG,直接把背景删了,保存。同样,上面例子画出来的PNG透明部分会把底色透出来


    3.判断Image对象的类型:
    简单说明例子:

    	                        GUID formatID;
    				pimage->GetRawFormat(&formatID);
    				int m_nImgFormat;
    				enum IMGFORMAT { if_bmp, if_jpg, if_png, if_gif, if_tiff, if_error };
    				if (formatID == Gdiplus::ImageFormatBMP)
    				{
    					m_nImgFormat = if_bmp;
    				}
    				if (formatID == Gdiplus::ImageFormatJPEG)
    				{
    					m_nImgFormat = if_jpg;
    				}
    				if (formatID == Gdiplus::ImageFormatPNG)
    				{
    					m_nImgFormat = if_png;
    				}
    				if (formatID == Gdiplus::ImageFormatGIF)
    				{
    					m_nImgFormat = if_gif;
    				}
    				if (formatID == Gdiplus::ImageFormatTIFF)
    				{
    					m_nImgFormat = if_tiff;
    				}


  • 相关阅读:
    UITextView in iOS7 doesn&#39;t scroll
    interlliJ idea 不识别文件类型的解决方式
    __super
    自用广告过滤规则,整合xwhyc大大的,非常小才79K
    Eclipse设置打印线
    SQL Server批量替换全部表中内容sql语句-清楚挂马
    删除同样元素(线性表)
    学习node js 之微信公众帐号接口开发 准备工作之三
    Bitmap基本概念及在Android4.4系统上使用BitmapFactory的注意事项
    多个rs485设备怎样跟上位机通讯?
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693621.html
Copyright © 2011-2022 走看看