• VC++玩转炫酷悬浮窗3---GDI+完美实现不规则窗体
  • 发布时间:2017-11-12 19:23 | 作者:admin | 来源:网络整理 | 浏览:
  • 

    目的
    上一篇不规则窗体轻蔑的拒绝或不承认变卖了,但图形是曲折地前进的,专一些世纪以后的古董的感,不偏护酷。如今的濒用资历较深的大约的技术做出无疵可寻的滑溜的无锐齿的不规则窗体。
    打算和打算
    PNG图片自己是透明性的。,把这幅画用作表格,用GDI 变卖。
    这么是什么GDI ?让我们的先谈谈GDI, Graphics Devices Interface,图形素养喉舌,主管体系与标图顺序私下的物序列,输入处置所一些Windows图形顺序。GDI 是它的扶助向上移动版本。,XP乘以是它的东西子体系。,主管在显示检查和印记素养输入物。顺序员土地多种功用变卖图形化节目。,心不在焉知觉图形武器装备变卖的详细资料。
    正类似:随意水很弱三千,我只喝一杯。。这是我首次润色GDI。,顺序中只运用了大约作用。,照猫画虎运用专一些功用。。
    本文的主要功用是:UpdateLayeredWindow,

    BOOL WINAPI UpdateLayeredWindow(
      _In_      HWND hwnd,//窗口句柄
      _In_opt_  HDC hdcDst,最近的窗口的HDC
      _In_opt_  POINT *pptDst,//
      _In_opt_  SIZE *psize,
      _In_opt_  HDC hdcSrc,
      _In_opt_  POINT *pptSrc,
      _In_      COLORREF crKey,
      _In_opt_  BLENDFUNCTION *pblend,
      _In_      DWORD dwFlags
    );

    请参阅官方网站。:(v=).aspx

    进行
    一、GDI 在vs2012拨给的场地
    VS2012有GDI 供养,您不必独立下载骑上包。。如今只必要向条款中引入和添加头排成一行行走。。Properties-Configuration Properties -Linker - Input - Additional Dependencies 插脚“”。
    为了在完全的条款中运用GDI,在头排成一行行走中添加和运用指定投宿。

    #include ""   
    using namespace Gdiplus; 

    二、设定初值GDI

    设定初值应用时,开端GDI
    BOOL CXXXApp::InitInstance()
    {
    	...
            //use GDIplus begin
    	GdiplusStartupInput gdiplusStartupInput;	
    	GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, null)
            //use GDIplus end
    	...
    }
    当顺序停止时,闭合GDI
    int CXXXApp::ExitInstance()
    {
        //close gdiplus environment
    	GdiplusShutdown(m_gdiplusToken);
    	return CWinApp::ExitInstance();
    }

    三、向条款资源添加PNG图片
    当我们的向资源喉舌添加资源时,Add 资源喉舌仅为图标和位图。,心不在焉PNG是可选的,不要理它,我们的但是待见出口。,你会发觉插脚PNG图片,PNG排成一行行走夹神奇地出如今资源喉舌上。。

    四、  将图片瞄准到内存中
    借凉功用,它把各式各样的图片装入内存。。如次:

    ///resurceID: resource ID
    ///imgType: type of image
    ///pImg: pointer to image
    BOOL CAfloatWindowDlg::ImageFromIDResource(UINT resurceID,LPCTSTR imgType,Image * &pImg)
    {
    	HINSTANCE hInst = AfxGetResourceHandle();
    	HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(resurceID),imgType); // type
    	if (hRsrc)
        {
    	    // load resource into memory
    	    DWORD len = SizeofResource(hInst, hRsrc);
    	    BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
    	    if (lpRsrc)
            {
                // 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)
    	        IStream* pstm;
    	        CreateStreamOnHGlobal(m_hMem,FALSE,PSTM)
    	
    	        // load from stream
    	        pImg=Gdiplus::Image::FromStream(pstm);
    
    	        // free/release stuff
    	        GlobalUnlock(m_hMem);
    	        pstm->Release();
    	        FreeResource(lpRsrc);
                return TRUE;
            }
        }
        return FALSE;
    }

    五、将窗口底色更代替图片
    是指蝴蝶的秒表源,最要紧的是要看运用UpdateLayeredWindow。

    BOOL CAfloatWindowDlg::UpdateDisplay(Image *image, int 透明性)
    {
        int imageWidth = 240;
        int imageHeight = 240;//magic number of my image width and height
    	HDC hdcTemp=GetDC()->m_hDC;
    	m_hdcMemory=CreateCompatibleDC(hdcTemp);
    	HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,imageWidth,imageHeight);
    	SelectObject(m_hdcMemory,hBitMap);
    条件(透明性<0||Transparent>100)	Transparent=100;
    
    	(Transparent*);//1~255, if you want to change transparent, modify 这。
    	HDC hdcScreen=::GetDC (m_hWnd);
    	RECT rct;
    	GetWindowRect(&rct);
    	POINT ptWinPos={};
    	Graphics graph(m_hdcMemory);
    
    	Point points[] = { 点(0, 0), 
    		               Point(图片Width, 0), //width
    					   点(0, imageHeight)//height
    					};
    
        (图片,points,3);/ /做 it!
    
    	SIZE sizeWindow={imageWidth,imageHeight};
    	POINT ptSrc={0,0};
    	DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
    	if((dwExStyle&0x80000)!=0x80000)
    		SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);
    
    	BOOL bRet=FALSE;
    	bRet= UpdateLayeredWindow( m_hWnd,hdcScreen,&ptWinPos,
    				&sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2);
    	(m_hdcMemory);
    	::ReleaseDC(m_hWnd,hdcScreen);
    	hdcScreen=NULL;
    	::ReleaseDC(m_hWnd,hdcTemp);
    	hdcTemp=NULL;
    	DeleteObject(hBitMap);
    	DeleteDC(m_hdcMemory);
    	m_hdcMemory=NULL;
    	return bRet;
    }

    六、 完毕
    到眼前为止,我们的的探察先前取得了要紧的有或起作用。,运转终结如次所示。


    是什么曲折地前进的?,不必烦恼了。
    嗨的源代码,添加生气。请求教于。
    求教于:
    《GDI+ 透明性窗口.UpdateLayeredWindow》
    GDI 节目概述

  • 收藏 | 打印
  • 相关内容
  • 男人 | 女人 | 时尚 | 两性 | 知性 | 娱乐 | 健康 | 视界 | 读书 |
  • Copyright © 2016-2017 365bet - 365bet官网 - 365bet体育在线投注 版权所有 晋ICP备13005168号-1
  • 免责声明:本站部分信息来自互联网,并不带表本站观点!若侵害了您的利益,请联系我们,我们将及时删除!