【MFC系列-第22天】GDI算法实战——过渡色
生活随笔
收集整理的這篇文章主要介紹了
【MFC系列-第22天】GDI算法实战——过渡色
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
關(guān)注公號【逆向通信猿】更精彩!!!
第22天 GDI算法實戰(zhàn)
CDC(HDC)繪圖類:
五大GDI對象類:CPen,CBrush,CFont,CBitmap,CRgn
22.1 走馬燈
設(shè)置定時器
SetTimer(1, 20, NULL);a)用窗口滾動來實現(xiàn),一種思路
//pLamp->ScrollWindow(-2,0); // this ->ScrollWindow(-2, 0);正確代碼:
void ClampDlg::OnTimer(UINT_PTR nIDEvent) {CWnd* pLamp = GetDlgItem(IDC_LAMP);CRect rect,rt;GetClientRect(rt);pLamp->GetWindowRect(rect);ScreenToClient(rect);rect.OffsetRect(-2, 0);if (rect.right <= 0)rect.OffsetRect(rt.Width() - rect.left,0);//rect.OffsetRect(rt.Width() + rect.Width(), 0);pLamp->MoveWindow(rect);CDialogEx::OnTimer(nIDEvent); }b)用CDC來實現(xiàn)
①臨時DC——ClientDC
m_szText = _T("本文內(nèi)容已由機器翻譯。如果您連接了 Internet,請選擇“聯(lián)機查看本主題”以在可編輯模式下對照英文內(nèi)容查看此頁。"); BOOL ClampDlg::OnInitDialog() {CDialogEx::OnInitDialog();CRect rect,rt;GetClientRect(rt);m_nLeft = rt.right;SetTimer(1, 20, NULL);//return TRUE; // 除非將焦點設(shè)置到控件,否則返回 TRUE } void ClampDlg::OnTimer(UINT_PTR nIDEvent) {CRect rect, rt;CClientDC dc(this);dc.SetBkColor(GetSysColor(COLOR_3DFACE));//dc.SetBkMode(TRANSPARENT);GetClientRect(rt);dc.SelectObject(GetFont());CSize size = dc.GetOutputTextExtent(m_szText);dc.TextOut(m_nLeft, rt.Height()-size.cy, m_szText);m_nLeft -= 1;if (m_nLeft + size.cx <= 0)m_nLeft = rt.right;CDialogEx::OnTimer(nIDEvent); } void ClampDlg::OnTimer(UINT_PTR nIDEvent) {CRect rect, rt;CClientDC dc(this);dc.SetBkColor(GetSysColor(COLOR_3DFACE));//dc.SetBkMode(TRANSPARENT);GetClientRect(rt);dc.SelectObject(GetFont());CSize size = dc.GetOutputTextExtent(m_szText);dc.TextOut(m_nLeft, rt.Height()-size.cy, m_szText);m_nLeft -= 1;if (m_nLeft + size.cx <= 0)m_nLeft = rt.right;CDialogEx::OnTimer(nIDEvent); }②創(chuàng)建控件,在OnTimer中繪圖
添加MFC類
③在OnPaint里繪圖,OnTimer里刷新
void CLampCtrl::OnTimer(UINT_PTR nIDEvent) {Invalidate(FALSE);CWnd::OnTimer(nIDEvent); }void CLampCtrl::OnPaint() {CPaintDC dc(this); // device context for paintingCRect rect, rt;GetClientRect(rt);if ((HFONT)m_font)dc.SelectObject(m_font);dc.FillSolidRect(rt, m_clBack);dc.SetBkMode(TRANSPARENT);dc.SetTextColor(m_clText);dc.SelectObject(GetFont());CSize size = dc.GetOutputTextExtent(m_szText);rect = rt;rect.left = m_nLeft--;dc.DrawText(m_szText, rect, DT_VCENTER | DT_SINGLELINE);if (m_nLeft2 > 0){rect.left = m_nLeft2--;dc.DrawText(m_szText, rect, DT_VCENTER | DT_SINGLELINE);}int nRight = m_nLeft + size.cx;if (nRight <= 0){m_nLeft = m_nLeft2;m_nLeft2 = 0;}else if (nRight < rt.right / 2 && !m_nLeft2)m_nLeft2 = rt.right; }22.2 圖片切換
class CPageDlg : public CDialogEx {HCURSOR m_hCursor; // 鼠標光標void OnOK() {}int m_nIndex;enum {PAGE_COUNT=4};CBitmap m_bs[PAGE_COUNT];CRect m_rs[PAGE_COUNT]; public:CPageDlg(CWnd* pParent = NULL); // 標準構(gòu)造函數(shù)// 對話框數(shù)據(jù) #ifdef AFX_DESIGN_TIMEenum { IDD = IDD_PAGE_DIALOG }; #endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 實現(xiàn) protected:HICON m_hIcon;// 生成的消息映射函數(shù)virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP() public:afx_msg void OnMouseMove(UINT nFlags, CPoint point); }; CPageDlg::CPageDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_PAGE_DIALOG, pParent) {m_hIcon = theApp.LoadIcon(IDR_MAINFRAME);m_hCursor = theApp.LoadStandardCursor(IDC_HAND); // 加載系統(tǒng)光標m_nIndex = 0; }void CPageDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX); }BEGIN_MESSAGE_MAP(CPageDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_MOUSEMOVE() END_MESSAGE_MAP()// CPageDlg 消息處理程序BOOL CPageDlg::OnInitDialog() {CDialogEx::OnInitDialog();int i = -1;while (++i < _countof(m_bs))m_bs[i].LoadBitmap(IDB_BITMAP1 + i);BITMAP bm;m_bs[0].GetBitmap(&bm);//MoveWindow(0, 0, bm.bmWidth, bm.bmHeight);SetWindowPos(NULL, 0, 0, bm.bmWidth, bm.bmHeight, SWP_NOMOVE);CRect rect(888, 276, 908, 327);i = -1;while (++i < _countof(m_rs)){m_rs[i] = rect;rect.OffsetRect(27, 0);}// 設(shè)置此對話框的圖標。 當應(yīng)用程序主窗口不是對話框時,框架將自動// 執(zhí)行此操作SetIcon(m_hIcon, TRUE); // 設(shè)置大圖標SetIcon(m_hIcon, FALSE); // 設(shè)置小圖標// TODO: 在此添加額外的初始化代碼return TRUE; // 除非將焦點設(shè)置到控件,否則返回 TRUE } void CPageDlg::OnPaint() {CPaintDC dc(this); // 用于繪制的設(shè)備上下文if (m_nIndex < 0 || m_nIndex >= _countof(m_bs))return;CDC mdc;mdc.CreateCompatibleDC(&dc);mdc.SelectObject(m_bs + m_nIndex);//m_bs[m_nIndex]CRect rect;GetClientRect(rect);dc.BitBlt(0, 0, rect.Width(), rect.Height(), &mdc, 0, 0, SRCCOPY); }//當用戶拖動最小化窗口時系統(tǒng)調(diào)用此函數(shù)取得光標 //顯示。 HCURSOR CPageDlg::OnQueryDragIcon() {return static_cast<HCURSOR>(m_hIcon); }void CPageDlg::OnMouseMove(UINT nFlags, CPoint point) {int i = -1;while (++i < _countof(m_rs)){if (m_rs[i].PtInRect(point)){if (m_nIndex != i){m_nIndex = i;Invalidate(FALSE);}SetCursor(m_hCursor); //光標變?yōu)槭中?/span>break;}}CDialogEx::OnMouseMove(nFlags, point); }22.2 圖片旋轉(zhuǎn)
在OnPaint中繪圖
CPageDlg::CPageDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_PAGE_DIALOG, pParent) {m_nDir = 3;m_nLeft = 0;m_hIcon = theApp.LoadIcon(IDR_MAINFRAME); }void CPageDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX); }BOOL CPageDlg::OnInitDialog() {CDialogEx::OnInitDialog();m_bitmap.LoadBitmap(IDB_BITMAP1);BITMAP bm;m_bitmap.GetBitmap(&bm);//MoveWindow(0, 0, bm.bmWidth, bm.bmHeight);SetWindowPos(NULL, 0, 0, bm.bmWidth, bm.bmHeight, SWP_NOMOVE);SetIcon(m_hIcon, TRUE); // 設(shè)置大圖標SetIcon(m_hIcon, FALSE); // 設(shè)置小圖標return TRUE; // 除非將焦點設(shè)置到控件,否則返回 TRUE }void CPageDlg::OnPaint() {CPaintDC dc(this); // 用于繪制的設(shè)備上下文//BITMAP bm;//m_bitmap.GetBitmap(&bm);CRect rect;GetClientRect(rect);CDC mdc;mdc.CreateCompatibleDC(&dc);mdc.SelectObject(&m_bitmap);dc.SetStretchBltMode(HALFTONE); //壓縮算法設(shè)置dc.StretchBlt(m_nLeft, 0, rect.Width() - m_nLeft * 2, rect.Height(), &mdc, 0, 0, rect.Width(), rect.Height(), SRCCOPY);SetTimer(1, 16, 0); }HCURSOR CPageDlg::OnQueryDragIcon() {return static_cast<HCURSOR>(m_hIcon); }void CPageDlg::OnMouseMove(UINT nFlags, CPoint point) {CDialogEx::OnMouseMove(nFlags, point); }void CPageDlg::OnTimer(UINT_PTR nIDEvent) {Invalidate(TRUE);//TRUE用窗口自帶背景色清理m_nLeft += m_nDir;CRect rect;GetClientRect(rect);if (m_nLeft >= rect.Width() || m_nLeft<=0)m_nDir *= -1;TRACE("m_nLeft=%d,Width=%d\n", m_nLeft, rect.Width());CDialogEx::OnTimer(nIDEvent); }Invalidate,TRUE用窗口自帶背景色清理,FALSE用上一次繪圖(圖片)的背景色,用TRUE會有閃爍,如何去除閃爍——分三部分繪圖
void CPageDlg::OnPaint() {CPaintDC dc(this); // 用于繪制的設(shè)備上下文//BITMAP bm;//m_bitmap.GetBitmap(&bm);CRect rect, rt;GetClientRect(rect);CDC mdc;mdc.CreateCompatibleDC(&dc);mdc.SelectObject(&m_bitmap);dc.SetStretchBltMode(COLORONCOLOR);dc.StretchBlt(m_nLeft, 0, rect.Width() - m_nLeft * 2, rect.Height(),&mdc, 0, 0, rect.Width(), rect.Height(), SRCCOPY);rt = rect;if (m_nDir > 0){if (m_nLeft < rect.Width() / 2){rt.left = 0;rt.right = m_nLeft;dc.FillSolidRect(rt, GetSysColor(COLOR_3DFACE));rt.right = rect.right;rt.left = rect.Width() - m_nLeft;dc.FillSolidRect(rt, GetSysColor(COLOR_3DFACE));}}else{if (m_nLeft > rect.Width() / 2){int nWidth = rect.Width() - m_nLeft;rt.right = rect.right;rt.left = rt.right - nWidth;dc.FillSolidRect(rt, GetSysColor(COLOR_3DFACE));rt.right = nWidth;rt.left = 0;dc.FillSolidRect(rt, GetSysColor(COLOR_3DFACE));}}TRACE("m_nLeft=%d,Width=%d\n", m_nLeft, rect.Width()); }22.3 梯形分頁
總結(jié)
以上是生活随笔為你收集整理的【MFC系列-第22天】GDI算法实战——过渡色的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MFC系列-第21天】GDI算法实战—
- 下一篇: 【MFC系列-第23天】CMemoryD