【转】双缓冲讲解及界面贴图

---------------------------------------------------------------------------
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 -------------------------------------------------

 

posted @ 2015-06-24 17:44  Lthis  阅读(506)  评论(0编辑  收藏  举报