VC + 색상 그 라 데 이 션 실현 3 가지 방법

     (   、  、    )        ,        ,                 。     ,             ,     。        ,         。        3        ,  2        。
1.   :         R、G、B     ,           , R、G、B                R、G、B    (   ),       R、G、B +                     。    :
void CDrawColorDlg::DrawGradientColor(COLORREF StartColor,COLORREF EndColor)
{
 CRect rect;
 GetClientRect(rect);//
//        R、G、B  
 BYTE r1 = GetRValue(StartColor);
 BYTE g1 = GetGValue(StartColor);
 BYTE b1 = GetBValue(StartColor);
//        R、G、B  
 BYTE r2 = GetRValue(EndColor);
 BYTE g2 = GetGValue(EndColor);
 BYTE b2 = GetBValue(EndColor);
             
 double r,g,b;
 r = (double)(r2-r1)/rect.Width();
 g = (double)(g2-g1)/rect.Width();
 b = (double)(b2-b1)/rect.Width();
 BYTE r3;
 BYTE g3 ;
 BYTE b3;
 CDC* pDC = GetDC();//  DC
//   
 for (int i = 0 ; i<rect.Width();i++)
 {
//       R、G、B  
  r3 = r1+ i*r;
  g3 = g1+i*g;
  b3 = b1+i*b;
  CPen pen(PS_SOLID,1,RGB(r3,g3,b3));
  pDC->SelectObject(&pen);
  pDC->MoveTo(i,0);
  pDC->LineTo(i,rect.Height());
 }
 pDC->DeleteDC();
}
            。           ,     。
2.  windows      API  GradientFill():             。        MSDN。     :
void CDrawColorDlg::DrawGradientColor(COLORREF StartColor,COLORREF EndColor)
{
 CRect rect;
 GetClientRect(rect);//
 CDC* pDC = GetDC();//  DC
//   
 GradientFillRect(pDC->m_hDC,rect, GRADIENT_FILL_RECT_H, StartColor, EndColor);
 pDC->DeleteDC();
}
            ,        API        。
3.        :      (        )       BMP   ,        API          。
 
void CDrawColorDlg::DrawGradientColor()
{
 CRect rect;
 GetClientRect(rect);//
 CDC* pDC = GetDC();//  DC
 CDC memDC;
 memDC.CreateCompatibleDC(pDC);
 BITMAP bm;
 HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, m_strBitmap, IMAGE_BITMAP, 0, 0,    LR_DEFAULTSIZE|LR_LOADFROMFILE);
 ASSERT(hBitmap);
 if (bitmap.m_hObject)
      bitmap.Detach();
 bitmap.Attach(hBitmap);
 bitmap.GetBitmap(&bm);
 CBitmap *pOldBitmap = (CBitmap*)memDC.SelectObject(&bitmap);
//pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);
 pDC->StretchBlt(0, 0, rect.Height(), rect.Width(),&memDC, 0, 0,bm.bmWidth,bm.bmHeight, SRCCOPY);  
 pDC->SelectObject(pOldBitmap);
 memDC.DeleteDC();
  pDC->DeleteDC();
}
                        ,       ,              ,     (            )。
4.GDI+ LinearGradientBrush: , 3 。 。 GDI+ 。
       3          ,         。
        :http://download.csdn.net/source/2836144
       :http://blog.csdn.net/mycaibo

좋은 웹페이지 즐겨찾기