【MFC系列-第24天】梯形分页和蝴蝶QQ宠物的实现
生活随笔
收集整理的這篇文章主要介紹了
【MFC系列-第24天】梯形分页和蝴蝶QQ宠物的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CDC(HDC)繪圖類:
五大GDI對象類:CPen,CBrush,CFont,CBitmap,CRgn
24.1 梯形分頁的雙緩沖改進和尺寸自適應
24.2 蝴蝶跟隨鼠標點擊運動
class CHitFlyDlg : public CDialogEx {CMemoryDC m_dc;//緩沖enum { PAGE_COUNT = 7 };CMemoryDC m_dcBack;CMemoryDC m_dcFly[PAGE_COUNT];int m_nIndex;CPoint m_pos,m_des;//中心點與目標public:CHitFlyDlg(CWnd* pParent = NULL); // 標準構造函數 protected:HICON m_hIcon;virtual BOOL OnInitDialog();afx_msg void OnPaint(); public:afx_msg void OnTimer(UINT_PTR nIDEvent);afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg void OnNcPaint();afx_msg void OnLButtonDown(UINT nFlags, CPoint point);void rePosition(); }; BOOL CHitFlyDlg::OnInitDialog() {CDialogEx::OnInitDialog();int cx = GetSystemMetrics(SM_CXSCREEN);int cy = GetSystemMetrics(SM_CYSCREEN);m_pos.SetPoint(cx / 2, cy / 2);m_des = m_pos;MoveWindow(0, 0, cx, cy, FALSE);m_dc.Create(cx, cy);//緩沖dcm_dcBack.LoadBitmap(_T("./images/back.bmp"));//背景dcint i = -1;CString str;while (++i<_countof(m_dcFly)){str.Format(_T("./images/%03d.bmp"), i + 1);m_dcFly[i].LoadBitmap(str);//7張蝴蝶dc}SetTimer(1, 20, NULL);SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標return TRUE; // 除非將焦點設置到控件,否則返回 TRUE } void CHitFlyDlg::OnPaint() {CPaintDC dc(this); // 用于繪制的設備上下文CRect rect;GetClientRect(rect);//dc.BitBlt(0, 0, m_dcBack.GetWidth(), m_dcBack.GetHeight(), &m_dcBack, 0, 0, SRCCOPY);m_dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &m_dcBack, 0, 0, m_dcBack.GetWidth(), m_dcBack.GetHeight(), SRCCOPY);if (m_pos != m_des)rePosition();CPoint point = m_pos-CPoint(m_dcFly->GetWidth() / 2, m_dcFly->GetHeight() / 2);m_dcFly[m_nIndex].BitTrans(point.x,point.y, m_dcFly->GetWidth(), m_dcFly->GetHeight(), &m_dc, 0, 0, 0);dc.BitBlt(0, 0, rect.Width(), rect.Height(), &m_dc, 0, 0, SRCCOPY);if (++m_nIndex > 6)m_nIndex = 0; } void CHitFlyDlg::OnTimer(UINT_PTR nIDEvent) {Invalidate(FALSE);CDialogEx::OnTimer(nIDEvent); }BOOL CHitFlyDlg::OnEraseBkgnd(CDC* pDC) {return TRUE; }void CHitFlyDlg::OnNcPaint() {}void CHitFlyDlg::OnLButtonDown(UINT nFlags, CPoint point) {m_des = point;CDialogEx::OnLButtonDown(nFlags, point); }void CHitFlyDlg::rePosition() {int cx = m_des.x - m_pos.x;int cy = m_des.y - m_pos.y;int r = sqrt(cx*cx + cy*cy);if (r < 5)m_pos = m_des;else{m_pos.x += cx * 5 / r;m_pos.y += cy * 5 / r;} }24.3 QQ寵物靜止版
void MakeRgn(CRgn& r, COLORREF clTrans)//假設背景顏色是:0,0,0{if (r.GetSafeHandle())r.DeleteObject();r.CreateRectRgn(0, 0, 0, 0);//空RGNint x=0, y=0;int cx = m_size.cx,cy=m_size.cy;while (y < cy){x = 0;while (x < cx){if (GetPixel(x, y) != clTrans){CRgn r1;//一個像素大小的RGNr1.CreateRectRgn(x, y, x + 1, y + 1);//面積為1x1的RGNr.CombineRgn(&r, &r1,RGN_OR);}++x;}++y;}} BOOL CQQDlg::OnInitDialog() {CDialogEx::OnInitDialog();m_dcFly.LoadBitmap(_T("./images/001.bmp"));MoveWindow(500, 500, m_dcFly.GetWidth(), m_dcFly.GetHeight(), FALSE);CRgn r;m_dcFly.MakeRgn(r, 0);this->SetWindowRgn(r,FALSE);SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標return TRUE; // 除非將焦點設置到控件,否則返回 TRUE } void CQQDlg::OnPaint() {CPaintDC dc(this); // 用于繪制的設備上下文dc.BitBlt(0, 0, m_dcFly.GetWidth(), m_dcFly.GetHeight(), &m_dcFly, 0, 0, SRCCOPY);/*CRect rect;GetClientRect(rect);dc.FillSolidRect(rect, RGB(255, 0, 0));*/ } HCURSOR CQQDlg::OnQueryDragIcon() {return static_cast<HCURSOR>(m_hIcon); }BOOL CQQDlg::OnEraseBkgnd(CDC* pDC) {return TRUE; } void CQQDlg::OnNcPaint() {}LRESULT CQQDlg::OnNcHitTest(CPoint point) {return HTCAPTION; }24.4 QQ寵物動畫版
class CQQDlg : public CDialogEx { // 構造enum {FLY_COUNT=7};CMemoryDC m_dcFly[FLY_COUNT];CRgn m_rs[FLY_COUNT];int m_nIndex;//當前第幾幀BOOL CQQDlg::OnInitDialog() {CDialogEx::OnInitDialog();CString str;int i = 0;while (i < _countof(m_dcFly)){str.Format(_T("./images/%03d.bmp"),i+1);m_dcFly[i].LoadBitmap(str);m_dcFly[i].MakeRgn(m_rs[i], 0);++i;}int x = GetSystemMetrics(SM_CXSCREEN), y = GetSystemMetrics(SM_CYSCREEN);MoveWindow(x/2, y/2, m_dcFly->GetWidth(), m_dcFly->GetHeight(), FALSE);CRgn r;r.CreateRectRgn(0, 0, 0, 0); //必須得先創建一個空白的進行初始化r.CopyRgn(m_rs);//m_rs 等價于 &m_rs[0]this->SetWindowRgn(r,FALSE); //CRgn對象只能設置一次,設置后失效,因此先復制到新對象r中SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標SetTimer(1, 16, NULL);// TODO: 在此添加額外的初始化代碼return TRUE; // 除非將焦點設置到控件,否則返回 TRUE } void CQQDlg::OnPaint() {CPaintDC dc(this); // 用于繪制的設備上下文//&m_dcFly[m_nIndex]等價于m_dcFly+m_nIndexdc.BitBlt(0, 0, m_dcFly->GetWidth(), m_dcFly->GetHeight(), m_dcFly+m_nIndex, 0, 0, SRCCOPY);/*CRect rect;GetClientRect(rect);dc.FillSolidRect(rect, RGB(255, 0, 0));*/ } HCURSOR CQQDlg::OnQueryDragIcon() {return static_cast<HCURSOR>(m_hIcon); }BOOL CQQDlg::OnEraseBkgnd(CDC* pDC) {// TODO: 在此添加消息處理程序代碼和/或調用默認值return TRUE; }void CQQDlg::OnNcPaint() {}LRESULT CQQDlg::OnNcHitTest(CPoint point) {// TODO: 在此添加消息處理程序代碼和/或調用默認值return HTCAPTION ; }void CQQDlg::OnTimer(UINT_PTR nIDEvent) {CRgn r;r.CreateRectRgn(0, 0, 0, 0);r.CopyRgn(&m_rs[m_nIndex]);SetWindowRgn(r, TRUE);//Invalidate(FALSE);if (++m_nIndex > 6)m_nIndex = 0;CDialogEx::OnTimer(nIDEvent); }24.5 單文檔應用程序——繪圖軟件
24.5.1 矢量圖和非矢量圖:
矢量圖,也稱為面向對象的圖像或繪圖圖像,在數學上定義為一系列由線連接的點。
矢量文件中的圖形元素稱為對象。每個對象都是一個自成一體的實體,它具有顏色、形狀、輪廓、大小和屏幕位置等屬性。
矢量圖是根據幾何特性來繪制圖形,矢量可以是一個點或一條線,矢量圖只能靠軟件生成,文件占用內在空間較小,因為這種類型的圖像文件包含獨立的分離圖像,可以自由無限制的重新組合。
它的特點是放大后圖像不會失真,和分辨率無關,適用于圖形設計、文字設計和一些標志設計、版式設計等。
矢量圖軟件包括:
corel draw adobe flash(HTM5取代)非矢量圖形軟件包括:
adobe Photoshop。 windows畫筆24.5.2 圖形軟件的設計:
a)每個層可是圓形、矩形、圓角矩形、直線、鉛筆畫等等;
b)如果是圓形或矩形層,就需要記錄矩形數據(RECT);
c)如果是直線層,就需要記錄兩個點;
d)如果是鉛筆話,就需要記錄動態多個點;
總結
以上是生活随笔為你收集整理的【MFC系列-第24天】梯形分页和蝴蝶QQ宠物的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信下载电脑版官方下载2015(微信电脑
- 下一篇: uc浏览器极速版如何进入阅读模式