zoukankan      html  css  js  c++  java
  • 【转】双缓冲讲解及界面贴图

    ---------------------------------------------------------------------------
    VC 驿站
    WwW.CcTry.CoM
    多抽出一分钟时间来学习,让你的生命更加精彩!
    C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
    动画教程只是起到技术交流的作用,请大家不用利用此方法做非法用途.
    由此动画造成的任何后果和动画作者及本站无关.
    ----------------------------------------------------------------------------------------
    大家好,我是Syc
    今天给大家做的教程是:
    vc++高级班之窗口篇[14]---双缓冲讲解及界面贴图
    ----------------------------------------------------------------------------------------
    ①、原理:双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,
    然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。
    采取这种方法可以提高绘图速度,极大的改善绘图效果。
    ===================================================
    ②、具体实现:
    在 Timer 定时器中添加代码:
    //1. 普通绘图方式:
    CDC *pDC = GetDC();
    pDC->FillSolidRect(100, 50, 200, 100, RGB(100, 100, 100));     // 填充一个矩形区域
    
    pDC->SetTextColor(RGB(0, 0, 0));                            // 设置文本颜色为黑色
    pDC->SetBkMode(TRANSPARENT);                                // 设置背景为透明
    pDC->TextOut(110, 60, _T("ABCDEFGHIJKLMN"));
    pDC->TextOut(110, 80, _T("ABCDEFGHIJKLMN"));
    pDC->TextOut(110, 100, _T("ABCDEFGHIJKLMN"));
    pDC->TextOut(110, 120, _T("ABCDEFGHIJKLMN"));
    
    ReleaseDC(pDC);
    
    //2. 双缓冲绘图方式:
    CDC *pDC = GetDC();
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);                                // 创建一个内存DC
    
    CBitmap bmp;
    bmp.CreateCompatibleBitmap(pDC, 200, 100);                    // 创建画板,200宽,100高
    memDC.SelectObject(bmp);
    
    memDC.FillSolidRect(0, 0, 200, 100, RGB(100, 100, 100));
    memDC.SetTextColor(RGB(0, 0, 0));
    memDC.SetBkMode(TRANSPARENT);
    memDC.TextOut(10, 10, _T("ABCDEFGHIJKLMN"));
    memDC.TextOut(10, 30, _T("ABCDEFGHIJKLMN"));
    memDC.TextOut(10, 50, _T("ABCDEFGHIJKLMN"));
    memDC.TextOut(10, 70, _T("ABCDEFGHIJKLMN"));
    
    pDC->BitBlt(100, 50, 200, 100, &memDC, 0, 0, SRCCOPY);        // 将内存DC的内容拷贝至屏幕DC
    
    
    bmp.DeleteObject();
    memDC.DeleteDC();
    ReleaseDC(pDC);
    ===================================================
    ③、对话框贴图 -> 背景贴图:
    1、将对话框的 Title Bar 属性置成 False;
    2、将对话框的 Border 属性置成 Thin
    3、插入背景图片资源,ID为:IDB_BK_IMG
    响应 WM_ERASEBKGND 消息进行图片的加载及背景的绘制:
    BOOL CDrawTestDlg::OnEraseBkgnd(CDC* pDC)
    {
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);
    
        BITMAP bmp;
        CBitmap bkImg;
        bkImg.LoadBitmap(IDB_BK_IMG);
        bkImg.GetBitmap(&bmp);                            // 获取图片信息
        memDC.SelectObject(&bkImg);
    
        //SetWindowPos(NULL, 0, 0, bmp.bmWidth, bmp.bmHeight, SWP_NOMOVE|SWP_NOZORDER);
        CRect rect;
        GetClientRect(&rect);
        // 将内存DC大小拉伸到主对话框大小进行贴图
        pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
    
        memDC.DeleteDC();
    
        SetWindowText(_T("金山毒霸专杀工具"));
        return TRUE;
    
        return CDialog::OnEraseBkgnd(pDC);
    }
    ===================================================
    ④、关闭按钮位图的设置:使用 CBitmapButton 类
    1、前提:将按钮的 Owner Draw 属性置成 True;
    2、绑定 CBitmapButton 类型的控件类型变量;
    3、插入图片资源以及初始化代码:
    m_closeBtn.LoadBitmaps(IDB_CLOSE_NORMAL, IDB_CLOSE_DOWN);
    m_homeBtn.LoadBitmaps(IDB_HOME_NORMAL, IDB_HOME_DOWN);
    m_browseBtn.LoadBitmaps(IDB_BROWSE_NORMAL, IDB_BROWSE_DOWN);
    m_startBtn.LoadBitmaps(IDB_START_NORMAL, IDB_START_DOWN);
    
    响应函数的添加:
    ShellExecute(this->m_hWnd, _T("open"), _T("http://www.cctry.com"), _T(""), _T(""), SW_SHOW);
    
    //Start按钮
    void CDrawTestDlg::OnBnClickedStartBtn()
    {
        static BOOL m_bStart = TRUE;
        if(m_bStart)
        {
            m_startBtn.LoadBitmaps(IDB_OFF_NORMAL, IDB_OFF_DOWN);
            m_bStart = FALSE;
            m_startBtn.RedrawWindow();
        } else {
            m_startBtn.LoadBitmaps(IDB_START_NORMAL, IDB_START_DOWN);
            m_bStart = TRUE;
            m_startBtn.RedrawWindow();
        }
    }
    ===================================================
    ⑤、其他控件的添加:
    CListCtrl *pListCtrl = (CListCtrl *)GetDlgItem(IDC_LIST1);
    //DWORD dwStyle = pListCtrl->GetExtendedStyle();
    //dwStyle |= LVS_EX_FLATSB;
    //pListCtrl->SetExtendedStyle(dwStyle);
    
    pListCtrl->InsertColumn(0, _T("文件路径"), LVCFMT_LEFT, 380);
    pListCtrl->InsertColumn(1, _T("扫描结果"), LVCFMT_LEFT, 100);
    pListCtrl->InsertColumn(2, _T("状态"), LVCFMT_LEFT, 80);
    ===================================================
    ⑥、响应 WM_CTLCOLOR 消息,使 Static 静态文本框控件的背景置成透明:
    HBRUSH CDrawTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
        // TODO:  Change any attributes of the DC here
        if ( nCtlColor == CTLCOLOR_STATIC ) {
            pDC->SetBkMode(TRANSPARENT);
            return   (HBRUSH)::GetStockObject(NULL_BRUSH);
        }
    
        // TODO:  Return a different brush if the default is not desired
        return hbr;
    }
    ===================================================
    ⑦、响应 WM_NCHITTEST 消息,模拟窗口拖动:
    LRESULT CDrawTestDlg::OnNcHitTest(CPoint point)
    {
        // TODO: Add your message handler code here and/or call default
        CRect rect;
        GetClientRect(&rect);
        ClientToScreen(&rect);
        return rect.PtInRect(point) ? HTCAPTION : CDialog::OnNcHitTest(point);
    
        return CDialog::OnNcHitTest(point);
    }
    ===================================================
    ⑧、
    ===================================================
    ⑨、
    ===================================================
    ⑩、
    ===================================================
    ※※※ 小作业:将窗口左下角的两排文字改变颜色!
    ------------------------------------- End -------------------------------------------------
  • 相关阅读:
    计算机网络-URL/URI/URN
    计算机网络-应用层之HTTP协议
    计算机网络-传输层-TCP之三次握手/四次握手
    requests之一:HTTP请求 状态码
    python排序中sort()与sorted()的用法与区别
    列表(list)之三 -如何较为均匀的将任意字符串按指定组数分组,方差最少
    列表(list)之二 -运用篇 -快速生成规律性列表
    DES加密解密
    c# json转Dictionary字典
    导出Excel事例
  • 原文地址:https://www.cnblogs.com/Lthis/p/4598286.html
Copyright © 2011-2022 走看看