VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 250|回复: 0

VC++高级班之窗口篇-[14]双缓冲讲解及界面贴图

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-3-6 01:23:22 | 显示全部楼层 |阅读模式
------------------------------------------ Begin ----------------------------------------
①、原理:
双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,
然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。
采取这种方法可以提高绘图速度,极大的改善绘图效果。
===================================================
②、具体实现:
在 Timer 定时器中添加代码:
  1. //1. 普通绘图方式:
  2. CDC *pDC = GetDC();
  3. pDC->FillSolidRect(100, 50, 200, 100, RGB(100, 100, 100));

  4. pDC->SetTextColor(RGB(0, 0, 0));
  5. pDC->SetBkMode(TRANSPARENT);
  6. pDC->TextOut(110, 60, _T("ABCDEFGHIJKLMN"));
  7. pDC->TextOut(110, 80, _T("ABCDEFGHIJKLMN"));
  8. pDC->TextOut(110, 100, _T("ABCDEFGHIJKLMN"));
  9. pDC->TextOut(110, 120, _T("ABCDEFGHIJKLMN"));

  10. ReleaseDC(pDC);
复制代码

  1. //2. 双缓冲绘图方式:
  2. CDC *pDC = GetDC();
  3. CDC memDC;
  4. memDC.CreateCompatibleDC(pDC);

  5. CBitmap bmp;
  6. bmp.CreateCompatibleBitmap(pDC, 200, 100);
  7. memDC.SelectObject(bmp);

  8. memDC.FillSolidRect(0, 0, 200, 100, RGB(100, 100, 100));
  9. memDC.SetTextColor(RGB(0, 0, 0));
  10. memDC.SetBkMode(TRANSPARENT);
  11. memDC.TextOut(10, 10, _T("ABCDEFGHIJKLMN"));
  12. memDC.TextOut(10, 30, _T("ABCDEFGHIJKLMN"));
  13. memDC.TextOut(10, 50, _T("ABCDEFGHIJKLMN"));
  14. memDC.TextOut(10, 70, _T("ABCDEFGHIJKLMN"));

  15. pDC->BitBlt(100, 50, 200, 100, &memDC, 0, 0, SRCCOPY);

  16. bmp.DeleteObject();
  17. memDC.DeleteDC();
  18. ReleaseDC(pDC);
复制代码

===================================================
③、对话框贴图 -> 背景贴图:
1、将对话框的 Title Bar 属性置成 False;
2、将对话框的 Border 属性置成 Thin
3、插入背景图片资源,ID为:IDB_BK_IMG
响应 WM_ERASEBKGND 消息进行图片的加载及背景的绘制:
  1. BOOL CDrawTestDlg::OnEraseBkgnd(CDC* pDC)
  2. {
  3.         CDC memDC;
  4.         memDC.CreateCompatibleDC(pDC);

  5.         BITMAP bmp;
  6.         CBitmap bkImg;
  7.         bkImg.LoadBitmap(IDB_BK_IMG);
  8.         bkImg.GetBitmap(&bmp);
  9.         memDC.SelectObject(&bkImg);

  10.         //SetWindowPos(NULL, 0, 0, bmp.bmWidth, bmp.bmHeight, SWP_NOMOVE|SWP_NOZORDER);
  11.         CRect rect;
  12.         GetClientRect(&rect);
  13.         pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);

  14.         memDC.DeleteDC();

  15.         SetWindowText(_T("金山毒霸专杀工具"));
  16.         return TRUE;

  17.         return CDialog::OnEraseBkgnd(pDC);
  18. }
复制代码

===================================================
④、关闭按钮位图的设置:使用 CBitmapButton 类
1、前提:将按钮的 Owner Draw 属性置成 True;
2、绑定 CBitmapButton 类型的控件类型变量;
3、插入图片资源以及初始化代码:
  1. m_closeBtn.LoadBitmaps(IDB_CLOSE_NORMAL, IDB_CLOSE_DOWN);
  2. m_homeBtn.LoadBitmaps(IDB_HOME_NORMAL, IDB_HOME_DOWN);
  3. m_browseBtn.LoadBitmaps(IDB_BROWSE_NORMAL, IDB_BROWSE_DOWN);
  4. m_startBtn.LoadBitmaps(IDB_START_NORMAL, IDB_START_DOWN);
复制代码


响应函数的添加:
  1. ShellExecute(this->m_hWnd, _T("open"), _T("http://www.cctry.com"), _T(""), _T(""), SW_SHOW);
复制代码

  1. //Start按钮
  2. void CDrawTestDlg::OnBnClickedStartBtn()
  3. {
  4.         static BOOL m_bStart = TRUE;
  5.         if(m_bStart)
  6.         {
  7.                 m_startBtn.LoadBitmaps(IDB_OFF_NORMAL, IDB_OFF_DOWN);
  8.                 m_bStart = FALSE;
  9.                 m_startBtn.RedrawWindow();
  10.         } else {
  11.                 m_startBtn.LoadBitmaps(IDB_START_NORMAL, IDB_START_DOWN);
  12.                 m_bStart = TRUE;
  13.                 m_startBtn.RedrawWindow();
  14.         }
  15. }
复制代码

===================================================
⑤、其他控件的添加:
  1. CListCtrl *pListCtrl = (CListCtrl *)GetDlgItem(IDC_LIST1);
  2. //DWORD dwStyle = pListCtrl->GetExtendedStyle();
  3. //dwStyle |= LVS_EX_FLATSB;
  4. //pListCtrl->SetExtendedStyle(dwStyle);

  5. pListCtrl->InsertColumn(0, _T("文件路径"), LVCFMT_LEFT, 380);
  6. pListCtrl->InsertColumn(1, _T("扫描结果"), LVCFMT_LEFT, 100);
  7. pListCtrl->InsertColumn(2, _T("状态"), LVCFMT_LEFT, 80);
复制代码

===================================================
⑥、响应 WM_CTLCOLOR 消息,使 Static 静态文本框控件的背景置成透明:
  1. HBRUSH CDrawTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  2. {
  3.         HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

  4.         // TODO:  Change any attributes of the DC here
  5.         if ( nCtlColor == CTLCOLOR_STATIC ) {
  6.                 pDC->SetBkMode(TRANSPARENT);
  7.                 return   (HBRUSH)::GetStockObject(NULL_BRUSH);
  8.         }

  9.         // TODO:  Return a different brush if the default is not desired
  10.         return hbr;
  11. }
复制代码

===================================================
⑦、响应 WM_NCHITTEST 消息,模拟窗口拖动:
  1. LRESULT CDrawTestDlg::OnNcHitTest(CPoint point)
  2. {
  3.         // TODO: Add your message handler code here and/or call default
  4.         CRect rect;
  5.         GetClientRect(&rect);
  6.         ClientToScreen(&rect);
  7.         return rect.PtInRect(point) ? HTCAPTION : CDialog::OnNcHitTest(point);

  8.         return CDialog::OnNcHitTest(point);
  9. }
复制代码

===================================================
※※※ 小作业:将窗口左下角的两排文字改变颜色!
------------------------------------- End -------------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
教程介绍及详情请见:http://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:http://www.cctry.com/static/vip/index.html




上一篇:VC++高级班之窗口篇-[13]打造自己的图片浏览器
下一篇:VC++高级班之窗口篇-[15]实现不规则半透明的窗口

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-8-17 05:52

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表