首页 > 代码库 > GDI/GDI+这些破事

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);