MFC 自绘窗口非客户区

前段时间一直在想怎么样能让窗口变得更漂亮一点,更加吸引人呢?在网上也看到了不少高手们的做法,但对于我这种不喜欢太复杂的人来说,我不是很喜欢那样写代码,GetSystemMetrics函数来得到各个边框的长度或宽度。。。。没几下,我的头就晕了,在查了许多资料以及实验后,我终于找到了一种比较简单的美化窗口的方法,现在就拿出来献丑一下,觉得不好的就请跳过去吧~~

MFC 自绘窗口非客户区 - KingEmbed - 鸣人

 

大家请看这张图:其实这张图已经很直观的表达了窗口内部的布局,有了这张图你觉得美化窗口还难吗?想怎么好看就可以怎么好看….<注:这张图是从网上搜索得来,十分感谢此作者,为我们提供了方便,在这里我只是拿这张图做一下参考>

//取得标题栏的位置

rtTitle.left = 6;

rtTitle.top = 0;

rtTitle.right = rtWnd.right - rtWnd.left - 6;

rtTitle.bottom = 30;

 

//计算最小化按钮的位置

m_rtButtMin.left = rtWnd.right - rtWnd.left - 66;

m_rtButtMin.top = 0;

m_rtButtMin.right = rtWnd.right - rtWnd.left - 46;

m_rtButtMin.bottom = 30;

 

//计算最大化按钮的位置

m_rtButtMax.left = rtWnd.right - rtWnd.left - 46;

m_rtButtMax.top = 0;

m_rtButtMax.right = rtWnd.right - rtWnd.left - 26;

m_rtButtMax.bottom = 30;

 

//计算关闭按钮的位置

m_rtButtExit.left = rtWnd.right - rtWnd.left - 26;

m_rtButtExit.top = 0;

m_rtButtExit.right = rtWnd.right - rtWnd.left - 6;

m_rtButtExit.bottom = 30;

复制代码有了它们的位置美化它们就容易了:

//准备画图

CBitmap* pBitmap = new CBitmap;

BITMAP BmpInfo;

CBitmap* pOldBitmap;

CDC* pDisplayMemDC = new CDC;

pDisplayMemDC->CreateCompatibleDC(pDC);

 

 

//重画标题栏

pBitmap->LoadBitmap(IDB_TITLE_TOP);

pBitmap->GetBitmap(&BmpInfo);

pOldBitmap = (CBitmap*)pDisplayMemDC->SelectObject(pBitmap);

pDC->StretchBlt(6, 0, rtWnd.right - rtWnd.left - 12,

        30,

        pDisplayMemDC, 0, 0,

        BmpInfo.bmWidth,

        BmpInfo.bmHeight, SRCCOPY);

pDisplayMemDC->SelectObject(pOldBitmap);

pBitmap->DeleteObject();

 

//写上标题

WriteCaption(m_CaptionColor, m_Caption);

 

//重画两个标题栏两边的小边框

pBitmap->LoadBitmap(IDB_DOWN);

pBitmap->GetBitmap(&BmpInfo);

pOldBitmap = (CBitmap*)pDisplayMemDC->SelectObject(pBitmap);

//左边的

pDC->StretchBlt(0, 0, 6, 30,

        pDisplayMemDC, 0, 0,

        BmpInfo.bmWidth,

        BmpInfo.bmHeight,

        SRCCOPY);

//右边的

pDC->StretchBlt(rtWnd.right - rtWnd.left - 6, 0, 6, 30,

        pDisplayMemDC, 0, 0,

        BmpInfo.bmWidth,

        BmpInfo.bmHeight,

        SRCCOPY);

pDisplayMemDC->SelectObject(pOldBitmap);

pBitmap->DeleteObject();

 

//重画功能button

 

pBitmap->LoadBitmap(IDB_NORMAL);

pBitmap->GetBitmap(&BmpInfo);

pOldBitmap = (CBitmap*)pDisplayMemDC->SelectObject(pBitmap);

pDC->StretchBlt(m_rtButtMin.left,

        m_rtButtMin.top + 4,

        60, 21, pDisplayMemDC,

        0, 0, BmpInfo.bmWidth,

        BmpInfo.bmHeight, SRCCOPY);

pDisplayMemDC->SelectObject(pOldBitmap);

pBitmap->DeleteObject();

这样,我们想在窗口的什么位置上贴什么我们就可以很容易的做到。如果大家觉得这样比较容易的话,那我也就满意了。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值