• GDI/GDI+这些破事


    本文是杂篇,纯属笔记,想到哪写到那!

    1、获取像素的RGB以及填充

    CPaintDC dc(m_hWnd);
    COLORREF color=dc.GetPixel(0,0);
    int R=GetRValue(color);
    int G=GetGValue(color);
    nt B=GetBValue(color);
    dc.FillSolidRect(m_rcWindow,RGB(R,G,B));

    2、从图片获取窗体Region

    HRGN CreateRegionFromBitmap(Bitmap* bitmap, BYTE alphaValve/* = 0*/)
    {
        UINT width = bitmap->GetWidth();
        UINT height = bitmap->GetHeight();
    
        Color color;
        HRGN hRegion = ::CreateRectRgn(0, 0, width, height);
        HRGN rgn = ::CreateRectRgn(0, 0, width, height);
        for (UINT h = 0; h < height; ++h)
        {
            for (UINT w = 0; w < width; ++w)
            {
                UINT start = w;
                while (w < width)
                {
                    bitmap->GetPixel(w, h, &color);
                    if (color.GetAlpha() > alphaValve)
                        break;
                    ++w;
                }
                if (w > start)
                {
                    ::SetRectRgn(rgn, start, h, w, h + 1);
                    ::CombineRgn(hRegion, hRegion, rgn, RGN_DIFF);
                }
            }
        }
        ::DeleteObject(rgn);
        return hRegion;
    }

    //////////////////////////
    调用:

    Bitmap bitmap(_T("图片路径"));

    HRGN m_rgn;

    m_rgn=CreateRegionFromBitmap(&bitmap,254);//不取半透明图像

     3、UpdateLayeredWindow

      Image *m_pImageBackground;

       ModifyStyleEx(0, WS_EX_LAYERED); typedef BOOL (WINAPI*UpdateLayeredWindowFunc)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD); m_pImageBackground = Image::FromFile(_T("图片路径")); PAINTSTRUCT ps; HDC hdc = BeginPaint( &ps); HDC hdcMem = CreateCompatibleDC(hdc); HBITMAP hBitmap = CreateCompatibleBitmap(hdc,400,233); SelectObject(hdcMem, hBitmap); Graphics graph(hdcMem); graph.DrawImage(m_pImageBackground, 0, 0, 400, 233); HMODULE hDll = LoadLibrary(_T("user32.DLL")); UpdateLayeredWindowFunc UpdateLayeredWindow=(UpdateLayeredWindowFunc)GetProcAddress(hDll, "UpdateLayeredWindow"); int nClientWith= GetSystemMetrics(SM_CXFULLSCREEN); int nClientHeigh= GetSystemMetrics(SM_CYFULLSCREEN); int x = (nClientWith-400)/2; int y = (nClientHeigh-233)/2; POINT dstPoint = {x,y}; POINT srcPoint = {0,0}; SIZE size = {400,233}; BLENDFUNCTION m_Blend; m_Blend.BlendOp=0; m_Blend.BlendFlags=0; m_Blend.AlphaFormat=1; m_Blend.SourceConstantAlpha=255; UpdateLayeredWindow(m_hWnd,hdc,&dstPoint,&size,hdcMem,&srcPoint,0,&m_Blend,2); FreeLibrary(hDll);

     4、画图

    CBitmap m_btm_main;
    
    HBITMAP GetBitmapFromFile( LPCWSTR pFile )
        {
            std::auto_ptr<Bitmap> pBmp(new Bitmap(pFile));
            if(!pBmp.get())
                return NULL;
            HBITMAP hBmp = NULL;
            Color backColor = Color(255,0,0,0);   
            if(Ok!=pBmp->GetHBITMAP(backColor,&hBmp))
                return NULL;
            return hBmp;
        }
        void SetBgBmp(CString strMain)
        {
            m_btm_main.Attach(GetBitmapFromFile(strMain));
        }
        BOOL  DrawBmp( HDC hdc, CRect rect, HBITMAP hBitmap)
        {
            BITMAP bm;
            GetObject(hBitmap,sizeof(bm),(VOID*)&bm);
            INT nWidth = bm.bmWidth;
            INT nHeight = bm.bmHeight;
            CDC memdc;
            memdc.CreateCompatibleDC(hdc);
            CBitmap bitmap;
            bitmap.CreateCompatibleBitmap(hdc,nWidth,nHeight);
            memdc.SelectBitmap(hBitmap);
            
            BLENDFUNCTION bf = {0,0,255,1};
    
            return ::AlphaBlend(hdc,rect.left,rect.top,nWidth,nHeight,memdc,0,0,nWidth,nHeight,bf);
        
      }
    
    调用:
     CPaintDC dc(m_hWnd);    
     DrawBmp(dc,m_rcWindow,m_btm_main);
            

    5、设置顶层窗体

    在初始化函数中调用
    SetWindowPos(HWND_TOPMOST,0,0,0,0,SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);
  • 相关阅读:
    Kafka 配置
    Zookeeper的Watcher机制
    Ubuntu18.04下希捷移动硬盘Seagate Backup Plus读写慢
    Spring Boot 使用Jar打包发布, 并使用 Embedded Jetty/Tomcat 容器
    再谈C#委托与事件
    C#委托和事件例析
    PHP:session无法使用
    C++:实现类似MFC的IsKindOf功能
    C++:复制构造函数
    C++:运算符重载
  • 原文地址:https://www.cnblogs.com/duyy/p/3885638.html
Copyright © 2020-2023  润新知