【MFC系列-第21天】GDI算法实战——过渡色
生活随笔
收集整理的這篇文章主要介紹了
【MFC系列-第21天】GDI算法实战——过渡色
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
21.1 Caption過渡色實現
// 方法一
void CCaptionDlg::DrawColorTitle(CRect rect, COLORREF col1, COLORREF col2,CDC* pDC) {int cx = rect.Width();int red = GetRValue(col2) - GetRValue(col1);int green = GetGValue(col2) - GetGValue(col1);int blue = GetBValue(col2) - GetBValue(col1);int i = 0;CPen* pOldPen = pDC->GetCurrentPen();;while (i < cx){int r = GetRValue(col1) + i*red / cx;int g = GetGValue(col1) + i*green / cx;int b = GetBValue(col1) + i*blue / cx;/* int j = 0;while (j < rect.bottom){pDC->SetPixel(i, j, RGB(r, g, b));++j;}*/CPen pen(PS_SOLID, 1, RGB(r, g, b));pDC->SelectObject(&pen);pDC->MoveTo(i, 0);pDC->LineTo(i, rect.bottom);++i;}if(pOldPen)pDC->SelectObject(pOldPen); } void CCaptionDlg::OnNcPaint() {CWindowDC dc(this);CRect rect,rt;GetWindowRect(rect);rect.OffsetRect(-rect.left, -rect.top);rt = rect;rt.bottom = 30;DrawColorTitle(rect, RGB(255, 0, 0), RGB(0, 255, 255),&dc);//dc.Rectangle(rt);dc.SetTextColor(RGB(128, 255, 0));dc.SetBkMode(TRANSPARENT);dc.DrawText(_T("歡迎使用本軟件!"), rt, DT_CENTER|DT_VCENTER|DT_SINGLELINE);rt.right -= 5;rt.top += 5;rt.bottom -= 5;rt.left = rt.right - rt.Height();rt.OffsetRect(-5, 4);//CBrush br(RGB(255, 255, 0));//dc.SelectObject(br);//dc.Rectangle(rt);//dc.MoveTo(rt.TopLeft());//dc.LineTo(rt.BottomRight());//dc.MoveTo(rt.right, rt.top);//dc.LineTo(rt.left, rt.bottom);dc.DrawFrameControl(rt, DFC_CAPTION, DFCS_CAPTIONCLOSE);::DrawIconEx(dc.m_hDC, 7, 8, m_hIcon, 20, 20, 0, NULL, DI_NORMAL| DI_MASK); //標題欄畫圖標 // int cx = GetSystemMetrics(SM_CXFRAME); }21.2 形狀填充
dc.Rectangle(110, 10, 200, 100); dc.Ellipse(150, 50, 300, 150); CBrush br(RGB(0, 255, 0)); dc.SelectObject(br); dc.ExtFloodFill(115, 15, dc.GetPixel(115, 15), FLOODFILLSURFACE);21.3 假按鈕
//CRect rect(5, 5, 100, 35);//dc.DrawIcon(200, 200, m_hIcon);//dc.SelectObject(GetFont());//rect.DeflateRect(2, 2);//dc.DrawFocusRect(rect);//rect.OffsetRect(-1, -1);//dc.DrawText(_T("假按鈕"), rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);//dc.DrawEdge(CRect (5, 5, 100, 35) , m_bSelected? BDR_SUNKENINNER :BDR_RAISEDINNER, BF_RECT); //CRect rect(5, 5, 100, 35); //dc.SelectObject(GetFont()); // //dc.DrawFrameControl(rect, DFC_BUTTON, DFCS_BUTTONPUSH); //dc.DrawText(_T("假按鈕"), rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);21.4 GDI對象之四——位圖
一、位圖輸出
a)加載位圖:CBitmap::LoadBitmap
b)創建內存DC:CDC::CreateCompatible
c)內存DC選擇位圖:CDC::SelectObject
d)從內存DC輸出到界面:CDC::Bitblt
CPaintDC dc(this); // 用于繪制的設備上下文int nCount;if (!m_bmp.GetSafeHandle()){m_bmp.LoadBitmap(IDB_BITMAP1);}CDC mdc;//mdc.CreateCompatibleDC(&dc);mdc.SelectObject(&m_bmp);BITMAP bm;m_bmp.GetBitmap(&bm); dc.BitBlt(0, 0, bm.bmWidth,bm.bmHeight, &mdc, 0, 0, SRCCOPY);二、輔助位圖輸出:
a)獲取圖像高寬等信息:CBitmap::GetBitmap
b)壓縮或拉伸:CDC:StretchBlt
dc.BitBlt(0, 0, bm.bmWidth,bm.bmHeight, &mdc, 0, 0, SRCCOPY);dc.StretchBlt(bm.bmWidth + 2, 0, bm.bmWidth * 2, bm.bmHeight * 2,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);dc.StretchBlt(0, bm.bmHeight+2, bm.bmWidth /2, bm.bmHeight /2,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);c)設置壓縮算法:SetStretchBltMode
dc.SetStretchBltMode(STRETCH_HALFTONE);d)圖像翻轉
dc.StretchBlt(bm.bmWidth,0, -bm.bmWidth , bm.bmHeight ,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);dc.StretchBlt(0,bm.bmHeight*2, bm.bmWidth,-bm.bmHeight,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);e)WIN32位圖輸出
void OnPaint(HWND hwndDlg) {PAINTSTRUCT ps;HDC hdc = BeginPaint(hwndDlg, &ps);if(!g_bmp)g_bmp = LoadBitmap(g_hInst, (LPCTSTR)IDB_BITMAP1);BITMAP bm;GetObject(g_bmp, sizeof(BITMAP), &bm);HDC mdc = ::CreateCompatibleDC(hdc);::SelectObject(mdc, g_bmp);::SetStretchBltMode(hdc, HALFTONE);::BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, mdc, 0, 0, SRCCOPY);::StretchBlt(hdc, bm.bmWidth * 2, 0, -bm.bmWidth, bm.bmHeight, mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);EndPaint(hwndDlg, &ps);OutputDebugString(_T("WM_PAINT-OnPaint\n")); }f)圖像數據
if (!m_bmp.GetSafeHandle()) {m_bmp.LoadBitmap(IDB_BITMAP1);nCount = m_bmp.GetBitmapBits(0, NULL);char* p = new char[nCount];m_bmp.GetBitmapBits(nCount, p);delete []p; }21.5 GDI對象之五——區域
一、區域輸出
CPaintDC dc(this); // 用于繪制的設備上下文int nCount;if (!m_bmp.GetSafeHandle())m_bmp.LoadBitmap(IDB_BITMAP1);CDC mdc;//mdc.CreateCompatibleDC(&dc);mdc.SelectObject(&m_bmp);BITMAP bm;m_bmp.GetBitmap(&bm);dc.SetStretchBltMode(STRETCH_HALFTONE);CRgn r;r.CreateEllipticRgn(0, 0, bm.bmWidth, bm.bmHeight); //另一種方法//CRect rect(0, 0, bm.bmWidth, bm.bmHeight);//r.CreateEllipticRgnIndirect(rect);dc.SelectObject(r);dc.StretchBlt(0,0, bm.bmWidth *2, bm.bmHeight *2,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);二、手動繪制區域輸出
CRgn r1,r2; r1.CreateEllipticRgn(0, 0, bm.bmWidth*2, bm.bmHeight*2); POINT ps[] = { {172,249} ,{5,420},{320,420} }; r2.CreatePolygonRgn(ps, _countof(ps), ALTERNATE); CRgn r; r.CreateRectRgn(0,0,0,0); r.CombineRgn(&r1, &r2, RGN_XOR); this->SetWindowRgn(r,TRUE); //dc.SelectObject(r); dc.StretchBlt(0,0, bm.bmWidth *2, bm.bmHeight *2,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);拖動客戶區——假標題欄
LRESULT CBmDlg::OnNcHitTest(CPoint point) {return HTCAPTION; }總結
以上是生活随笔為你收集整理的【MFC系列-第21天】GDI算法实战——过渡色的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 七喜手机官网(七喜数码有限公司)
- 下一篇: 【MFC系列-第22天】GDI算法实战—