自绘仿WIN8窗口界面(源码+视频讲解)

void998 2015-05-05 12:03:00
首先放下运行出来的效果图,这是在WIN7系统下运行的效果图:



大家可以看到,窗口的样式、标题栏、边框等都和WIN8下的窗口基本一样
该窗口使用的是MFC和GDI自绘的,通过在OnEraseBkgnd(擦除背景)中对窗口的
标题栏、边框、客户区等进行了自绘。


主要的功能代码都在如下函数中:
OnNcHitTest - 用于标题栏响应
OnEraseBkgnd -【重要】 该函数中用于实现了所有的自绘代码


OnEraseBkgnd 代码段:

BOOL CWin8WindowDemoDlg::OnEraseBkgnd(CDC* pDC)
{
CRect rcWnd;
this->GetClientRect(&rcWnd);

/*
如果我们将整个标题栏和边框都当为一个纯色来看待的话
其实整个界面就相当于是这样:
一个全纯色的界面,在上面放置了一快白色的区域
*/

//1 - 把整个界面都绘制为底色
//pDC->FillRect(rcWnd, &CBrush(0x8FC5ED)); //桔色
pDC->FillRect(rcWnd, &CBrush(RGB(96,174,210))); //蓝色

//2 - 将除掉标题栏,边框部分的余下的范围,全部用白色填充
CRect rc;
rc.left = BORDER_WIDTH;
rc.top = m_rcCaption.Height();
rc.right = rcWnd.Width() - BORDER_WIDTH;
rc.bottom = rcWnd.Height() - BORDER_WIDTH;
pDC->FillRect(rc, &CBrush(0xF0F0F0)); //白色

//绘制图标
::DrawIconEx(pDC->m_hDC, BORDER_WIDTH, BORDER_WIDTH
, m_hIcon, 16, 16, NULL, NULL, DI_NORMAL);

//绘制标题内容
LOGFONT lf;
::ZeroMemory(&lf, sizeof(lf));
_stprintf(lf.lfFaceName, _T("微软雅黑"));

CFont font;
font.CreatePointFontIndirect(&lf);
CFont* pFontOld = (CFont*)pDC->SelectObject(&font); //这里将选入前的字体指针存下来
pDC->SetBkMode(TRANSPARENT); //一定要记得设置这个,否则会有白色的底色
CString sCaption;
this->GetWindowText(sCaption);
pDC->DrawText(sCaption, m_rcCaption, DT_CENTER|DT_VCENTER|DT_SINGLELINE);

//这里我们在窗口中间再绘制一段话,看看效果呢
pDC->DrawText(_T("MFC+GDI打造仿WIN8自绘窗口")
, -1
, rcWnd
, DT_CENTER|DT_VCENTER|DT_SINGLELINE);

pDC->SelectObject(pFontOld); //将之前的字体给选回去
font.DeleteObject();

return TRUE;
}


代码本身不复杂,很简单,量也很少,非常适合初学者学习入门用!
大家有不懂的地方,可以在帖子后留言,或者加群197778914,我会尽量为大家解答!谢谢~~~


最后,附上源码地址:http://download.csdn.net/detail/void998/8661779
...全文
100 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧