日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【MFC系列-第21天】GDI算法实战——过渡色

發布時間:2023/12/2 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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算法实战——过渡色的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。