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